扩展java语法的简单方法

扩展java语法的简单方法,java,preprocessor,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) {

我想对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语法的好方法。)

因为java不支持运算符重载,如果您真的需要该语法,您需要更改语言。

因为java不支持运算符重载,如果你真的想要这种语法,你需要改变语言。

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

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

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

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

这实际上取决于您想要执行的扩展类型。如果您想要一种典型的函数式语言的扩展,您可以使用结合了OOP和函数式范例的扩展。也许您的扩展可以通过组合注释和注释来解决。在最后一个资源中,你可以使用预编译器,但是如果你认为你的扩展几乎没有什么意义,java的目的,你可以考虑使用最适合你当前需要的另一种语言。

它将取决于你想做的扩展类型。如果您想要一种典型的函数式语言的扩展,您可以使用结合了OOP和函数式范例的扩展。也许您的扩展可以通过组合注释和注释来解决。在最后一个资源中,你可以使用预编译程序,但是如果你认为你的扩展几乎没有什么意义,java的目的,你可以考虑使用最适合你当前需要的另一种语言。

< P>我建议这样:

  • 写你自己的或得到一个预处理器,这将使简单
  • 替换创建一个脚本,该脚本将调用预处理器 创建临时文件
  • 使用java编译器构建这些临时文件
  • 我建议这样做:

  • 写你自己的或得到一个预处理器,这将使简单
  • 替换创建一个脚本,该脚本将调用预处理器 创建临时文件
  • 使用java编译器构建这些临时文件

  • 如果您可以停留在java语法中,那么您可以创建注释处理器(javac插件)来做您想做的事情。注释处理器基本上是编译时运行的java代码。(请注意,注释处理器不需要与注释有任何关系)

    在注释处理器的代码中使用一些技巧(基本上是强制转换),就可以访问javac的内部AST——这包括在编译时重写AST

    很好的介绍:

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

    这就是“javac插件”向Java添加运算符重载所做的工作(运算符重载不需要任何语法更改,因此它可以与注释处理器配合使用)。这也是大众所做的



    然而,访问javac内部所需的黑客是“未记录/不受支持的”,因此他们总是有停止开发新版本javac的危险。

    如果您能够遵守java语法,您可以创建注释处理器(javac插件)来做您想做的事情。注释处理器基本上是编译时运行的java代码。(请注意,注释处理器不需要与注释有任何关系)

    在注释处理器的代码中使用一些技巧(基本上是强制转换),就可以访问javac的内部AST——这包括在编译时重写AST

    很好的介绍:

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

    这就是“javac插件”向Java添加运算符重载所做的工作(运算符重载不需要任何语法更改,因此它可以与注释处理器配合使用)。这也是大众所做的



    然而,访问javac内部所需的黑客是“未记录/不受支持的”,因此他们总是有停止开发javac新版本的危险。

    我认为Scala允许您这样做。如果您想扩展java语法,我想您需要编写自己的语法compiler@Thilo对但是我想对java语法做一些小的改变,而不是完全改变编程语言。您想如何从IDE或手动编译代码?我认为Scala允许您这样做。如果您想扩展java语法,我想您需要编写自己的代码compiler@Thilo是的,但是我想对java语法做一些小的修改,未完全更改编程语言。您希望如何从某个IDE或手动编译代码?