以下の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);