[JAVA] 21 Lesen Sie das Skript aus der Datei und führen Sie es aus

Einführung

Bisher haben wir den Interpreter implementiert, aber das Skript wurde direkt in die Programmquelle geschrieben. In diesem Artikel können Sie Skripte aus Textdateien lesen und ausführen.

Dieser Artikel ist eine Fortsetzung von "Unterstützt statische Methodenaufrufe".

Was Sie tun möchten, indem Sie ein Skript aus einer Datei lesen und ausführen

Lesen Sie das Skript aus der Datei und stellen Sie sicher, dass Sie es ausführen möchten.

Beispielsweise gibt es eine Textdatei, die das folgende Skript beschreibt. Dieses Skript ist ein Programm, das Fibonacci-Zahlen von 0 bis 6 ausgibt. Führen Sie dieses Skript aus und versuchen Sie, die Fibonacci-Nummer auszugeben.

fibo.txt


function fibonacci(n) {
  if (n == 0) {
    return 0
  } else if (n == 1) {
    return 1
  } else {
    return fibonacci(n - 2) + fibonacci(n - 1)
  }
}

var i = 0
while (i <= 6) {
  var n = fibonacci(i)
  println("f(" + i.toString() + ") -> " + n.toString())
  i = i + 1
}

Wie zu implementieren

Rufen Sie den Dateinamen aus dem Befehlszeilenargument ab und lesen Sie den Dateiinhalt. Stellen Sie eine Klasse vor, die den gelesenen Inhalt in der Reihenfolge der Phrasenanalyse (Lexer), Syntaxanalyse (Parser) und Interpreter (Interpreter) verarbeitet. Führen Sie eine Treiberklasse ein, die eine solche Verarbeitung durchführt.

Versuchen Sie, in Java zu implementieren

Fahren Sie mit der Implementierung fort. Schauen wir uns die installierten Treiberklassen der Reihe nach an.

Driver.java

Eine Implementierung von Driver.java.

Treiberklassenkonstruktor. Instanziieren und bereiten Sie das Parsen von Phrasen (Lexer), das syntaktische Parsen (Parser) und den Interpreter (Interpreter) für die spätere Verarbeitung vor.

Driver.java


public class Driver {

    Lexer lexer;
    Parser parser;
    Interpreter interpreter;
    
    public Driver() {
        lexer = new Lexer();
        parser = new Parser();
        interpreter = new Interpreter();
    }

Die Methode execute (), mit der das Skript ausgeführt wird. Die Methode execute () führt die folgenden Operationen der Reihe nach aus.

Die Feldvariable variables enthält den Wert der globalen Variablen des Interpreter nach der Ausführung, die zur Ausführung führt. Die Feldvariable "Ausnahme" enthält die Ausnahmen, die während der Ausführung ausgelöst werden.

Driver.java


    public Map<String, Interpreter.Variable> variables;
    public Exception exception;
    
    public int execute(String[] args) {
        try {
            validateArguments(args);
            String path = args[0];
            String text = readText(path);
            variables = run(text);
            return 0;
        } catch (Exception e) {
            exception = e;
            System.err.println(e.getMessage());
            return -1;
        }
    }

Die Methode validateArguments (), mit der die Gültigkeit von Befehlszeilenargumenten überprüft wird. Ein Befehlszeilenargument wird angegeben, um zu überprüfen, ob es sich um eine Datei handelt. Wenn das Überprüfungsergebnis falsch ist, wird eine Ausnahme ausgelöst.

Driver.java


    public static final String ARGS_NULL = "Arguments were null.";
    public static final String NO_ARGS = "No Arguments.";
    public static final String FILE_NOT_FOUND = "File not found.: ";
    public static final String PATH_NOT_FILE = "The path was not a file.: ";
    
    public void validateArguments(String[] args) throws Exception {
        if (args == null) {
            throw new Exception(ARGS_NULL);
        }
        if (args.length != 1) {
            throw new Exception(NO_ARGS);
        }
        String path = args[0];
        File f = new File(path);
        if (!f.exists()) {
            throw new FileNotFoundException(FILE_NOT_FOUND + path);
        }
        if (!f.isFile()) {
            throw new Exception(PATH_NOT_FILE + path);
        }
    }

Die readText -Methode, die den Dateiinhalt liest und zurückgibt. Es wird angenommen, dass der Zeichencode des Dateiinhalts UTF-8 ist.

Driver.java


    public String readText(String path) throws IOException {
        return new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
    }

Die Methode run (), mit der das Skript für den Dateiinhalt ausgeführt wird. Die Verarbeitung erfolgt in der Reihenfolge der Phrasenanalyse (Lexer), Syntaxanalyse (Parser) und Interpreter (Interpreter).

Driver.java


    public Map<String, Interpreter.Variable> run(String text) throws Exception {
        exception = null;
        variables = null;
        List<Token> tokens = lexer.init(text).tokenize();
        List<Token> blk = parser.init(tokens).block();
        return interpreter.init(blk).run();
    }

Die main () Methode, die zur Laufzeit der Ausgangspunkt ist. Instanziieren Sie die Driver-Klasse und führen Sie das Skript mit der Methode execute () aus.

Driver.java


    public static void main(String[] args) {
        Driver driver = new Driver();
        int status = driver.execute(args);
        System.exit(status);
    }
    
}

Das ist alles für die Implementierung.

Es sieht so aus, als ob die Skriptdatei fibo.txt mit der erstellten Driver.class ausgeführt wurde. Es wird davon ausgegangen, dass sich Driver.class und fibo.txt im selben Verzeichnis befinden.

$ java Driver fibo.txt
f(0) -> 0
f(1) -> 1
f(2) -> 1
f(3) -> 2
f(4) -> 3
f(5) -> 5
f(6) -> 8

Vielen Dank.

abschließend

Die vollständige Quelle finden Sie hier.

Calc https://github.com/quwahara/Calc/tree/article-21-driver/Calc/src/main/java

Recommended Posts

21 Lesen Sie das Skript aus der Datei und führen Sie es aus
Wenn ich die Datei mit der Klasse # getResource aus der JAR-Datei aufrufe, wird sie nicht gefunden und ist ein beschissenes Memorandum
Bis Sie mit Maven ein von Scala geschriebenes Projekt erstellen und es mit dem Befehl scala ausführen.
Registrieren Sie DLNA-kompatibles Fernsehgerät in SORACOM Inventory und arbeiten Sie über die Webkonsole
Installieren Sie das memcached Plugin unter MySQL und greifen Sie von Java aus zu
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
21 Lesen Sie das Skript aus der Datei und führen Sie es aus
(Ruby on Rails6) Erstellen einer Datenbank und Anzeigen in einer Ansicht
Ich habe ein Routensuchprogramm in TDD geschrieben und versucht, es umzugestalten
Führen Sie eine Batchdatei von Java aus
So laden Sie eine Spring-Upload-Datei und zeigen ihren Inhalt an
So lesen Sie eine Datei und behandeln sie als Standardeingabe
Konvertieren Sie Excel mit Java in Blob, speichern Sie es, lesen Sie es aus der Datenbank und geben Sie es als Datei aus!
So öffnen Sie eine Skriptdatei von Ubuntu mit VS-Code
Erstellen Sie einen Kalender aus der Kalenderklasse, indem Sie das Jahr und den Monat angeben
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Shell-Skript, das ein Docker-Image erstellt und an ECR weiterleitet
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Die Android App stürzt ab. Klicken Sie einfach auf eine Schaltfläche und es wird fallen.
Erstellen Sie mit dem Befehl eine JAR-Datei
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
[Java8] Durchsuchen Sie das Verzeichnis und holen Sie sich die Datei
Finden Sie den Unterschied von einem Vielfachen von 10
Geben Sie die Summe jedes Namens und seines Inhalts aus dem Mehrfacharray aus
Java: Laden Sie die Datei herunter und speichern Sie sie an dem im Dialogfeld [Use HttpClient] ausgewählten Speicherort.
Von der Bewerbung bis zur Einführung von Oracle Java SE 11 Silver dauerte es einen Monat
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
Zeigt an, wie viele Jahre und Monate der Unterschied zu einem bestimmten Datum beträgt
Shell-Skript zum Erstellen der Quelle von OpenJDK11
Ein junger Ingenieur lernte JUnit aus den Grundlagen
Ein Memo über den Fluss von Rails und Vue
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!