Я пытаюсь разобрать подмножество синтаксиса источника cpp. Правила синтаксического анализа последующих ANTLR4 непосредственно скопированы из C++ спецификации языка (кроме hypens заменяются подчеркиванием):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 поддержать первый синтаксис непосредственно при обращении с леворекурсивным правила?