我想在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语法的好方法。)
答案 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)
我建议这样:
答案 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的危险。