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