You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:05:57