一种扩展java语法的简单方法

时间:2012-12-12 12:04:31

标签: java preprocessor

我想在java语法中进行一些更改。 例如我想使用运营商' +'添加矢量。所以我想要这段代码:

public class Vector2 {
    public float x, y;
    public Vector2(float x, float y) {this.x = x;this.y = y;}
    public String toString() {...}

    public static Vector2 operator+(Vector2 a, Vector2 b) {
        return new Vector2(a.x + b.x, a.y + b.y);
    }

    public static void main(String[] args) {
        Vector2 a = new Vector2(3, 6);
        Vector2 b = new Vector2(2, 8);
        System.out.println(a + b);
    }
}

将被转换为这个标准的java代码:

public class Vector2 {
    public float x, y;
    public Vector2(float x, float y) {this.x = x;this.y = y;}
    public String toString() {...}

    public static Vector2 operator_plus(Vector2 a, Vector2 b) {
        return new Vector2(a.x + b.x, a.y + b.y);
    }

    public static void main(String[] args) {
        Vector2 a = new Vector2(3, 6);
        Vector2 b = new Vector2(2, 8);
        System.out.println(Vector2.operator_plus(a, b));
    }
}

在编写自己的编译器时,是否有一些更好,更安全的方法来扩展java语法?

(我的意思不仅是运算符重载,而且基本上是扩展java语法的好方法。)

6 个答案:

答案 0 :(得分:6)

由于Java不支持运算符重载,如果您真的需要该语法,则需要更改语言。

答案 1 :(得分:2)

您可以查看Project Lombok的源代码以获取灵感。他们做了一些很酷的转换。

答案 2 :(得分:1)

你在谈论预处理器。快速答案是否定的 - java没有扩展语言的可能性。 但我建议你看MPS - 这是创建翻译和DSL的工具。但它包含一些扩展java语言的示例(video)。 MPS的主要优点之一是它具有IntelliJ IDEA插件 - 因此您可以轻松地将创建的扩展附加到此IDE并将其用作语法糖。

答案 3 :(得分:1)

这实际上取决于你想要做的扩展的类型。如果您想要扩展功能语言的典型扩展,您可以使用结合了OOP和功能范例的scala。也许你的扩展可以通过AspectJ和注释来解决。在最后一个资源中,您可以使用预编译器,但是如果您认为您的扩展稍微不清楚它是Java的目的,您可以考虑使用最适合您当前需求的另一种语言。

答案 4 :(得分:1)

我建议这样:

  1. 自己编写或获得一个简单的预处理器
  2. 替换创建一个调用预处理器的脚本 创建临时文件
  3. 使用java编译器构建这些临时文件

答案 5 :(得分:0)

如果你可以保持在java语法中,你可以创建注释处理器(javac插件)来做你想要的。注释处理器基本上是在编译时运行的java代码。 (请注意,注释处理器需要与注释有关)

在您的注释处理器的代码中使用一些hacks(基本类型转换),您可以访问javac的内部AST - 这包括在编译期间重写AST!

一个很好的介绍:The Hacker's Guide to Javac

用户使用插件时所要做的就是在使用javac进行编译时将.jar包含在类路径中,因此它非常易于使用。 (你可能也想做IDE插件)

这就是" Java-OO" javac-plugin将向Java添加运算符重载(运算符重载不需要任何语法更改,因此它可以与注释处理器一起使用)。这也是流行的Project Lombok所做的事情。

然而,访问javac内部所需的hacks是"没有文档/不支持",因此总是存在他们停止处理新版javac的危险。

相关问题