Scala组合器解析器 - 区分数字字符串和变量字符串

Lar*_*ren 6 parsing scala combinators

我正在做Cay Horstmann的组合器解析器练习,我想知道区分表示数字的字符串和表示匹配语句中的变量的字符串的最佳方法:

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ {
    case a: wholeNumber  => Number(a.toInt)
    case a: String => Variable(a)
}
Run Code Online (Sandbox Code Playgroud)

那里的第二行,"案例a:整数"不合法.我想到了一个正则表达式,但还没有找到一种方法让它与"案例"一起工作.

Dan*_*wak 6

我会把它分开一点,把案例分析推进去|.这是组合器的一个优点,并且通常是LL(*)解析:

def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) }
                               | "(" ~> expr <~ ")" 
                               | ident ^^ { Variable(_) } )
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉下划线语法,我深表歉意.基本上它只是意味着"将第n个参数替换为封闭函数值".因此{ Variable(_) }相当于{ x => Variable(x) }.

这里的另一个语法魔法是~><~运算符代替~.这些运算符意味着该术语的解析应该包括两个parens 的语法,但结果应该仅由结果决定expr.因此,"(" ~> expr <~ ")"匹配完全相同"(" ~ expr ~ ")",但它不需要额外的案例分析来检索内部结果值expr.