繁体   English   中英

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

[英]How to define logical operator with parenthesis in 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
因此,如果有人解释如何定义语法以表达括号,将不胜感激。

您忘了告诉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
    ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM