gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:37:44 24 4
gpt4 key购买 nike

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

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

第二行“case a: WholeNumber”不合法。我考虑过正则表达式,但还没有找到让它与“case”一起使用的方法。

最佳答案

我会把它拆分一下,然后将案例分析插入| 。这是组合器和 LL(*) 解析的优点之一:

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

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

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

关于Scala 组合器解析器 - 区分数字字符串和变量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com