我有一个简单的语法
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 也创建了它):
(ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33))
因此 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)
;
关于tree grammar中tree的antlr文法多重性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389451/