грамматика — 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 поддерживать первый синтаксис напрямую при обработке левых рекурсивных правил?

0

Решение

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 ')'
;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]