我将js字符串解析为抽象语法树,然后更改StringLiteral节点的值,并且需要将整个Ast内容写回到字符串中。
但是,当我使用toSource方法时,来自StringLiterals值的特殊字符在ISO-8859-1中进行编码。

例:

在课堂测试中:

public static void main(){
  testString = " Assignment = 'Glück'; "

  CompilerEnvirons env = new CompilerEnvirons();
  AstRoot astRoot = new Parser(env).parse(testString, null, 1);

  PrintVisitor visitor = new PrintVisitor();
  astRoot.visitAll(visitor);
}


在类PrintVisitor中扩展NodeVisitor:

@Override
public boolean visit(AstNode node) {
  if (node.getClass() == StringLiteral.class){
    StringLiteral sl = (StringLiteral) node;
    System.out.println("value: " + sl.getValue());
    System.out.println("src: " + sl.toSource());
  }
}


输出:

value: Glück
src: 'Gl\xfcck"


如您所见,该值以正确的编码存储,但是toSource方法返回转义的ISO-8859-1字符。

您是否知道任何使toSource方法返回UTF-8的方法?
还是您可以建议采用其他任何方式来逆转解析过程,以便让我从整个ast那里获取纯文本?

我花了很多时间寻找节点或解析器的任何属性,并尝试对输出字符串进行后处理,但未找到任何结果。

感谢您的帮助!

最佳答案

似乎是StringLiteral#toSource() escapes the value

如果只想包含随附的报价,请尝试:

StringLiteral sl = (StringLiteral) node;
String value = sl.getValue(true); // "Glück"

09-27 06:10