ANTLR4 Взаимно леворекурсивная ошибка при разборе источника C++
Я пытаюсь проанализировать подмножество синтаксиса исходного кода cpp. Следующие правила синтаксического анализа ANTLR4 напрямую скопированы из спецификации языка C++ (за исключением того, что переносы заменяются подчеркиванием):
abstract_declarator:
ptr_operator abstract_declarator?
| direct_abstract_declarator
;
direct_abstract_declarator:
direct_abstract_declarator? '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| direct_abstract_declarator? '[' constant_expression? ']'
| '(' abstract_declarator ')'
;
Но я получил эту ошибку, когда org.antlr.v4.Tool анализирует грамматику:
ошибка (119): cppProcessor.g4::: Следующие наборы правил взаимно леворекурсивны [direct_abstract_declarator]
Кажется, что direct_abstract_declarator? Синтаксис в левой части вызывает ошибку. Как мне это исправить? Почему ANTLR4 не может это поддержать?
Рефакторинг правил в этой форме вручную не приводит к ошибке:
direct_abstract_declarator:
direct_abstract_declarator '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| direct_abstract_declarator '[' constant_expression? ']'
| '[' constant_expression? ']'
| '(' abstract_declarator ')'
Так возможно ли для ANTLR4 поддерживать первый синтаксис непосредственно при обработке левых рекурсивных правил?
1 ответ
ANTLR 4 поддерживает прямую левую рекурсию, но не косвенную или скрытую левую рекурсию. Вы можете решить описанную выше ситуацию, явно расширив необязательную конструкцию.
direct_abstract_declarator
: direct_abstract_declarator '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| direct_abstract_declarator '[' constant_expression? ']'
| '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| '[' constant_expression? ']'
| '(' abstract_declarator ')'
;