处理ANTLR返回值

时间:2013-05-28 15:39:02

标签: parsing antlr

我有这样的语法规则:

a returns [string expr] : (b | c) {$expr = "Build expression from b OR c here";}

b returns [string expr] : 'B' {$expr = "From b";}

c returns [string expr] : 'C' {$expr = "From c";}

我想替换

$expr = "Build expression from b OR c here"; 

使用一条指令放入$ expr变量,无论从b OR c返回什么。我知道有一个解决方案,通过执行这样的任务:

a returns [string expr] : b {$expr = $b.expr;} | c {$expr = $c.expr;}

但是想知道是否有一种更简单的方法,比如用变量命名整个组并改为使用它:

a returns [string expr] : group = (b | c) {$expr = $group.expr;}

我已经尝试了这个并且它在ANTLR中不起作用,即使组变量用于获取“b”返回的值。

1 个答案:

答案 0 :(得分:3)

除非在语法中引用相同的规则,否则不能对多个非终端使用相同的标签。这意味着group=(A | B)之类的语法仅适用于令牌引用(AB是终端)。可以使用以下语法。

a returns [string expr]
    :   b {$expr = $b.expr;}
    |   c {$expr = $c.expr;}
    ;