我有一个名为"变量"它只与非关键字文本相关联。在运行时,我编译了一个应该与规则相关联的字符串列表" special"这也只是普通文本,但是它定义在变量下面,因此从未实际到达,因为所有内容都将首先与变量匹配。
在运行时期间,如何使用此列表更改任何匹配"变量"这些也在列表中以匹配"特殊"?
示例:
语法
parent:
variable |
special;
variable:
ID;
special:
ID;
要解析的文字:"一个二三四"
结果:变量,变量,变量,变量
后来我计算出我想要"四"与特殊相关联。所以结果应该改为:变量,变量,变量,特殊
这应该在文本实际没有变化的情况下发生。我试着调查听众和访问者,但我不确定如何实际修改与节点关联的规则。我也发现这个例子看起来很相似,但它在ANTLR3中:Dynamically create lexer rule
答案 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令牌。