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

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

除了将“#”主题标签引发错误外,我无法使JavaParser做任何事情。

有没有在 token 解析之前捕获 token 的方法?

最佳答案

这远非琐碎,但可行。

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

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

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

  • 这不是那么容易,您将需要对JavaCC有充分的了解和理解。但这绝对是可行的。

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

    顺便说一下,JavaParser是构建类似您想要的东西的很好的基础。因此,恭喜您选择,实际上这只是交易的一半。

    07-28 00:47
    查看更多