[JAVA] 21 Lire et exécuter le script à partir du fichier

introduction

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".

Ce que vous voulez faire en lisant un script à partir d'un fichier et en l'exécutant

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
}

Comment mettre en œuvre

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.

Essayez de mettre en œuvre en Java

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.

en conclusion

La source complète est disponible ici.

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

Recommended Posts

21 Lire et exécuter le script à partir du fichier
Lorsque j'appelle le fichier avec la classe # getResource à partir du fichier jar, il devient Not Found et c'est un mémorandum merdique
Jusqu'à ce que vous construisiez un projet écrit scala avec Maven et que vous l'exécutiez avec la commande scala.
Enregistrez le téléviseur compatible DLNA dans l'inventaire SORACOM et utilisez la console Web
Installez le plugin memcached sur MySQL et accédez à partir de Java
Ecrire une classe en Kotlin et l'appeler en Java
21 Lire et exécuter le script à partir du fichier
(Ruby on Rails6) Créer une base de données et l'afficher dans une vue
J'ai écrit un programme de recherche d'itinéraire dans TDD et j'ai essayé de le refactoriser
Exécuter le fichier de commandes à partir de Java
Comment charger un fichier de téléchargement Spring et afficher son contenu
Comment lire un fichier et le traiter comme une entrée standard
Convertissez Excel en Blob avec java, enregistrez-le, lisez-le à partir de DB et exportez-le sous forme de fichier!
Comment ouvrir un fichier de script à partir d'Ubuntu avec du code VS
Créez un calendrier à partir de la classe Calendar en spécifiant l'année et le mois
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Script Shell qui construit une image Docker et la pousse vers ECR
Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
L'application Android plante. Cliquez simplement sur un bouton et il tombera.
Créez un fichier jar avec la commande
[Java 7] Divisez la liste Java et exécutez le processus
[Java8] Recherchez le répertoire et récupérez le fichier
Trouvez la différence à partir d'un multiple de 10
Sortie de la somme de chaque nom et de son contenu à partir du tableau multiple
Java: Téléchargez le fichier et enregistrez-le à l'emplacement sélectionné dans la boîte de dialogue [Utiliser HttpClient]
Il a fallu un mois entre l'application et la prise de l'Oracle Java SE 11 Silver
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
Indique combien d'années et de mois la différence par rapport à une date spécifique est
Script Shell pour construire la source d'OpenJDK11
Un jeune ingénieur a appris JUnit à partir des bases
Un mémo sur le flux de Rails et Vue
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!