【问题标题】:ANTLR: how to make a rewrite rule to set a lexema as a AST node textANTLR:如何制定重写规则以将词法设置为 AST 节点文本
【发布时间】:2016-02-17 00:52:07
【问题描述】:

以下语法规则旨在识别语法中的“a-b”等表达式,该语法生成​​ AST 以评估线性方程:

tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    DIV = '/' ;
    EQUAL = '=' ;
    MULT = '*' ;
}

minusExpr: (a=multExpr -> $a)  (MINUS b=multExpr -> ^(PLUS $a ^(MINUS $b)))*;   

语法工作正常。我唯一的问题是在输出 AST 中,标记的文本设置为“PLUS”而不是“+”。

例如,对于等式:x-1=11

它会生成以下树(语法还有其他规则我这里没有复制):

(= (PLUS x (- 1)) 11)

而不是树:

(= (+ x (- 1)) 11)

我想知道如何重写规则,以便将 AST 节点标签设置为“+”而不是“PLUS”。谢谢!

【问题讨论】:

    标签: abstract-syntax-tree antlr3 rule


    【解决方案1】:

    文本“+”只是词法分析器转换为标记的输入(在这种情况下,标记类型为 PLUS)。您不能重写它,因为词法分析器总是将您的输入转换为标记(因为解析器仅适用于标记)。

    但是,每个令牌都有其创建自内部存储的文本。因此,当您遍历树时,您可以随时通过调用 CommonToken 或 BaseTree 类的 getText() 来获取每个标记的原始文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多