Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Добавить или изменить ключевые слова на языке Java

Автор вопроса: ErrorNotFoundExceptionОтветов: 6

Я знаю, что мой вопрос кажется неуместным, но он искренний. При написании java я должен использовать слово import, чтобы импортировать классы из пути к классам. Пользователю new требуется инициировать определенные объекты и другие ключевые слова в java. Мой вопрос заключается в том, есть ли у нас хоть малейшая возможность улучшить этот великолепный язык путем определения новых ключевых слов и того, что они делают, или изменения существующего ключевого слова, чтобы делать то же самое. Например, вместо того, чтобы писать:

import java.io.File;

Какая возможность изменить слово import на боснийский, например:

uvoziti java.io.File;

и все работает так же. Пожалуйста, не закрывайте, пока у меня не появятся идеи.

  • Вы можете написать свой собственный компилятор Java с любыми зарезервированными словами, которые вам нравятся. Eran 02.09.2014
  • всего наилучшего в ваших начинаниях! Vihar 02.09.2014
  • Единственная возможность - написать свой собственный язык. У Java есть открытые исходники, я не уверен, как там с лицензией на ветвление. Danubian Sailor 02.09.2014
  • Легко определить Java на боснийском языке, чем обновить существующую Java! CHowdappaM 02.09.2014
  • Представьте, что вам приходится работать с кодом, имеющим собственные ключевые слова... Alexis Leclerc 02.09.2014
  • Правильный запрос на новую версию Java, которая поддерживает своего рода словарь. Это означает, что JDK содержит такой словарь, который содержит сопоставление между переведенными ключевыми словами и оригиналом. И что касается добавления ключевых слов, это невозможно, поскольку ключевые слова представляют фиксированное действие. Reporter 02.09.2014

javakeyword

Ответы

Ответ 1 · рейтинг 10 · Marco13

Один подход, который использует довольно сложную цепочку инструментов и может рассматриваться как "излишняя", но не так много усилий, как написание собственного компилятора или около того:

  • Загрузите ANTLR4 с http://www.antlr.org/download.html.
  • Загрузите грамматику Java по адресу https://github.com/antlr/grammars-v4/blob/master/java/Java.g4
  • Измените грамматику Java в соответствии с вашими потребностями...
  • Бегать

    java -classpath "antlr-4.4-complete.jar" org.antlr.v4.Tool Java.g4
    

    Это создаст несколько файлов, один из которых JavaLexer.java.

  • Создайте проект 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 с помощью Время выполнения#exec.

Но в целом, я думаю, что это должно быть выполнимо в лучшем случае за несколько часов, а в течение одной недели, если учесть, что все занимает больше времени, чем вы думаете.

С другой стороны, написание собственного компилятора Java может занять немного больше времени, даже если учесть, что все занимает больше времени, чем вы думаете...

Ответ 2 · Kevin Boyle

Java не предоставляет никакого способа переопределения ключевых слов.

Если вы добавляете или удаляете ключевые слова в языке Java, это уже не Java.

Вы можете написать свой собственный язык, который компилируется в Java. Это может быть так же просто, как написать программу, которая заменяет строку uvoziti на import, а затем запускает ее через компилятор javac.

Ответ 3 · Community

Как вариант, использовать что-то вроде препроцессора или написать свой, чтобы обработать java-код через замену боснийских слов на английские перед передачей этого кода компилятору javac.

Я думаю, что этот подход должен работать для вашего случая.

Ответ 4 · Alberto Zaccagni

Java сама по себе не поможет вам в этом.

Возможно, вы захотите передать свой код через препроцессор, но все начинает выглядеть немного безумно: Могу ли я иметь макросы в исходных файлах Java. Я никогда не делал ничего подобного, поэтому я не уверен, что это сработает так, как задумано.

Кроме того, учтите, что после этого изменения ваш код смогут читать только люди, понимающие боснийский язык.

Ответ 5 · Durandal

Вы не можете решить это, чтобы работать в целом; java строго определяет ключевые слова в своей языковой спецификации, и в языке java нет механизма для добавления ключевых слов (например, макросов).

Частичным решением было бы создание препроцессора, который переводит ваши новые ключевые слова в обычный java. Излишне говорить, что это больно интегрировать в общие цепочки инструментов, и вы больше не будете получать полезные сообщения об ошибках компилятора для конструкций, созданных препроцессором.

Еще одним шагом будет написание собственного компилятора; опять же, это плохо интегрируется с существующими наборами инструментов. Вы по-прежнему не получаете должной поддержки от вашей IDE.

Как увлекательно, как идея; препятствия делают его крайне непрактичным для общего использования.

Ситуация отличается в языках, которые поставляются с макроязыком времени компиляции (у большинства языков ассемблера он есть). Определение C - еще один пример. У всех них по-прежнему есть проблема, заключающаяся в том, что они основаны на препроцессоре, поэтому добавленные конструкции более сложны (только базовая проверка синтаксиса и т. д.).

Ответ 6 · рейтинг -1 · CHowdappaM

JVM и JDK понимают ключевые слова Java. Если вы хотите перейти на свой язык, вам также необходимо изменить JDK и JVM.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы