正常に動作する次のantlergファイルがあります。
grammar BoolTest;
LEFT_PAREN : '(' ;
RIGHT_PAREN : ')' ;
AND : 'AND';
OR : 'OR';
WHITESPACE : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
WORD : (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' ))*;
expression : and_expression;
and_expression : or_expression (AND^ or_expression)*;
or_expression : atom (OR^ atom)*;
atom : WORD | LEFT_PAREN! expression RIGHT_PAREN!;
問題は、ORよりもANDの優先順位を高くする必要があることです。そこで、最後の4行を次のように変更しました。
expression : or_expression;
or_expression : and_expression (OR^ and_expression)*;
and_expression : atom (AND^ atom)*;
atom : WORD | LEFT_PAREN! expression RIGHT_PAREN!;
しかし、何らかの理由で正しく機能しません。そして、次の式:
a AND b OR c
次のツリーが生成されますが、ORブランチが完全に欠落しています。
私は何が間違っているのですか?