我正在写一个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)
如何从中获取声明对象列表?
答案 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]
: ...
我不是混淆代码的粉丝,但这是我找到的唯一解决方案。