我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4,但我在字符串规则方面遇到了问题。
STRING :
'\''!
(
~('\'' | '\\' | '\r' | '\n')
)*
'\''!
;
这创建了一个STRING
其文本包含字符串内容的标记,但是不含开始和结束引号,因为!
引号文字后面的符号。
ANTLR 4 扼流圈!
象征, ('!' came as a complete surprise to me (AC0050)
)但如果我将其关闭,我最终会得到包含引号的标记,这不是我想要的。将其移植到 ANTLR 4 的正确方法是什么?
Antlr4 通常将标记视为不可变的,至少在不支持语言中立等价物的意义上!
.
也许实现同等效果的最简单方法是:
string : str=STRING { Strings.unquote($str); } ;
STRING : SQuote ~[\r\n\\']* SQuote ;
fragment SQuote : '\'' ;
where Strings.unquote
is:
public static void unquote(Token token) {
CommonToken ct = (CommonToken) token;
String text = ct.getText();
text = .... unquote it ....
ct.setText(text);
}
使用解析器规则的原因是因为词法分析器(当前)不支持属性引用。尽管如此,它仍然可以根据词法分析器规则来完成 - 只是需要稍微多一点努力来挖掘令牌。
修改令牌文本的另一种方法是使用自定义字段和方法实现自定义令牌。看这个答案 https://stackoverflow.com/questions/32520813/using-antlr4-to-generate-modified-code如果有兴趣的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)