ANTLR:如何制作重写规则以将lexema设置为AST节点文本

时间:2016-02-17 00:52:07

标签: abstract-syntax-tree antlr3 rule

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

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”。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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