0

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 が文法を解析しているときに、次のエラーが発生しました。

error(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

1 に答える 1

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 ')'
;
于 2013-04-20T16:00:35.517 に答える