1

正常に動作する次の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ブランチが完全に欠落しています。

ここに画像の説明を入力してください

私は何が間違っているのですか?

4

1 に答える 1

1

バグが見つかりました。実際には、ANTLRWorksIDEを使用している私にとっては問題でした。デバッグモードを実行し、テキストの入力を求められると、ドロップダウンの1つに[ルールの開始]と表示されます。'and_expression'に設定されました。'expression'だけに変更すると、プログラムは正常に動作し、次のツリーが表示されます。

ここに画像の説明を入力してください

于 2012-09-21T16:35:11.473 に答える