From a1161d039974b72e6b6f9139823e55b8f5d17afd Mon Sep 17 00:00:00 2001 From: SylvanCourtiol Date: Sun, 9 May 2021 17:42:30 +0200 Subject: [PATCH] Codes sources prototype 1 --- src/interpreteurlir/Analyseur.java | 165 ++++++++++++++ .../donnees/Identificateur.java | 4 +- .../donnees/IdentificateurChaine.java | 9 +- .../donnees/IdentificateurEntier.java | 10 +- src/interpreteurlir/donnees/Variable.java | 95 ++++---- .../donnees/litteraux/Chaine.java | 4 +- .../donnees/litteraux/tests/TestChaine.java | 28 +++ .../donnees/tests/TestVariable.java | 210 ++++++++++++++++++ .../expressions/Expression.java | 68 +++++- .../expressions/ExpressionChaine.java | 132 +++++++++-- .../expressions/tests/TestExpression.java | 116 ++++++++++ .../tests/TestExpressionChaine.java | 127 ++++++++++- .../motscles/instructions/Instruction.java | 56 +++++ .../motscles/instructions/InstructionVar.java | 58 +++++ .../instructions/tests/TestInstruction.java | 52 +++++ .../tests/TestInstructionVar.java | 83 +++++++ 16 files changed, 1144 insertions(+), 73 deletions(-) create mode 100644 src/interpreteurlir/Analyseur.java create mode 100644 src/interpreteurlir/donnees/tests/TestVariable.java create mode 100644 src/interpreteurlir/motscles/instructions/Instruction.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionVar.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstruction.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionVar.java diff --git a/src/interpreteurlir/Analyseur.java b/src/interpreteurlir/Analyseur.java new file mode 100644 index 0000000..ed5b40d --- /dev/null +++ b/src/interpreteurlir/Analyseur.java @@ -0,0 +1,165 @@ +/** + * Analyseur.java 9 mai 2021 + * IUT Rodez info1 2020-2021, pas de copyright, aucun droit + */ +package interpreteurlir; + +import java.lang.reflect.InvocationTargetException; +import java.util.Scanner; + +import interpreteurlir.expressions.Expression; +import interpreteurlir.motscles.Commande; + +/** + * Analyseur de l'entrée standard du programme interpréteur LIR. + * @author Nicolas Caminade + * @author Sylvan Courtiol + * @author Pierre Debas + * @author Heïa Dexter + * @author Lucas Vabre + */ +public class Analyseur { + + /** Symbole d'invite de commande */ + public static final String INVITE = "? "; + + /** Message feedback ok */ + public static final String OK_FEEDBACK = "ok"; + + /** Message feedback not ok */ + public static final String NOK_FEEDBACK = "nok : "; + + /** analyseur de l'entrée standard */ + private Scanner entree; + + /** contexte de cet analyseur */ + private Contexte contexteGlobal; + + /** + * Initialise un analyseur ayant son propre contexte. + */ + public Analyseur() { + super(); + entree = new Scanner(System.in); + contexteGlobal = new Contexte(); + Expression.referencerContexte(contexteGlobal); + } + + /** + * Lance la boucle qui demande puis exécute des commandes ou instructions + * saisies par l'utilisateur. + */ + public void mainLoop() { + String ligneSaisie; + for (;;) { + System.out.print(INVITE); + ligneSaisie = entree.nextLine().trim(); + + String[] decoupage = ligneSaisie.split(" ", 2); + String motCle = decoupage.length >= 1 ? decoupage[0] : ""; + String arguments = decoupage.length >= 2 ? decoupage[1] : ""; + + executerCommande(motCle, arguments.trim()); + } + } + + /** + * Recherche la commande et exécute cette commande si présente. + * Affiche un feedback si la commande ne s'en occupe pas ou erreur. + * @param motCle chaîne contenant le mot clé de la commande/instruction + * @param arguments reste de la ligne saisie après le mot clé + */ + private void executerCommande(String motCle, String arguments) { + Class aExecuter; + + /* recherche de la class */ + try { + aExecuter = rechercheCommande(motCle); + + Class classeArg = String.class; + Class classeContexte = Contexte.class; + Commande cmd = (Commande)aExecuter + .getConstructor(classeArg, classeContexte) + .newInstance(arguments, contexteGlobal); + feedback(cmd.executer()); + } catch ( InvocationTargetException | IllegalAccessException + | InstantiationException | NoSuchMethodException + | InterpreteurException lancee) { + + System.err.println(NOK_FEEDBACK + + (lancee.getMessage() != null + ? lancee.getMessage() + : lancee.getCause().getMessage())); + } + + } + + /** + * Affiche feedback de bon déroulement + * d'une commande si celle ci n'affiche rien. + * @param afficheRien true si feedback déjà fait par la commande sinon false + */ + private static void feedback(boolean afficheRien) { + if (!afficheRien) { + System.out.println(OK_FEEDBACK); + } + } + + /** + * Recherche la commande ou instruction correspondant au mot clé. + *