我目前正在使用Scala解析器组合器构建解析器。解析器必须接受布尔表达式,此刻我正在手动进行类型检查和评估。但是,我想扩展此特定功能,并能够接受更复杂的布尔表达式,这需要更多的手动工作。我想知道是否可以直接使用Scala编译器来实现类型检查,我可以将要进行类型检查的特定表达式以及每个特定变量的类型传递给该编译器。以下是我的意思的示例:
假设我有一个布尔表达式:age > 18
。知道变量age
的类型为Int
的映射。我希望能够(以任何格式)将age > 18
和类型映射传递到Scala编译器,并且它将返回是否将类型检查为布尔表达式。
来自u/aepurniet Reddit帖子的this礼貌。
该语句必须在带有某些值定义的语句之前加上前缀,然后解析然后键入checked。表达式的结果类型可以从checked.tpe
中进行检查。
def main(args: Array[String]): Unit = {
import scala.reflect.runtime._
import scala.tools.reflect.ToolBox
val toolbox = currentMirror.mkToolBox()
val expr = "age > 18"
val eval = s"""
|val age: Int = ???
|$expr
|""".stripMargin
val tree = toolbox.parse(eval)
val checked = toolbox.typecheck(tree)
println(checked.tpe)
}