-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuild.sbt
48 lines (37 loc) · 1.79 KB
/
build.sbt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import scala.sys.process.Process
ThisBuild / version := "1"
ThisBuild / scalaVersion := "3.3.1"
libraryDependencies += "org.antlr" % "antlr4" % "4.13.1"
libraryDependencies += "org.apache.directory.studio" % "org.apache.commons.io" % "2.4"
val languageName = "Latte"
def generatedGrammarFiles(baseDirectoryFile: File): Seq[File] = {
Seq(".interp", ".tokens", "BaseVisitor.java", "Lexer.java", "Lexer.interp", "Lexer.tokens", "Parser.java", "Visitor.java").map {
suffix => baseDirectoryFile / "src" / "main" / "java" / "grammar" / (languageName + suffix)
}
}
lazy val root = (project in file("."))
.settings(
name := s"${languageName}C",
scalacOptions ++= Seq("-deprecation", "-explain", "-print-lines", "-new-syntax"),
// Generates the lexer and parser.
Compile / sourceGenerators += Def.task {
val depsClasspath = (Compile / dependencyClasspath).value.map(_.data).mkString(".:", ":", "")
val cachedFunction = FileFunction.cached(
streams.value.cacheDirectory / "grammar"
) { (in: Set[File]) =>
val grammarPath = in.head.toPath
print("Generating grammar files... ")
Process(Seq("java", "-cp", depsClasspath, "org.antlr.v4.Tool", grammarPath.toString, "-no-listener", "-visitor", "-package", "grammar", "-o", s"${baseDirectory.value}/src/main/java/grammar")).!
println("Done.")
generatedGrammarFiles(baseDirectory.value).filter(_.toString.endsWith(".java")).toSet
}
val inputFile = file(s"src/main/resources/$languageName.g4")
cachedFunction(Set(inputFile)).toSeq
},
Compile / sourceGenerators += Def.task {
val depsClasspath = (Compile / dependencyClasspath).value.map(_.data).mkString(".:", ":", "")
IO.write(Path("dependencies.cp").asFile, depsClasspath)
Seq()
},
cleanFiles ++= generatedGrammarFiles(baseDirectory.value)
)