我在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
因此,如果有人解释如何定义语法以表达括号,那将非常感激。
答案 0 :(得分:1)
你忘了告诉ANTLR如何处理空白。例如:
WS : [ \t\r\n] -> skip;
添加这个,你的语法就可以了。
作为旁注,您的语法对AND
和OR
运算符具有相同的优先级。这些运算符的优先级高于NOT
。由于这违反了传统规则,我建议您改为编写expression
这样的规则:
expression
: '(' expression ')' # parenExp
| 'NOT' expression # notExpr
| expression 'AND' expression # andExpr
| expression 'OR' expression # orExpr
| ID # atomExpr
;