繁体   English   中英

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

[英]Change rule associated with a node at runtime in ANTLR4

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

在运行期间,如何使用此列表来更改列表中也匹配“特殊”的所有匹配“变量”的令牌?

例:

语法

parent:
  variable |
  special;

variable:
  ID;

special:
  ID;

要分析的文本:“一二三四”
结果:变量,变量,变量,变量

后来,我计算出我希望“四个”与特殊内容相关联。 因此结果应更改为:变量,变量,变量,特殊

这应该在文本没有实际更改的情况下发生。 我尝试调查侦听器和访问者,但不确定如何实际修改与节点关联的规则。 我还发现了这个例子,看起来很相似,但它在ANTLR3中: 动态创建词法分析器规则

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

@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 ;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM