2010-03-07 23 views
5

假设我想为Java添加次要的语法糖。就像添加正则表达式模式文字,或者可能是base-2文字或多行字符串等一样。没有什么重要的语法(至少现在)。如何将添加(次要)语法糖到Java?

怎么会这样做呢?

我是否需要扩展字节码编译器? (这是可能的吗?)

我可以在将Eclipse插件提供给标准Java编译器之前编写Eclipse插件来执行简单的源代码转换吗?

+4

虽然这不是很有用,但您的问题让我想起了这个问题:http://www.iam.unibe.ch/~akuhn/blog/2008/roman-numerals-in-your-java/ – Esko 2010-03-07 11:29:21

回答

2

查尔斯纳特,JRuby中的技术领导,javac的扩展与字面正则表达式。据我所知,他必须改变大约3行的情况。

http://twitter.com/headius/status/1319031705


这里是如何给新运营商加入到javac的一个真棒教程,http://www.ahristov.com/tutorial/java-compiler.html

更多这样的链接,看到我的Links for javac hackers名单。

+0

+1作为我在我的回答中引用的帖子的原作者,信誉归功于你。 – ewernli 2010-03-08 15:52:00

+0

这是真棒家伙! – polygenelubricants 2010-03-08 18:57:50

6

我会看看Project Lombok并尝试重复使用它们。他们使用Java 5注释来挂接Java代理,该代理可以在编译代码之前操纵抽象语法树。他们目前正致力于创建API以允许编写可以与javac一起使用的自定义转换器,或者主要的IDE(如Eclipse和NetBeans)。除了触发代码生成的注释外,他们还计划添加语法更改(可能是mixin或Java 7之前的关闭语法)。

(我可能略有些细节,但我认为我很接近)。

Lombok是开源的,所以研究他们的代码并试图在此基础上开发可能是一个好的开始。

如果失败了,您可以尝试更改javac编译器。尽管从我听说的情况来看,对于任何不是编译器和Java专家的人来说,这都可能成为挫败感。

3

值得注意的是,您可以使用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); 
     } 
    } 
} 

这里有更多的资源:

我不知道,如果项目龙目岛(在对方的回答中引用)使用相同的技术,但我猜是。

+0

AFAIK, Lombok仅使用注释来引导其Java代理,该代理直接挂接到编译器中。注释处理对它的功能有限制,我认为Lombok避开了这些限制。所有力量和灵活性与前向兼容性和遵守标准的论点都适用,更好的方法最终将取决于OP正在试图做什么:) – Grundlefleck 2010-03-07 13:43:23

+0

这是一些优秀的指针。我仍然不确定自己是否能够轻松做我想做的事情,因为如果不扩展语法,我可能没有奢望去参观一棵树,但我绝对有一个地方可以开始阅读。 – polygenelubricants 2010-03-07 19:36:02

相关问题