在 ANTLR4 中运行时更改与节点关联的规则
Change rule associated with a node at runtime in ANTLR4
我有一个名为 "variable" 的规则,它只与非关键字文本相关联。在运行时,我编译了一个应该与规则 "special" 相关联的字符串列表,它也只是普通文本,但是它定义在变量下面,因此实际上永远不会到达,因为所有内容都会首先匹配到变量。
在运行时,我如何使用此列表来更改列表中匹配 "variable" 的任何标记以匹配 "special"?
示例:
语法
parent:
variable |
special;
variable:
ID;
special:
ID;
要解析的文本:"one two three four"
结果:变量,变量,变量,变量
后来我算了一下,我要"four"和特殊联系起来。所以结果应该改为:variable, variable, variable, special
这应该在文本没有实际更改的情况下发生。我尝试调查听众和访问者,但我不确定我将如何实际修改与节点关联的规则。我还发现这个例子看起来很相似,但它在 ANTLR3 中:Dynamically create lexer rule
在 运行 时间限定令牌的最直接方法可能是使用谓词有选择地伪造规则。这可以在解析器或词法分析器中完成。使用你的原型语法,并重新排列一下:
@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
规则。
我有一个名为 "variable" 的规则,它只与非关键字文本相关联。在运行时,我编译了一个应该与规则 "special" 相关联的字符串列表,它也只是普通文本,但是它定义在变量下面,因此实际上永远不会到达,因为所有内容都会首先匹配到变量。
在运行时,我如何使用此列表来更改列表中匹配 "variable" 的任何标记以匹配 "special"?
示例:
语法
parent:
variable |
special;
variable:
ID;
special:
ID;
要解析的文本:"one two three four"
结果:变量,变量,变量,变量
后来我算了一下,我要"four"和特殊联系起来。所以结果应该改为:variable, variable, variable, special
这应该在文本没有实际更改的情况下发生。我尝试调查听众和访问者,但我不确定我将如何实际修改与节点关联的规则。我还发现这个例子看起来很相似,但它在 ANTLR3 中:Dynamically create lexer rule
在 运行 时间限定令牌的最直接方法可能是使用谓词有选择地伪造规则。这可以在解析器或词法分析器中完成。使用你的原型语法,并重新排列一下:
@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
规则。