【发布时间】:2015-03-03 10:58:17
【问题描述】:
我对 Scala 比较陌生,我正在尝试掌握组合子解析。所以我有一些代码可以解析逻辑原子(一阶逻辑中的谓词),如p(x,y,z) 或p(x,1,q(a,b,c),z)。我有这么一小段代码:
class Logic extends JavaTokenParsers {
def functor: Parser[Any] = ident
def term: Parser[Any] = predicate | ident | floatingPointNumber
def predicate: Parser[Any] = functor~"("~repsep(term,",")~")"
}
Functor 是谓词符号,如p(x,y,z) 中的p,term 是常量或变量,如1 或x,或predicate,predicate 是复合词如p(x,y,z)。此代码按原样工作正常,但如果我更改在term 解析器中声明替代项的顺序,则会出现问题。也就是说,如果我像
term 解析器
def term: Parser[Any] = ident | floatingPointNumber | predicate
(predicate 是这里的最后一个替代方案,而它之前是第一个),然后它无法解析像 p(x,1,q(a,b,c),z) 这样的“嵌套”表达式(虽然它仍然适用于像 p(x,y,z) 这样的“平面”表达式)。有人可以指出我在这里缺少什么吗?
非常感谢
【问题讨论】: