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