【问题标题】:Handling ANTLR return values处理 ANTLR 返回值
【发布时间】:2013-05-28 15:39:02
【问题描述】:

我有这样的语法规则:

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”返回的值。

【问题讨论】:

  • -1 用于从 ANTLR 语法转换为非 ANTLR 语法,仅用于发布有关 ANTLR 语法的问题。这是什么-> 运算符?那是 ANTLR 3 中的重写运算符和 ANTLR 4 中的词法分析器命令运算符,但您似乎在这里将其用于其他目的?

标签: parsing antlr


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2013-02-19
    • 2011-05-08
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2018-04-02
    相关资源
    最近更新 更多