Определение левоассоциативного парсера с помощью PetitParser
В 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)
?
2 ответа
Решение
Для левой ассоциативной грамматики используйте:
term := (prod sepratedBy: $+ asParser trim) foldLeft: [ :a :op :b |
...]
Для правильных ассоциативных грамматик используйте:
raise := (prod sepratedBy: $^ asParser trim) foldRight: [ :a :op :b |
...]
В качестве альтернативы вы можете посмотреть на PPExpressionParser
, который обрабатывает все детали автоматически для вас. Вы просто сообщаете ему, какие операторы являются левоассоциативными, правоассоциативными, префиксными или постфиксными операторами. Посмотрите на комментарий класса для углубленного обсуждения.
Посмотрите на класс PPExpressionParser.
это предназначено для этого, и у вас есть отличный пример в комментарии класса