在http://pharobooks.gforge.inria.fr/PharoByExampleTwo-Eng/latest/中,定义了一个 ExpressionGrammar。但是,它是右结合的
parser parse: '1 + 2 + 6'. ======> #(1 $+ #(2 $+ 6))
我怎样才能使它左关联,以便
parser parse: '1 + 2 + 6'.
结果是
#(#(1 $+ 2) $+ 6)
?
在http://pharobooks.gforge.inria.fr/PharoByExampleTwo-Eng/latest/中,定义了一个 ExpressionGrammar。但是,它是右结合的
parser parse: '1 + 2 + 6'. ======> #(1 $+ #(2 $+ 6))
我怎样才能使它左关联,以便
parser parse: '1 + 2 + 6'.
结果是
#(#(1 $+ 2) $+ 6)
?
对于左结合文法,使用:
term := (prod sepratedBy: $+ asParser trim) foldLeft: [ :a :op :b |
...]
对于右结合文法,使用:
raise := (prod sepratedBy: $^ asParser trim) foldRight: [ :a :op :b |
...]
或者,您可能想查看PPExpressionParser
,它会自动为您处理所有详细信息。您只需告诉它哪些运算符是左关联、右关联、前缀或后缀运算符。查看课程评论以进行深入讨论。
看看 PPExpressionParser 类。
它就是为此而设计的,你在课堂评论中有一个很好的例子