我有这样的语法规则:
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 或 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 中不起作用,即使组变量用于获取“b”返回的值。
最佳答案
不能对多个非终结符使用相同的标签,除非它们在语法中引用相同的规则。这意味着像 group=(A | B)
这样的语法仅适用于 token 引用(A
和 B
是终端)。为此可以使用以下语法。
a returns [string expr]
: b {$expr = $b.expr;}
| c {$expr = $c.expr;}
;
关于parsing - 处理 ANTLR 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796096/