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

时间:2011-09-12 14:28:07

标签: antlr antlr3

我有一个简单的语法

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能够在解析器中生成树但不能用树语法解析它吗?!

为什么会这样?

1 个答案:

答案 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)
  ;