ANTLR4 C# грамматика и левая рекурсия

Я пытаюсь разобрать код С# с помощью ANTLR4 (из Java). Пока мне не удалось найти подходящую грамматику, поэтому я решил написать свою собственную. Я использовал это приложение здесь, но я столкнулся с проблемой. Проблема в том, что у меня много леворекурсивных правил. Я пытался исправить их с помощью ANTLRWorks (antlrworks-1.5), но я просто продолжаю получать исключения. Некоторые из них мне удалось исправить вручную, но не такие, как этот:

multiplicative_expression:
| unary_expression
| multiplicative_expression '*' unary_expression
| multiplicative_expression '/' unary_expression
| multiplicative_expression '%' unary_expression;

Итак, есть ли кто-нибудь, кто мог бы указать мне правильную грамматику для ANTLR4 или помочь мне решить проблему с левой рекурсией. Спасибо.


person Alen    schedule 25.08.2013    source источник


Ответы (2)


ANTLR 4 обрабатывает прямую левую рекурсию внутри. Правило, которое вы написали выше, будет работать в ANTLR 4 без изменений.

person Sam Harwell    schedule 25.08.2013
comment
Хорошо, спасибо @ 280Z28, но когда я пытаюсь сгенерировать парсер и лексер из этой грамматики здесь, которую я нашел в Интернете, Я получаю эту ошибку здесь. - person Alen; 25.08.2013

Леворекурсивное правило имеет вид A -> Aa | b Формальный способ решить эту проблему состоит в том, чтобы ввести новый нетерминал A' и переписать правило как

A -> bA'

А' -> Эпсилон | aA' (где Эпсилон - "Пустая строка")

Поскольку ANTLR является генератором LL-парсеров, он не выдерживает левой рекурсии. Однако праворекурсивные правила подходят для ANTLR, поэтому мы можем написать правила так:

multiplicative_expression:
| unary_expression
| unary_expression '*' multiplicative_expression 
| unary_expression '/' multiplicative_expression  
| unary_expression '%' multiplicative_expression  ;
person Julien    schedule 25.08.2013
comment
ANTLR 4 поддерживает прямую левую рекурсию. Правило multiplicative_expression прекрасно работает в том виде, в котором оно было изначально написано. - person Sam Harwell; 25.08.2013