3

以下のANTLR文法の「expr」ルールは、明らかに相互に左再帰的です。ANTLR初心者として、これを解決するのに頭を悩ませるのは難しい. ANTLR リファレンス ブックの「Resolving Non-LL(*) Conflicts」を読みましたが、まだ解決策がわかりません。ポインタはありますか?

LPAREN : ( '(' ) ;
RPAREN : ( ')' );
AND : ( 'AND' | '&' | 'EN' ) ;
OR : ( 'OR' | '|' | 'OF' );
NOT : ('-' | 'NOT' | 'NIET' );
WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
WORD : (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*;

入力: expr EOF;
expr : (andexpr | orexpr | notexpr | アトム);
andexpr : expr AND expr;
orexpr : expr OR expr;
notexpr : 式ではありません。
フレーズ: '"' WORD* '"';
アトム : (フレーズ | WORD);
4

1 に答える 1

5

antlrサイトのグラマーの例をご覧になることをお勧めします。Java文法はあなたが望むことをします。

基本的に、次のようなことができます。

expr : andexpr;
andexpr : orexpr (AND andexpr)*;
orexpr : notexpr (OR orexpr)*;
notexpr : atom | NOT expr;

重要なのは、すべての式がアトムになることができるということです。

于 2010-08-24T11:59:01.103 に答える