我正在尝试为以下表达式创建语法:
(foo = bar or (bar = "bar" and baz = 45.43)) and test = true
到目前为止我的语法如下:
grammar filter;
tokens {
TRUE = 'true';
FALSE = 'false';
AND = 'and';
OR = 'or';
LT = '<';
GT = '>';
EQ = '=';
NEQ = '!=';
PATHSEP = '/';
LBRACK = '[';
RBRACK = ']';
LPAREN = '(';
RPAREN = ')';
}
expression : or_expression EOF;
or_expression : and_expression (OR or_expression)*;
and_expression : term (AND term)*;
term : atom ( operator atom)? | LPAREN expression RPAREN;
atom : ID | INT | FLOAT | STRING | TRUE | FALSE;
operator : LT | GT | EQ | NEQ;
INT : '0'..'9'+;
FLOAT : ('0'..'9')+ '.' ('0'..'9')*;
STRING : '"' ('a'..'z'|'A'..'Z'|'_'|' ')* '"';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
但是在 ANTLRWorks 1.4.3 中,我得到了解析树:
但是我一生都无法弄清楚我的语法出了什么问题。这里缺少什么标记?
提前非常感谢。
编辑:为了澄清 atom
生产中的 atom (运算符原子)?
替代方案,我也许应该提到原子应该能够独立存在而无需比较到另一个原子。例如。 a 或 b
是有效的表达式。
最佳答案
我在这里回答我自己的问题。我发现我的语法有两个问题。第一个很容易发现;我已将 EOF
放在顶级规则的末尾:
expression : or_expression EOF;
因此,EOF
是丢失的标记。我的解决方案是从 表达式
规则中删除 EOF
,而是在其上方引入一条规则:
filter: expression EOF;
第二个问题是我的 or_expression
规则应该是:
or_expression : and_expression (OR and_expression)*;
而不是
or_expression : and_expression (OR or_expression)*;
完整更正的语法是:
grammar filter;
tokens {
TRUE = 'true';
FALSE = 'false';
AND = 'and';
OR = 'or';
LT = '<';
GT = '>';
EQ = '=';
NEQ = '!=';
PATHSEP = '/';
LBRACK = '[';
RBRACK = ']';
LPAREN = '(';
RPAREN = ')';
}
filter: expression EOF;
expression : or_expression;
or_expression : and_expression (OR and_expression)*;
and_expression : term (AND term)*;
term : atom (operator atom)? | LPAREN expression RPAREN;
atom : ID | INT | FLOAT | STRING | TRUE | FALSE;
operator : LT | GT | EQ | NEQ;
INT : '0'..'9'+;
FLOAT : ('0'..'9')+ '.' ('0'..'9')*;
STRING : '"' ('a'..'z'|'A'..'Z'|'_'|' ')* '"';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
生成的解析树是:
关于grammar - bool /条件表达式的 ANTLR v3 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18261484/