我正在做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 ~ ")"完全匹配,但它不需要额外的案例分析来从<=>检索内部结果值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top