我试图在我从书中复制的简单语法上使用 Scala 中的解析器组合器。当我运行以下代码时,它会在第一个令牌被错误解析后立即停止
[1.3] failure: string matching regex '\z' expected but '+' found
我明白为什么事情会出错。第一个标记是一个表达式,因此它是唯一需要根据语法进行解析的东西。但是我不知道什么是修复它的好方法。
object SimpleParser extends RegexParsers
{
def Name = """[a-zA-Z]+""".r
def Int = """[0-9]+""".r
def Main:Parser[Any] = Expr
def Expr:Parser[Any] =
(
Term
| Term <~ "+" ~> Expr
| Term <~ "-" ~> Expr
)
def Term:Parser[Any] =
(
Factor
| Factor <~ "*" ~> Term
)
def Factor:Parser[Any] =
(
Name
| Int
| "-" ~> Int
| "(" ~> Expr <~ ")"
| "let" ~> Name <~ "=" ~> Expr <~ "in" ~> Expr <~ "end"
)
def main(args: Array[String])
{
var input = "2 + 2"
println(input)
println(parseAll(Main, input))
}
}