Java 从ANTLR中的星号/加号规则获取值

Java 从ANTLR中的星号/加号规则获取值,java,antlr,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返回一个声明对象,

我正在编写一个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返回一个声明对象,stmt返回一个语句对象。然而,在本例中,规则后面有一个“*”和一个“+”,这意味着它们可能返回许多对象。在生成的解析器中,单个
decl
成为声明对象,而
decl*
则变成:
((d!=null)?((MyLang.decl\u return)d)。值:null)


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

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

程序返回[程序值]
:PROGRAM d=zeroOrMoreDecl s=oneOrMoreStmt END{$value=new PROGRAM($d.value,$s.value);}
;
zeroOrMoreDecl返回[ArrayList值]
:{$value=newarraylist();}(d=decl{$value.add($d.value);})*
;
decl返回[声明值]
: ...

我不喜欢把代码弄乱,但这是我找到的唯一解决办法。

你应该试试
d+=decl*
或者干脆
decl*
(在后一种情况下
context.decl
应该是一个列表)
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]
    : ...