我有这样的语法规则:
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”返回的值。
答案 0 :(得分:3)
除非在语法中引用相同的规则,否则不能对多个非终端使用相同的标签。这意味着group=(A | B)
之类的语法仅适用于令牌引用(A
和B
是终端)。可以使用以下语法。
a returns [string expr]
: b {$expr = $b.expr;}
| c {$expr = $c.expr;}
;