MacOS下Xtext换行符丢失问题及FREE_TEXT终端修改咨询
解决Xtext中FREE_TEXT终端丢失换行符的问题
问题说明
输入内容为{TestData1}\n{TestData2}\n{TestData3}时,解析后换行符被FREE_TEXT的值转换器移除,最终结果变为{TestData1}{TestData2}{TestData3},需要调整代码以保留换行符。
修改方案
1. 优化FREE_TEXT终端规则(可选,增强匹配严谨性)
原终端规则本身并未排除换行符,但可以通过更清晰的写法避免歧义,同时使用非贪婪匹配防止过度捕获:
terminal EXT_INT: INT ('e'|'E')('-'|'+') INT; terminal FREE_TEXT: '}' ( '\{' | . )*? ('{');
说明:用
.替代!('{'),明确匹配任意字符(包括换行);*?为非贪婪匹配,确保每个FREE_TEXT只匹配一对}{之间的内容。
2. 修正值转换器代码
原转换器的行分隔符判断逻辑会误删换行,同时存在转义字符替换的语法错误,修改后代码如下:
public class TestExpressionValueConverter extends DefaultTerminalConverters { @ValueConverter(rule = "FREE_TEXT") public IValueConverter<String> FREE_TEXT() { return new IValueConverter<String>() { @Override public String toValue(String string, INode node) throws ValueConverterException { String result = string; // 移除开头的'}' if (result.startsWith("}")) { result = result.substring(1); } // 移除结尾的'{' if (result.endsWith("{")) { result = result.substring(0, result.length() - 1); } // 修正转义字符替换:Java中反斜杠需双重转义 result = result.replace("\\\\", "\\"); // 还原转义的左大括号 result = result.replace("\\{", "{"); return result; } @Override public String toString(String value) throws ValueConverterException { // 输出时转义内容中的左大括号,避免语法冲突 return "}" + value.replace("{", "\\{") + "{"; } }; } }
修改要点
- 移除原代码中针对行分隔符的特殊截取逻辑:直接统一处理首尾的
}和{,避免误删换行符。 - 修复转义字符替换的语法错误:原代码
result.replace("\\", "\");无法编译,正确写法需对反斜杠做双重转义。 - 输出方法补充转义逻辑:确保内容中的
{能被正确转义,符合FREE_TEXT的语法规则。
内容的提问来源于stack exchange,提问作者Ravi Bodla
相关产品推荐
相关产品推荐

