我正在做Cay Horstmann的组合器解析器练习,我想知道区分表示数字的字符串和表示匹配语句中的变量的字符串的最佳方法:
def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ { case a: wholeNumber => Number(a.toInt) case a: String => Variable(a) }
那里的第二行,"案例a:整数"不合法.我想到了一个正则表达式,但还没有找到一种方法让它与"案例"一起工作.
我会把它分开一点,把案例分析推进去|
.这是组合器的一个优点,并且通常是LL(*)解析:
def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) } | "(" ~> expr <~ ")" | ident ^^ { Variable(_) } )
如果您不熟悉下划线语法,我深表歉意.基本上它只是意味着"将第n个参数替换为封闭函数值".因此{ Variable(_) }
相当于{ x => Variable(x) }
.
这里的另一个语法魔法是~>
和<~
运算符代替~
.这些运算符意味着该术语的解析应该包括两个parens 的语法,但结果应该仅由结果决定expr
.因此,"(" ~> expr <~ ")"
匹配完全相同"(" ~ expr ~ ")"
,但它不需要额外的案例分析来检索内部结果值expr
.