Antlr: взаимно леворекурсивное правило - PullRequest
1 голос
/ 22 апреля 2011

У меня есть это правило в antlr:

anREs : anRE 
      | ('(' anREs ')') =>  '(' anREs ')'
      | (anREs '|' anREs) =>  anREs '|' anREs   ;

где anRE является регулярным выражением, когда я хочу скомпилировать файл правил, у меня появляется это сообщение об ошибке из-за 3-й альтернативы в последнем правиле:

ошибка (210): следующие наборы правила взаимно леворекурсивны [AnREs]

как мне переписать это правило?

спасибо

1 Ответ

2 голосов
/ 22 апреля 2011

Вот ваша левая рекурсия:

  ... | (anREs '|' anREs) =>  anREs '|' anREs   ;

Хуже, это неоднозначно.Если у вас есть anREs_1 |anREs_2 |anREs3 в качестве входных данных, не ясно, что подтермы |оператор:.

Я ожидал бы, что это решит проблему, и решит также неоднозначность:

  ... | (anRE '|' anREs) =>  anRE '|' anREs   ;
...