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 クラスを見てください。
そのために設計されており、クラスのコメントに素晴らしい例があります