ANTLR组表达式和保存变量

ANTLR组表达式和保存变量,antlr,antlr3,abstract-syntax-tree,Antlr,Antlr3,Abstract Syntax Tree,如果我有这样的表达: (姓名=保罗和年龄=16岁)或国家=中国 我想得到: QUERY | |-------------| () | | | AND OR | | |-------| | name age country | | | Paul

如果我有这样的表达:

(姓名=保罗年龄=16岁)国家=中国

我想得到:

          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岁)”或者我可以有“姓名是(保罗,约翰)”。谢谢