4

我想创建一个 Java 转译器,它将读取几乎 Java 代码(称为 JavaHash)并在另一端发出“纯”Java 代码。特别是,我想在 hashmap 成员前面添加一个新的标记“#”,这样我就可以像访问 JavaScript 哈希对象一样访问它:

Map<String, String> foo = new HashMap<String, String>();
...
foo.put("name", "Roger");
...
String name = #foo.name;

我无法让 JavaParser 执行任何操作,只能在“#”标签上抛出错误。

有没有办法在解析令牌之前捕获它们?

4

1 回答 1

6

这远非微不足道,而是可行的。

JavaParser 基于JavaCC,它使用以下语法生成解析器代码。然后解析器使用代码模型类创建一个抽象语法树。

如果您想添加新的语言元素,您需要:

  • 实现代码模型类;
  • 扩展用于解析器生成的语法。

这并不容易,您需要对 JavaCC 有很好的了解和理解。但这绝对是可行的。

剩下的就是花生了。您将编写一个访问者并使用它来遍历 AST。一旦遇到适当类型的节点,只需将 AST 的部分转换为“普通”Java 并序列化。

顺便说一句,JavaParser 是构建您想要的东西的非常好的基础。所以恭喜你的选择,这实际上是成功的一半。

于 2018-05-09T19:25:18.317 回答