假设我想为Java添加次要的语法糖。就像添加正则表达式模式文字,或者可能是base-2文字或多行字符串等一样。没有什么重要的语法(至少现在)。如何将添加(次要)语法糖到Java?
怎么会这样做呢?
我是否需要扩展字节码编译器? (这是可能的吗?)
我可以在将Eclipse插件提供给标准Java编译器之前编写Eclipse插件来执行简单的源代码转换吗?
假设我想为Java添加次要的语法糖。就像添加正则表达式模式文字,或者可能是base-2文字或多行字符串等一样。没有什么重要的语法(至少现在)。如何将添加(次要)语法糖到Java?
怎么会这样做呢?
我是否需要扩展字节码编译器? (这是可能的吗?)
我可以在将Eclipse插件提供给标准Java编译器之前编写Eclipse插件来执行简单的源代码转换吗?
查尔斯纳特,JRuby中的技术领导,javac的扩展与字面正则表达式。据我所知,他必须改变大约3行的情况。
见http://twitter.com/headius/status/1319031705
这里是如何给新运营商加入到javac的一个真棒教程,http://www.ahristov.com/tutorial/java-compiler.html
更多这样的链接,看到我的Links for javac hackers名单。
+1作为我在我的回答中引用的帖子的原作者,信誉归功于你。 – ewernli 2010-03-08 15:52:00
这是真棒家伙! – polygenelubricants 2010-03-08 18:57:50
我会看看Project Lombok并尝试重复使用它们。他们使用Java 5注释来挂接Java代理,该代理可以在编译代码之前操纵抽象语法树。他们目前正致力于创建API以允许编写可以与javac一起使用的自定义转换器,或者主要的IDE(如Eclipse和NetBeans)。除了触发代码生成的注释外,他们还计划添加语法更改(可能是mixin或Java 7之前的关闭语法)。
(我可能略有些细节,但我认为我很接近)。
Lombok是开源的,所以研究他们的代码并试图在此基础上开发可能是一个好的开始。
如果失败了,您可以尝试更改javac编译器。尽管从我听说的情况来看,对于任何不是编译器和Java专家的人来说,这都可能成为挫败感。
值得注意的是,您可以使用JSR 269(可插入注释处理)对javac
进行破解。您可以挂钩访问源代码中的语句并对其进行转换的访问者。
这里是例如一个转换的核心support for roman number in java(当然,阅读完整的post了解更多详情)。这似乎相对容易。
public class Transform extends TreeTranslator {
@Override
public void visitIdent(JCIdent tree) {
String name = tree.getName().toString();
if (isRoman(name)) {
result = make.Literal(numberize(name));
result.pos = tree.pos;
} else {
super.visitIdent(tree);
}
}
}
这里有更多的资源:
我不知道,如果项目龙目岛(在对方的回答中引用)使用相同的技术,但我猜是。
AFAIK, Lombok仅使用注释来引导其Java代理,该代理直接挂接到编译器中。注释处理对它的功能有限制,我认为Lombok避开了这些限制。所有力量和灵活性与前向兼容性和遵守标准的论点都适用,更好的方法最终将取决于OP正在试图做什么:) – Grundlefleck 2010-03-07 13:43:23
这是一些优秀的指针。我仍然不确定自己是否能够轻松做我想做的事情,因为如果不扩展语法,我可能没有奢望去参观一棵树,但我绝对有一个地方可以开始阅读。 – polygenelubricants 2010-03-07 19:36:02
JRuby的技术负责人Charles Nutter用Java正则表达式扩展了Javac。据我所知,他必须改变大约3行的情况。
这是真棒家伙! – polygenelubricants 2010-03-08 18:57:07
我加入了这个答案,因为我只能选择一个官方答案。 – polygenelubricants 2010-03-08 19:04:31
好的,谢谢你这样做! – akuhn 2010-03-09 08:04:28
虽然这不是很有用,但您的问题让我想起了这个问题:http://www.iam.unibe.ch/~akuhn/blog/2008/roman-numerals-in-your-java/ – Esko 2010-03-07 11:29:21