我有一个简单的语法
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)+)
我想要一个与此对应的树(因为解析也会创建它):
(ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33))
因此,antlr能够在解析器中生成树但不能用树语法解析它吗?!
为什么会这样?
答案 0 :(得分:3)
为了获得(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)
;