代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

人们会如何添加(次要)语法糖到Java?

  •  5
  • polygenelubricants  · 技术社区  · 15 年前

    假设我想向Java添加次要语法糖。只是添加regex模式文本,或者可能是base-2文本,或者多行字符串等一些小东西。没有什么重要的语法(至少现在)。

    你会怎么做?

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

    我可以编写Eclipse插件来做简单的源代码转换,然后再把它移植到标准的Java编译器吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   polygenelubricants    15 年前

    JRuby的技术负责人CharlesNutter用文字正则表达式扩展了javac。据我所知,他不得不改变大约三种情况。

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


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

    如需更多类似链接,请参阅我的列表 Links for javac hackers .

        2
  •  6
  •   Grundlefleck anujkk    15 年前

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

    (我可能对一些细节稍有了解,但我觉得我已经很接近了)。

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

    如果失败,您可以尝试更改javac编译器。虽然从我听说的,这可能是一个拖拉练习挫折谁不是编译器和Java专家。

        3
  •  3
  •   ewernli    15 年前

    你可以黑客 javac 具有 JSR 269 (可插拔的注释处理)。您可以钩住遍历源代码中语句的访问者并对其进行转换。

    例如,这里是要添加的转换的核心 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项目(在另一个答案中引用)是否使用相同的技术,但我想是的。

        4
  •  2
  •   akuhn    15 年前

    JRuby的技术负责人CharlesNutter用文字正则表达式扩展了javac。据我所知,他不得不改变大约三种情况。

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