如何在ANTLR语法中用括号定义逻辑运算符

时间:2016-10-27 04:58:42

标签: parsing antlr grammar

我在ANTLR中定义一个语法,它将表达一个包含逻辑运算符和括号的表达式。
这是语法

grammar simpleGrammar; 

/* This will be the entry point of the parser. */ 

parse 
    :   
        expression EOF 
    ; 
expression 
    :   
        expression binOp expression | ID | unOp (expression) | '(' expression ')' 
    ; 
binOp 
    : 
        ('AND' | 'OR')  
    ; 
unOp 
    : 
        'NOT' 
    ; 
ID      :   
        ('a'..'z' | 'A'..'Z')+  
    ; 

定义的语法能够表示没有括号的解析树,但是当我输入带括号的示例时,(Apple OR Bananana)AND Orange 它显示MismatchedTokenException
因此,如果有人解释如何定义语法以表达括号,那将非常感激。

1 个答案:

答案 0 :(得分:1)

你忘了告诉ANTLR如何处理空白。例如:

WS : [ \t\r\n] -> skip;

添加这个,你的语法就可以了。

作为旁注,您的语法对ANDOR运算符具有相同的优先级。这些运算符的优先级高于NOT。由于这违反了传统规则,我建议您改为编写expression这样的规则:

expression 
    :   '(' expression ')'            # parenExp
    |   'NOT' expression              # notExpr
    |   expression 'AND' expression   # andExpr
    |   expression 'OR' expression    # orExpr
    |   ID                            # atomExpr
    ;