我想创建一个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是构建类似您想要的东西的很好的基础。因此,恭喜您选择,实际上这只是交易的一半。