有没有办法使用 Scala 编译器对布尔表达式进行类型检查?
Is there a way to typecheck boolean expressions using the Scala compiler?
我目前正在使用 Scala 解析器组合器构建解析器。解析器必须接受布尔表达式,目前我正在手动进行类型检查和评估。但是,我想扩展此特定功能并能够接受需要更多手动工作的更复杂的布尔表达式。我想知道是否可以直接使用 Scala 编译器来实现类型检查,我将向其传递我想要进行类型检查的特定表达式和每个特定变量的类型。下面是我的意思的一个例子:
假设我有一个布尔表达式:age > 18
。连同知道变量 age
是 Int
类型的映射。我希望能够(以任何格式)将 age > 18
和类型映射传递给 Scala 编译器,它会 return 无论是否对布尔表达式进行类型检查。
感谢 u/aepurniet from this Reddit post。
该语句必须在带有一些值定义的语句前加上前缀,然后进行解析和类型检查。可以从 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)
}
我目前正在使用 Scala 解析器组合器构建解析器。解析器必须接受布尔表达式,目前我正在手动进行类型检查和评估。但是,我想扩展此特定功能并能够接受需要更多手动工作的更复杂的布尔表达式。我想知道是否可以直接使用 Scala 编译器来实现类型检查,我将向其传递我想要进行类型检查的特定表达式和每个特定变量的类型。下面是我的意思的一个例子:
假设我有一个布尔表达式:age > 18
。连同知道变量 age
是 Int
类型的映射。我希望能够(以任何格式)将 age > 18
和类型映射传递给 Scala 编译器,它会 return 无论是否对布尔表达式进行类型检查。
感谢 u/aepurniet from this Reddit post。
该语句必须在带有一些值定义的语句前加上前缀,然后进行解析和类型检查。可以从 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)
}