1

在为基于 Java 的语言进行编译之前,我需要预处理一些代码 - 处理。在这种语言中,所有颜色类型的实例都需要用 int 替换。例如,这是一个代码片段:

color red = 0xffaabbcc;
color[][] primary = new color[10][10];

预处理后,上述代码应如下所示:

int red = 0xffaabbcc;
int[][] primary = new int[10][10];

我在非 Eclipse 环境中工作。我正在使用 Eclipse JDT ASTParser 来执行此操作。我已经实现了访问所有 SimpleType 节点的 ASTVisitor。以下是 ASTVisitor 实现的代码片段:

public boolean visit(SimpleType node) {
    if (node.toString().equals("color")) {
        System.out.println("ST color type detected: "
                + node.getStartPosition());
        // 1
        rewrite.replace(node,
                rewrite.getAST().newPrimitiveType(PrimitiveType.INT), null);
        // 2
        node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite
                .getAST().newSimpleName("int")); // 2
    }
    return true;
}

这里 rewrite 是 ASTRewrite 的一个实例。第 1 行无效(第 2 行已注释掉)。第 2 行导致抛出 IllegalArgumentException,因为 newSimpleName() 将不接受任何 java 关键字,如 int。

用正则表达式查找和替换所有颜色实例对我来说似乎不是正确的方法,因为它可能会导致不必要的更改。但我可能错了。

我怎样才能做到这一点?或者我可以采取任何替代解决方案或方法吗?

谢谢

更新编辑:这是执行 ASTRewrite 的片段:

    CompilationUnit cu = (CompilationUnit) parser.createAST(null);
    cu.recordModifications();
    rewrite = ASTRewrite.create(cu.getAST());
    cu.accept(new XQASTVisitor());

    TextEdit edits = cu.rewrite(doc, null);
    try {
        edits.apply(doc);
    } catch (MalformedTreeException e) {
        e.printStackTrace();
    } catch (BadLocationException e) {
        e.printStackTrace();
    }

XQAstVisitor 是包含上述访问方法的访问者类。我正在执行的其他替换可以正确执行。只有这一个会导致问题。

4

1 回答 1

0

我发现了你的错误!本声明:</p>

TextEdit edits = cu.rewrite(doc, null);

是不正确的。并应替换为以下语句:

TextEdit edits = rewrite.rewriteAST(doc, null);

最后,再次将修改后的 doc 解析到 CompilationUnit 中,将应用更改。更重要的是,声明:

node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite.getAST().newSimpleName("int"));

不需要。

于 2017-03-08T02:52:38.403 回答