Немного мнения: хотя иногда можно перейти от грамматики LR к грамматике LL, как вы уже сделали, результат не так идиоматичен и может показаться странным способом определения вашей грамматики для кого-то, знакомого сLL грамматики.
Например, рассмотрим следующую выдержку из приведенного выше:
tp :
| '*' f tp -> ???
В приведенном выше тексте принимается *
, за которым следует f
, в ПЕРВОМ наборе которого будет INT
(
, начало само по себе как правильное рекурсивное.Таким образом, вы никогда не увидите начало искомого выражения с корнем в *
, что значительно усложнит построение дерева, которое вам нужно.
создайте этот AST в ANTLR, вы хотите иметь как операнды, так и оператор.
add:
INT '+'^ INT;
Символ каретки ^
делает +
корнем дерева, а два INT
становятсяего дети.
Пример Барта K , связанный с , является замечательным примером того, как я ожидал бы увидеть, как это делается с грамматикой LL ... и этомасштабируется для поддержки операторов различного приоритета.