1

我有以下可以正常工作的鹿茸 g 文件:

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!;

问题是我需要 AND 具有比 OR 更高的优先级。所以我修改了最后四行如下:

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

发现了这个bug,实际上是我使用ANTLRWorks IDE的问题。当您运行调试模式并要求您输入文本时,下拉列表之一会显示 Start Rule:。它被设置为“and_expression”。将其更改为“表达式”后,程序运行正常,我得到以下树:

在此处输入图像描述

于 2012-09-21T16:35:11.473 回答