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".
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
}
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.
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.
Die vollständige Quelle finden Sie hier.
Calc https://github.com/quwahara/Calc/tree/article-21-driver/Calc/src/main/java
Recommended Posts