【问题标题】:How would one go about adding (minor) syntactic sugars to Java?如何向 Java 添加(次要)语法糖?
【发布时间】:2011-01-24 15:49:51
【问题描述】:

假设我想在 Java 中添加一些小的语法糖。只是添加正则表达式模式文字、base-2 文字或多行字符串等小事。在语法上没什么大不了的(至少目前如此)。

要怎么做呢?

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

在将源代码输入标准 Java 编译器之前,我可以编写 Eclipse 插件来进行简单的源代码转换吗?

【问题讨论】:

标签: java eclipse language-features syntactic-sugar


【解决方案1】:

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

(我可能有一些细节略有偏差,但我认为我非常接近)。

Lombok 是开源的,因此研究他们的代码并尝试在此基础上进行构建可能是一个好的开始。

否则,您可以尝试更改 javac 编译器。尽管据我所知,对于不是编译器和 Java 专家的任何人来说,这可能是一件令人头疼的事情。

【讨论】:

    【解决方案2】:

    你可以用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);
            }
        }
    }
    

    以下是其他资源:

    我不知道 Lombok 项目(在另一个答案中引用)是否使用相同的技术,但我想是的。

    【讨论】:

    • AFAIK,Lombok 仅使用注释来引导其 Java 代理,该代理直接连接到编译器。注释处理有它可以做的限制,我认为 Lombok 回避了这些限制。所有关于权力和灵活性与前向兼容性和遵守标准的论点都适用,更好的方法最终将取决于 OP 到底想要做什么:)
    • 这是一些很好的建议。我仍然不确定我是否可以轻松地做我想做的事,因为我可能没有奢侈的去拜访一棵树来转换而不扩展语法,但我绝对有一个地方可以开始阅读。
    【解决方案3】:

    JRuby 的技术主管 Charles Nutter 使用文字正则表达式扩展了 Javac。据我记得,他必须更改大约 3 行大小写。

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


    这里有一个很棒的教程,教你如何在 javac 中添加一个新的操作符,http://www.ahristov.com/tutorial/java-compiler.html

    有关更多类似链接,请参阅我的Links for javac hackers 列表。

    【讨论】:

    • +1 作为我在回答中引用的帖子的原作者,感谢您。
    【解决方案4】:

    JRuby 的技术主管 Charles Nutter 使用文字正则表达式扩展了 Javac。据我记得,他必须更改大约 3 行大小写。

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

    【讨论】:

    • 我将这个答案加入了另一个答案,因为我只能选择一个官方答案。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2014-10-17
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多