从ANTLR中的star / plus规则中获取值

时间:2014-11-28 04:18:20

标签: java antlr

我正在写一个ANTLR语法(编译成java),我有以下代码:

program returns [Program value]
    : PROGRAM d=decl* s=stmt+ END {$value = new Program($d.value, $s.value);}
    ;

decl returns [Declaration value]
    : ...

stmt returns [Statement value]
    : ...

规则decl返回一个Declaration对象,stmt返回一个Statement对象。在这种情况下,我在规则之后有一个“*”和一个“+”,这意味着它们可以返回许多对象。在生成的解析器中,单个decl成为声明对象,但decl*变为:((d != null) ? ((MyLang.decl_return) d).value : null)

如何从中获取声明对象列表?

1 个答案:

答案 0 :(得分:1)

我最后通过添加规则来解决这个问题,以适应明星和加号(下面只显示了明星,但概念与加号相同):

program returns [Program value]
    : PROGRAM d=zeroOrMoreDecl s=oneOrMoreStmt END {$value = new Program($d.value, $s.value);}
    ;

zeroOrMoreDecl returns [ArrayList<Declaration> value]
    : {$value = new ArrayList<Declaration>();} (d=decl {$value.add($d.value);})*
    ;

decl returns [Declaration value]
    : ...

我不是混淆代码的粉丝,但这是我找到的唯一解决方案。