Как из польской нотации получить АСТ дерево?

Задача алгоритмическая и без привязки к какому либо языку. На входе обратная польская запись включающая в себя операторы лево-ассоциативные, функции с произвольным числом параметров и числа. На выходе необходимо получить АСТ дерево. Приветствуются любые отсылки и ответы в стиле "помоему было в такой-то книге".
  • Вопрос задан
  • 4202 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
последовательно читаем выражение, для каждой лексемы по её типу:
число -> создать ноду (ЧИСЛО, значение), положить её на стек;
унарный оператор -> снять со стека ноду (потомок), создать ноду (УНАРНАЯОПЕРАЦИЯ, тип, потомок), положить новую ноду на стек;
бинарный оператор -> снять со стека две ноды (потомок1 и потомок2), создать ноду (БИНАРНАЯОПЕРАЦИЯ, тип, потомок1, потомок2), положить новую ноду на стек;
функция -> снять со стека N нод по числу аргументов функции (потомок1,... потомокN), создать ноду (ФУНКЦИЯ, имя, потомок1,... потомокN), положить новую ноду на стек;

В конце работы по корректному выражению на стеке должна лежать одна нода, она и будет корнем дерева.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
На входе обратная польская запись включающая в себя операторы, функции, скобочки и числа.

Нет скобочек в RPN.

И что тут думать? Нужно тащить стек встреченных терминальных символов и готовых узлов, а при появлении оператора или функции создавать новый узел, снимать со стека столько элементов сколько ожидает пришедший оператор/функция и делать их его детьми, и добавлять обратно в стек только что созданный узел.
Ответ написан
tsarevfs
@tsarevfs
C++ developer
Не совсем понятно зачем в польской нотации скобочки, и что они в ней могут означать.
Для обычной польской записи с операторами и числами можно просто использовать алгоритм ее вычисления. Только результатом операций будут не значения а поддеревья.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы