ANTLR如何区分相同类型的输入参数

ANTLR如何区分相同类型的输入参数,antlr,antlr3,abstract-syntax-tree,Antlr,Antlr3,Abstract Syntax Tree,如果我有输入消息: 名字是(乔恩,特德)不是(彼得) 我想要这个: name | |-----| IS IS NOT | | | Peter |----| Jon Ted 但我收到了: name | |-----------------| IS IS NOT |

如果我有输入消息:

名字(乔恩,特德)不是(彼得)

我想要这个:

      name
       |
    |-----|
   IS   IS NOT
    |     |
    |    Peter
 |----|
Jon  Ted
但我收到了:

                name
                  |
        |-----------------|
       IS              IS NOT
        |                 |
        |                 |
   |----|-----|      |----|-----|
  Jon  Ted  Peter   Jon  Ted  Peter 
我的语法文件有:


我如何区分哪些“属于”属于“是”,哪些属于“不是”

像这样的东西应该可以做到:

expression
 : NAME IS left=id_list IS NOT right=id_list -> ^(NAME ^(IS $left) ^(NOT $right))
 ;

id_list
 : '(' ID (',' ID)* ')' -> ID+
 ;

IS : 'IS';
NOT : 'NOT'; // not a single token that is 'IS NOT'

ID
 : ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)+ 
   // Not `(...)*`: it should always match a single char!
 ;

你能告诉我我是否可以用这种符号(保存在变量中)来保存“表达式”吗?例如:赋值:“(“表达式(条件表达式)*”)”(条件表达式)*->^(括号^(条件表达式*));我想将括号之间的内容和括号后面的内容分开,以打印如下内容:->^(括号$between)$after@user2144555,尝试一下,看看你的结局如何。如果您遇到问题,请随意提出一个新问题,其细节比这些评论框所能容纳的要详细一些。
NAME
    :   'name'
    ;

Identifier
    :   ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)*
    ;
expression
 : NAME IS left=id_list IS NOT right=id_list -> ^(NAME ^(IS $left) ^(NOT $right))
 ;

id_list
 : '(' ID (',' ID)* ')' -> ID+
 ;

IS : 'IS';
NOT : 'NOT'; // not a single token that is 'IS NOT'

ID
 : ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)+ 
   // Not `(...)*`: it should always match a single char!
 ;