ANTLR组表达式和保存变量
如果我有这样的表达: (姓名=保罗和年龄=16岁)或国家=中国 我想得到:ANTLR组表达式和保存变量,antlr,antlr3,abstract-syntax-tree,Antlr,Antlr3,Abstract Syntax Tree,如果我有这样的表达: (姓名=保罗和年龄=16岁)或国家=中国 我想得到: QUERY | |-------------| () | | | AND OR | | |-------| | name age country | | | Paul
QUERY
|
|-------------|
() |
| |
AND OR
| |
|-------| |
name age country
| | |
Paul 16 china
如何在字段名称、年龄和国家/地区之前打印()和条件(和/或)
我的语法文件如下所示:
parse
: block EOF -> block
;
block
: (statement)* (Return ID ';')?
-> ^(QUERY statement*)
;
statement
: assignment ';'
-> assignment
;
assignment
: expression (condition expression)*
-> ^(condition expression*)
| '(' expression (condition expression)* ')' (condition expression)*
-> ^(Brackets ^(condition expression*))
;
condition
: AND
| OR
;
Brackets: '()' ;
OR : 'OR' ;
AND : 'AND' ;
但它只打印表达式中出现的第一个条件('和',在本例中),我无法将括号之间的内容和非括号中的内容进行分组…我觉得您的语法很奇怪,而且其中存在错误:如果解析器与
“()”
不匹配,则无法在重写规则中使用括号。为什么您希望在AST中包含令牌“()”
根据您的示例输入:
(name = Paul AND age = 16) OR country = china;
以下是构建AST的可能方法:
grammar T;
options {
output=AST;
}
query
: expr ';' EOF -> expr
;
expr
: logical_expr
;
logical_expr
: equality_expr ( logical_op^ equality_expr )*
;
equality_expr
: atom ( equality_op^ atom )*
;
atom
: ID
| INT
| '(' expr ')' -> expr
;
equality_op
: '='
| 'IS' 'NOT'?
;
logical_op
: 'AND'
| 'OR'
;
ID : ('a'..'z' | 'A'..'Z')+;
INT : '0'..'9'+;
WS : (' ' | '\t' | '\r' | '\n')+ {skip();};
这将导致:
非常感谢您的努力!这是一个非常好和完整的答案。当我想给一个变量赋予多个值时,我遇到了问题,比如:国家是(中国,日本)。我正在按照您之前的说明()进行操作,但由于“'(“expr')”->expr”选项,我得到了一个“多个备选方案”错误。你能帮我一下吗?@user2144555,我建议你为它创建一个新的问题,将前两个(或更多)问题中的代码/语法结合起来,并发布准确的错误消息以及一些示例输入(+所需输出/AST)。再次感谢你。问题是:我的主要疑问是如何区分括号之间的内容是规则(表达式)还是前一个变量的属性。因为我可以有:“(姓名=保罗,年龄=16岁)”或者我可以有“姓名是(保罗,约翰)”。谢谢