当前位置: 首页 > 面试题库 >

用Java语言添加或修改关键字

阳兴文
2023-03-14
问题内容

我知道我的问题似乎无效,但这是真实的。在编写Java时,我必须使用单词import以从classpath导入类。用户需要new在Java中启动某些对象和其他关键字。我的问题是,通过定义新的关键字以及它们的作用或修改现有的关键字来做同样的事情,我们是否甚至有一点点的改进能力和这种出色的语言。例如,而不是编写:

import java.io.File;

有什么可能将import单词修改为波斯尼亚语,例如:

uvoziti java.io.File;

一切都以相同的方式进行。在获得想法之前,请不要关闭。


问题答案:

一种使用相当复杂的工具链并被认为是“过大杀伤力”的方法,但是不如编写自己的编译器那么费力:

  • 从http://www.antlr.org/download.html下载ANTLR4
  • 在https://github.com/antlr/grammars-v4/blob/master/java/Java.g4下载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++;
            }
        }
    }

(当然,这只是一个示例,它
翻译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将打印而不是原始文本()import

  • 结果将是具有可怕格式的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<Integer, String>我之前提到的)。然后,必须使用运行时JavaCompiler或通过javac使用Runtime#exec手动调用输出文件来编写和编译输出文件。

但总的来说,我认为最好的做法是在几个小时内完成,而考虑到所有时间都比您想象的要长,则应该在一周内完成。

另一方面,编写自己的Java编译器可能会花费更长的时间,即使您认为一切花费的时间都比您想象的要长…



 类似资料:
  • 每次我用Java编写的方法的关键字都比多,每次我都用另一种方式编写它。有时“”有时“”等。 这些关键字的最佳顺序(最佳实践)是什么? [][][][][]???

  • 在 Flarum 中添加一种新的语言十分容易,只需按照下述的流程下载并安装你选择的语言包即可。 你添加一个语言包之后,你可以把它设置成你的论坛的默认语言。不论何时你感觉不需要其中一个安装过的语言包了,你都可以禁用它。 如果你正在使用任何第三方的扩展,一定要在开始动手之前读这部分。 语言包的安装 第一步,访问 Flarum 社区网站的Extensions > Language标签,并找到你想要安装的

  • 通过前面的学习我们了解到切片其实就是多个相同类型元素的连续集合,既然切片是一个集合,那么我们就可以迭代其中的元素,Go语言有个特殊的关键字 range,它可以配合关键字 for 来迭代切片里的每一个元素,如下所示: 第 4 行中的 index 和 value 分别用来接收 range 关键字返回的切片中每个元素的索引和值,这里的 index 和 value 不是固定的,读者也可以定义成其它的名字。

  • 主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为两个函数都传递数组的地址;我们通过地址来操作数组元素

  • 我正在尝试使用Java语言支持工具。所以我创建了一个项目,可以运行它,但我还需要引用外部库。因此,我试图通过以下方式添加一个jar文件:引用- 代码如下所示。这样,项目就无法建设。 任何关于将库添加到项目中的帮助都将不胜感激。

  • 问题内容: 问题发生在 包含该行的代码位于 所有这一切都在里面,这里是一个 当我触摸时,它可能会激活,这将创建另一个具有不同属性的属性,这些属性会从屏幕上掉下来并在不到一秒钟的时间内销毁自己。这是我创建粒子效果的方式。我们可以将其称为“粒子” ,就像构造函数中的参数一样。 一切正常,直到我添加另一个main为止。现在,我同时在屏幕上有两个,如果我触摸最新的,它可以正常工作并启动粒子。 但是,如果我