我正在尝试在Scala中创建词法分析器。我正在尝试做这样的事情
def lex(s: String): Expr = s match {
case num(a) => Number(a.toDouble)
case mul(a, b) => Mul(Number(a.toDouble), Number(b.toDouble))
case div(a, b) => Div(Number(a.toDouble), Number(b.toDouble))
case add(a, b) => Add(Number(a.toDouble), Number(b.toDouble))
case sub(a, b) => Sub(Number(a.toDouble), Number(b.toDouble))
case _ => Number(0)
}
其中num,mul,div,add,sub的定义如下:
val num: Regex = "[0-9]+".r
val add: Regex = "[0-9]+\\s*\\+\\s*[0-9]+".r
val sub: Regex = "[0-9]+\\s*\\-\\s*[0-9]+".r
val div: Regex = "[0-9]+\\s*\\/\\s*[0-9]+".r
val mul: Regex = "[0-9]+\\s*\\*\\s*[0-9]+".r
尝试对任何表达式(lex("1 + 2")
)进行lex处理时,结果始终Number(0.0)
是预期的Add(Number(1), Number(2))
Im而不是预期的Im不确定在哪里出错了...
您需要指定要提取的组。
val num = "([0-9]+)".r
val add = "([0-9]+)\\s*\\+\\s*([0-9]+)".r
val sub = "([0-9]+)\\s*\\-\\s*([0-9]+)".r
val div = "([0-9]+)\\s*\\/\\s*([0-9]+)".r
val mul = "([0-9]+)\\s*\\*\\s*([0-9]+)".r
每个提取的变量都需要一对括号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句