【问题标题】:How to change ANTLR boolean precedence?如何更改 ANTLR 布尔优先级?
【发布时间】:2012-09-21 16:29:21
【问题描述】:

我有以下可以正常工作的鹿茸 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 分支:

我做错了什么?

【问题讨论】:

    标签: tree boolean antlr operator-precedence


    【解决方案1】:

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

    【讨论】:

    • 我有时也会爱上这个。不要忘记接受你自己的答案!
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 2022-08-17
    • 2015-06-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多