Java 从ANTLR中的星号/加号规则获取值
我正在编写一个ANTLR语法(编译成java),我有以下代码: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返回一个声明对象,
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]
: ...