2013-04-20 6 views
0

Я пытаюсь разобрать подмножество синтаксиса источника 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 поддержать первый синтаксис непосредственно при обращении с леворекурсивным правила?

ответ

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^