树中树的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)
;