Jusqu'à présent, nous avons implémenté l'interpréteur, mais le script a été écrit directement dans la source du programme. Dans cet article, nous allons vous permettre de lire et d'exécuter des scripts à partir de fichiers texte.
Cet article est une suite de "Prend en charge les appels de méthode statique".
Lisez le script à partir du fichier et assurez-vous que vous souhaitez l'exécuter.
Par exemple, il existe un fichier texte qui décrit le script suivant. Ce script est un programme qui génère des nombres de Fibonacci de 0 à 6. Exécutez ce script et visez à afficher le numéro de Fibonacci.
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
}
Obtenez le nom du fichier à partir de l'argument de ligne de commande et lisez le contenu du fichier. Introduisez une classe qui traite le contenu lu dans l'ordre de l'analyse des phrases (Lexer), de l'analyse syntaxique (Parser) et de l'interpréteur (Interpreter). Introduisez une classe de pilote qui effectue ce traitement.
Passez à la mise en œuvre. Jetons un œil aux classes de pilotes installées dans l'ordre.
Driver.java
Une implémentation de Driver.java.
Constructeur de classe de pilote. Instanciez et préparez l'analyseur de phrases (Lexer), l'analyseur syntaxique (Parser) et l'interpréteur (Interpreter) pour un traitement ultérieur.
Driver.java
public class Driver {
Lexer lexer;
Parser parser;
Interpreter interpreter;
public Driver() {
lexer = new Lexer();
parser = new Parser();
interpreter = new Interpreter();
}
C'est la méthode ʻexecute () qui exécute le script. La méthode ʻexecute ()
exécute les opérations suivantes dans l'ordre.
La variable de champ variables
contient la valeur de la variable globale de l'interpréteur de post-exécution qui aboutit à l'exécution.
La variable de champ ʻexception` contient les exceptions levées lors de l'exécution.
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;
}
}
La méthode validateArguments ()
qui valide la validité des arguments de ligne de commande.
Un argument de ligne de commande est spécifié pour vérifier qu'il s'agit d'un fichier.
Si le résultat de la vérification est incorrect, une exception est levée.
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);
}
}
La méthode readText
qui lit et renvoie le contenu du fichier.
On suppose que le code de caractère du contenu du fichier est UTF-8.
Driver.java
public String readText(String path) throws IOException {
return new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
}
La méthode run ()
qui exécute le script de contenu de fichier.
Le traitement est effectué dans l'ordre de l'analyse des phrases (Lexer), de l'analyse syntaxique (Parser) et de l'interpréteur (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();
}
La méthode main ()
, qui est le point de départ à l'exécution.
Instanciez la classe Driver et exécutez le script avec la méthode ʻexecute () `.
Driver.java
public static void main(String[] args) {
Driver driver = new Driver();
int status = driver.execute(args);
System.exit(status);
}
}
C'est tout pour la mise en œuvre.
Il semble que le fichier de script fibo.txt a été exécuté avec le Driver.class construit. On suppose que Driver.class et fibo.txt se trouvent dans le même répertoire.
$ 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
Merci beaucoup.
La source complète est disponible ici.
Calc https://github.com/quwahara/Calc/tree/article-21-driver/Calc/src/main/java
Recommended Posts