gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:19:14 36 4
gpt4 key购买 nike

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

在运行时,如何使用此列表来更改列表中匹配“变量”的任何标记以匹配“特殊”?

示例:

语法

parent:
variable |
special;

variable:
ID;

special:
ID;

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

后来我计算出我希望“四”与特殊相关联。所以结果应该变成:变量,变量,变量,特殊

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

最佳答案

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

@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 token 的特殊规则。

关于java - 在 ANTLR4 中运行时更改与节点关联的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457105/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com