【问题标题】:Get values from star/plus rules in ANTLR从 ANTLR 中的星号/加号规则中获取值
【发布时间】:2014-11-28 04:18:20
【问题描述】:

我正在写一个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)

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

【问题讨论】:

    标签: java antlr


    【解决方案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]
        : ...
    

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

    【讨论】:

    • 你应该试试d+=decl*或者只是decl*(在后一种情况下context.decl应该是一个列表)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多