Ассоциативность операторов с использованием Scala Parsers

Поэтому я пытался написать калькулятор с помощью синтаксического анализатора Scala, и это было забавно, за исключением того, что я обнаружил, что ассоциативность операторов обратна, и что, когда я пытаюсь сделать мою грамматику леворекурсивной, даже если она ' Это совершенно однозначно, я получаю переполнение стека.

Чтобы уточнить, если у меня есть правило, как:     def subtract: Parser [Int] = num ~ & quot; - & quot; ~ add {x = & gt; x._1._1 - x._2} затем оценка 7 - 4 - 3 получается 6 вместо 0.

На самом деле я реализовал это так: я создаю бинарное дерево, в котором операторы являются неконечными узлами, а конечные узлы являются числами. То, как я оцениваю дерево, это левый дочерний (оператор) правый дочерний. При построении дерева для 7 - 4 - 5 я бы хотел, чтобы оно выглядело следующим образом:

-
-   5
7   4   NULL   NULL

где - корень, его дети - и 5, а вторые - дети 7 и 4.

Тем не менее, единственное дерево, которое я могу легко построить, это

-
7   -
NULL   NULL   4   5

который отличается, а не то, что я хочу.

В принципе, простое заключение в скобки - 7 - (4 - 5), тогда как я хочу (7 - 4) - 5.

Как я могу взломать это? Я чувствую, что я должен быть в состоянии написать калькулятор с правильным приоритетом оператора независимо. Должен ли я сначала все токенизировать, а потом поменять токены? Могу ли я просто перевернуть свое дерево, взяв всех левых детей правых детей и сделав их правым ребенком от родителей правого ребенка, а родителей сделать левым ребенком бывшего правого ребенка? Это кажется хорошим в первом приближении, но я действительно не думал об этом слишком глубоко. Я чувствую, что должен быть какой-то случай, который мне не хватает.

У меня сложилось впечатление, что я могу сделать парсер LL только с парсерами scala. Если вы знаете другой способ, пожалуйста, скажите мне!

Ответы на вопрос(2)

Ваш ответ на вопрос