4

我有这样的语法规则:

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"; 

使用将 b OR c 返回的任何内容放入 $expr 变量的指令。我知道通过像这样执行这个任务可以解决这个问题:

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

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

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

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

4

1 回答 1

3

您不能对多个非终结符使用相同的标签,除非它们在语法中引用相同的规则。这意味着类似的语法group=(A | B)仅适用于标记引用(A并且B是终端)。可以为此使用以下语法。

a returns [string expr]
    :   b {$expr = $b.expr;}
    |   c {$expr = $c.expr;}
    ;
于 2013-05-28T17:38:00.290 回答