在ANTLR4中更改与运行时节点关联的规则

时间:2015-07-16 14:28:44

标签: java parsing antlr grammar antlr4

我有一个名为"变量"它只与非关键字文本相关联。在运行时,我编译了一个应该与规则相关联的字符串列表" special"这也只是普通文本,但是它定义在变量下面,因此从未实际到达,因为所有内容都将首先与变量匹配。

在运行时期间,如何使用此列表更改任何匹配"变量"这些也在列表中以匹配"特殊"?

示例:

语法

parent:
  variable |
  special;

variable:
  ID;

special:
  ID;

要解析的文字:"一个二三四"
结果:变量,变量,变量,变量

后来我计算出我想要"四"与特殊相关联。所以结果应该改为:变量,变量,变量,特殊

这应该在文本实际没有变化的情况下发生。我试着调查听众和访问者,但我不确定如何实际修改与节点关联的规则。我也发现这个例子看起来很相似,但它在ANTLR3中:Dynamically create lexer rule

1 个答案:

答案 0 :(得分:1)

在运行时限定令牌的最直接方法是使用谓词来选择性地伪造规则。这可以在解析器或词法分析器中完成。使用你的原语法,并重新安排一下:

@members {
    ArrayList<String> keyList = .... // get dynamic list of keywords

    public boolean inList(String id) {
        return keyList.contains(id) ;
    }
}

parent   : special   // dynamic keywords
         | variable  // everything else
         ;
special  : ID { inList($ID.getText()) }? ;
variable : ID ;

谓词会伪造special规则,以查找不在动态关键字列表中的任何ID令牌。