grammar - ANTLR4 Mutually Left-recursive Error When Parsing C++ Source -
i'm trying parse subset of cpp source syntax. follow antlr4 parser rules directly copied c++ language specification (except hypens replaced underscores):
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 ')' ;
but got error when org.antlr.v4.tool parsing grammar:
error(119): cppprocessor.g4::: following sets of rules mutually left-recursive [direct_abstract_declarator]
it seems direct_abstract_declarator? syntax @ left hand side causes error. how should correct it? why can't antlr4 support it?
manually refactoring rules form doesnt produce error:
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 ')'
so possible antlr4 support first syntax directly when handling left recursive rules?
antlr 4 supports direct left recursion, not indirect or hidden left recursion. can address situation above explicitly expanding optional construct.
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 ')' ;
Comments
Post a Comment