6

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

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

第二行,“case a: wholeNumber”是不合法的。我想过一个正则表达式,但还没有找到一种方法让它与“案例”一起工作。

4

1 回答 1

6

我会将其拆分一下,然后将案例分析推送到|. 这是组合器的优点之一,通常是 LL(*) 解析:

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

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

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

于 2008-11-02T19:44:07.103 回答