树中树的Antlr语法多重性问题

树中树的Antlr语法多重性问题,antlr,antlr3,Antlr,Antlr3,我有一个简单的语法 options { language = Java; output = AST; ASTLabelType=CommonTree; } tokens { DEF; } root : ID '=' NUM (',' ID '=' NUM)* -> ^(DEF ID NUM)+ ; 以及相应的树语法: options { tokenVocab=SimpleGrammar; ASTLabelType=CommonTree; }

我有一个简单的语法

options {
  language = Java;
  output = AST;
  ASTLabelType=CommonTree;
}

tokens {
  DEF;
}

root
  : ID '=' NUM (',' ID '=' NUM)* -> ^(DEF ID NUM)+     
  ;
以及相应的树语法:

options {
  tokenVocab=SimpleGrammar;
  ASTLabelType=CommonTree;
}

root
  : ^(DEF ID NUM)+
;
但是,antlr(v3.3)无法编译我得到的树语法:

syntax error: antlr: unexpected token: +
|---> : ^(DEF ID NUM)+
如果我想将其创建为
^(ROOT^(DEF ID NUM)+)

我想要一个与此对应的树(因为parse也创建了它):

因此,antlr能够在解析器中生成树,但不能使用树语法对其进行解析

为什么会发生这种情况?

为了获得
(ROOT(DEF aa 11)(DEF bb 22)(DEF cc 33))
您可以定义以下解析器规则:

tokens {
  ROOT;
  DEF;
}

root
  : def (',' def)* -> ^(ROOT def+)
  ;

def
  :  ID '=' NUM -> ^(DEF ID NUM)
  ;
然后您的树语法将包含:

root
  :  ^(ROOT def+)
  ;

def
  :  ^(DEF ID NUM)
  ;

我刚刚发现:这没关系,有一个解决方法,但是,如果我想遍历一个看起来与上面定义完全相同的树,该怎么办?好吧,你的树
^(DEF ID NUM)+
也重复它的根
DEF
。因此,您有一个可能超过1个根的树,这是不可能的。你们能编辑你们的问题并解释你们想要创建什么树吗?好的,我编辑了它,结果应该是:(ROOT(DEF aa 11)(DEF bb 22)(DEF cc 33))
root
  :  ^(ROOT def+)
  ;

def
  :  ^(DEF ID NUM)
  ;