在java语言中添加或修改关键字
我知道我的问题似乎不正确,但它是真实的。在编写java时,我必须使用单词在java语言中添加或修改关键字,java,keyword,Java,Keyword,我知道我的问题似乎不正确,但它是真实的。在编写java时,我必须使用单词import,以便从类路径导入类。需要用户new来启动java中的某些对象和其他关键字。我的问题是,我们是否有能力通过定义新的关键字和它们做什么或修改现有关键字来做同样的事情来改进和改进这门伟大的语言。例如,不要写: import java.io.File; 有什么可能修改导入波斯尼亚语的单词,例如: uvoziti java.io.File; 这一切都是一样的。在我有想法之前请不要关闭。Java不提供任何重新定义关键字
import
,以便从类路径导入类。需要用户new
来启动java中的某些对象和其他关键字。我的问题是,我们是否有能力通过定义新的关键字和它们做什么或修改现有关键字来做同样的事情来改进和改进这门伟大的语言。例如,不要写:
import java.io.File;
有什么可能修改导入波斯尼亚语的单词,例如:
uvoziti java.io.File;
这一切都是一样的。在我有想法之前请不要关闭。Java不提供任何重新定义关键字的方法
如果在Java语言中添加或删除关键字,那么它就不再是Java了
您可以编写自己的语言来编译成Java。这可能很简单,只需编写一个程序,为导入执行字符串替换uvoziti
,然后通过javac
编译器运行它。作为一个选项,使用类似预处理器的东西或编写自己的预处理器,在将代码传递给javac编译器之前,通过将波斯尼亚语替换为英语来处理java代码
我认为这种方法应该适合您的情况。Java本身在这方面对您没有帮助
您可能希望通过预处理器传递代码,但事情开始变得有点疯狂:。
我从来没有做过这样的事情,所以我不确定它是否会像预期的那样工作
也可以认为,在这种改变之后,你的代码只能由理解波斯尼亚的人阅读。
< Pv> JVM和JDK理解java关键字。如果你想转换成你的语言,那么你也必须改变JDK和JVM。你不能真正解决这个问题,以使其通用;java在其语言规范中严格定义了关键字,java语言中没有添加关键字(例如宏)的机制
部分解决方案是创建一个预处理器,将新关键字转换为普通java。不用说,集成到公共工具链中是一件痛苦的事情,对于由预处理器创建的构造,您将不再获得有用的编译器错误消息
更进一步的一步是编写自己的编译器;同样,这与现有的工具链集成得很差。您仍然没有从IDE获得适当的支持
尽管这个想法很吸引人;这些障碍使得它非常不适用于一般用途
在编译时宏语言附带的语言中,情况有所不同(大多数汇编语言都有这种情况)。C的定义是另一个例子。它们仍然存在基于预处理器的问题,因此添加的构造更为复杂(仅限于基本语法检查等)。一种使用相当复杂的工具链的方法,可以被视为“过度杀伤力”,但没有编写自己的编译器那么费力:
- 从下载ANTLR4
- 下载Java语法,网址为
- 根据需要修改Java语法
- 跑
java -classpath "antlr-4.4-complete.jar" org.antlr.v4.Tool Java.g4
这将生成一些文件,其中一个是JavaLexer.java
- 创建一个包含ANTLR JAR和
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++;
}
}
}
(当然,这只是一个示例,仅翻译导入
标记,该标记在语法文件中定义为“uvoziti”
。对于更一般和更灵活的翻译,可以在外部文件中定义翻译,并可能读取此文件以创建映射到JavaLexer.IMPORT
到“IMPORT”
等的映射map
)
- 从示例中创建输入文件:
input.javaX
:
uvoziti java.io.File;
public class Input
{
public static void main(String args[])
{
File file = null;
System.out.println("done");
}
}
然后运行Main
时,它将读取此输入文件,最终找到IMPORT
标记,并将打印IMPORT
,而不是原始文本(uvoziti
)
- 结果将是一个Java文件的内容,格式糟糕
import java . io . File ; public class Input { public static void main ( String args [ ] ) { File file = null ; System . out . println ( "done" ) ; } }
但第四,编译器并不关心格式:您可以将此输出直接写入.java
文件,编译器将吞下它
正如这里所描述的,它只是概念的证明。对于许多(所有)关键词的灵活和通用翻译,必须围绕这些构建一些基础设施。应自动读取输入文件(File.listFiles()
,对于包是递归的)。它们中的每一个都需要翻译(使用我前面提到的Map
)。然后,必须使用运行时编写和编译输出文件,或者使用手动调用javac
但总的来说,我认为这在最好的情况下应该在几个小时内完成,在考虑到所有事情都比你想象的要长的情况下,应该在一周内完成
编写一个自己的java编译器,另一方面,可能需要更长的时间,即使当你认为一切都比你想象的要长……/P>你可以用自己喜欢的任何词来编写自己的“java”编译器。唯一的可能是写你自己的语言。Java是开源的,我不确定分支的许可证是什么。用波斯尼亚语定义Java比更新现有的Java更容易!!想象一下,必须使用有自己自定义关键字的代码……用英语编写的代码只有懂英语的人才能理解@斯坦利,没错,但是如果你测量人们理解英语和你了解波斯尼亚人的话,你可以知道为什么代码语法在英语中是正确的,但是请考虑一下,即使是英语,谁也可以灵活地定义新的关键字和新的执行顺序和命令。