[英]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.