У меня возникли некоторые проблемы с пониманием того, как, используя анализатор снизу вверх и, например, строку ввода 1 + 2 * 3
, перейти от "снизу" к "вершине".
Вот грамматика, которую я использую (я бы сказал, что она правильная, так как она найдена в Crafting a Compiler)
E = E plus T
| T;
T = T times integer
| integer;
Это мой обратный вывод:
int(1)
T(1)
E(1)
E(1) plus int(2)
E(1) plus T(2)
E(1) plus E(2)
E(1) plus E(2) times int(3)
E(1) plus E(2) times E(3) <-- can't do anything here
Проблема в том, что каждый раз, когда я получаю целое число в качестве входных данных, оно автоматически "преобразуется" в E
.
Я довольно уверен, что данная грамматика верна. Я также попробовал это в sablecc с некоторыми входными строками (используя посетителя Pretty Printer, который я сделал), и все они дают правильный результат.
Таким образом, я знаю, что проблема во мне, а не в самой грамматике. Что я делаю не так, тогда?
Спасибо!