我知道我的问题似乎不合适,但它是真实的。在编写java时,我必须使用单词import
,以便从classpath导入类。用户new
需要在java中启动某些对象和其他关键字。我的问题是,我们是否通过定义新关键字及其执行的操作或修改现有关键字来做同样的事情,是否有最轻微的改进能力和这种优秀的语言。例如,而不是写:
import java.io.File;
例如,有什么可能将import
单词修改为波斯语:
uvoziti java.io.File;
这一切都以同样的方式运作。在得到想法之前请不要关闭。
答案 0 :(得分:9)
使用相当复杂的工具链的一种方法可以被认为是“过度杀伤”,但是没有像编写自己的编译器那么多的努力:
运行
java -classpath "antlr-4.4-complete.jar" org.antlr.v4.Tool Java.g4
这将生成一些文件,其中一个是JavaLexer.java
。
JavaLexer.java
创建一个类似下面的类,进行翻译:
import java.io.IOException;
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;
public class Main {
public static void main(String[] args) throws IOException {
CharStream s = new ANTLRFileStream("Input.javaX");
JavaLexer lexer = new JavaLexer(s);
TokenStream t = new CommonTokenStream(lexer);
int i = 1;
while (true) {
if (t.LA(i) == -1) {
break;
}
if (t.LA(i) == JavaLexer.IMPORT) {
System.out.print("import ");
} else {
System.out.print(t.LT(i).getText() + " ");
}
i++;
}
}
}
(当然,这只是仅转换IMPORT
令牌的示例,该令牌在语法文件中定义为"uvoziti"
。灵活的翻译,可以在外部文件中定义翻译,并且可能会读取此文件以创建将Map<Integer, String>
映射到JavaLexer.IMPORT
等的地图"import"
...)
从示例创建输入文件:Input.javaX
:
uvoziti java.io.File;
public class Input
{
public static void main(String args[])
{
File file = null;
System.out.println("done");
}
}
当您运行Main
时,它将读取此输入文件,最终找到IMPORT
令牌,而不是原始文本(uvoziti
),它将打印{{1 }}。
结果将是Java文件的内容,格式错误......
import
但是很有必要,编译器并不关心格式化:您可以将此输出直接写入import java . io . File ; public class Input { public static void main ( String args [ ] ) { File file = null ; System . out . println ( "done" ) ; } }
文件,编译器将吞下它。
正如这里所描述的那样,它只是一个概念证明。对于许多(所有)关键字的灵活和通用的翻译,人们将不得不围绕所有关键词构建一些基础设施。应自动读取输入文件(.java
,递归读取包)。他们每个人都必须翻译(使用我前面提到的File.listFiles()
)。然后必须使用运行时JavaCompiler编写和编译输出文件,或者使用Runtime#exec手动调用Map<Integer, String>
。
但总的来说,我认为在最好的情况下,这应该在几个小时内完成,并且在一周内考虑到所有事情都需要比你想象的更长。
另一方面,编写自己的Java编译器可能需要更长的时间,即使你认为所有事情都需要比你想象的更长的时间......答案 1 :(得分:0)
Java没有提供重新定义关键字的任何方法。
如果您在Java语言中添加或删除关键字,那么它就不再是Java了。
您可以编写自己编译为Java的语言。这可以像编写一个为uvoziti
执行字符串替换import
的程序一样简单,然后通过javac
编译器运行它。
答案 2 :(得分:0)
作为一个选项,使用类似预处理器的东西或编写自己的代码,在将此代码传递给javac编译器之前,通过将bosnian单词替换为英语单词来处理java代码。
我认为这种方法适用于您的情况。
答案 3 :(得分:0)
Java本身并不能为您提供帮助。
您可能希望将代码传递给预处理器,但事情看起来有点疯狂:Can I have macros in Java source files。 我从来没有做过这样的事情,所以我不确定它会按预期工作。
另外,请注意,在此更改之后,您的代码只有了解波士尼亚人才能阅读。
答案 4 :(得分:0)
你无法真正解决这个问题一般来说; java在其语言规范中严格定义了关键字,并且java语言中没有添加关键字的机制(例如宏)。
部分解决方案是创建一个预处理器,将新关键字转换为普通java。毋庸置疑,这对于集成到通用工具链中是一件痛苦的事情,对于预处理器创建的构造,您将不再获得有用的编译器错误消息。
进一步的是编写自己的编译器;再次,它与现有的工具链很差地集成在一起。您仍然无法从IDE获得适当的支持。
这个想法很吸引人;这些障碍使其在通用时非常不切实际。
编译时宏语言附带的语言情况不同(大多数汇编语言都有这种情况)。 C的定义是另一个例子。它们仍然存在基于预处理器的问题,因此添加的构造更复杂(只有基本的语法检查等)。
答案 5 :(得分:-1)
JVM和JDK理解Java关键字。如果要更改为您的语言,则还必须更改JDK和JVM。