From 60219ea6d9e357582b43f9c3ee9cfa70bb87c533 Mon Sep 17 00:00:00 2001 From: SylvanCourtiol Date: Sun, 16 May 2021 18:17:28 +0200 Subject: [PATCH] Prototype 2.0 --- src/interpreteurlir/Analyseur.java | 109 +++++- .../donnees/Identificateur.java | 148 +++---- .../donnees/IdentificateurChaine.java | 49 ++- .../donnees/IdentificateurEntier.java | 67 ++-- src/interpreteurlir/donnees/Variable.java | 5 +- .../donnees/litteraux/Chaine.java | 4 +- .../donnees/litteraux/Entier.java | 160 +++++++- .../donnees/litteraux/tests/TestEntier.java | 301 +++++++++++++++ .../donnees/tests/TestIdentificateur.java | 7 +- .../tests/TestIdentificateurChaine.java | 104 ++--- .../tests/TestIdentificateurEntier.java | 91 ++--- .../expressions/ExpressionEntier.java | 167 +++++++- .../expressions/tests/TestExpression.java | 1 - .../tests/TestExpressionEntier.java | 145 ++++++- src/interpreteurlir/motscles/Commande.java | 25 ++ .../motscles/CommandeDebut.java | 3 +- .../motscles/CommandeEfface.java | 69 ++++ .../motscles/CommandeLance.java | 70 ++++ .../motscles/CommandeListe.java | 90 +++++ .../instructions/InstructionAffiche.java | 74 ++++ .../instructions/InstructionEntre.java | 97 +++++ .../instructions/InstructionProcedure.java | 77 ++++ .../instructions/InstructionRetour.java | 73 ++++ .../instructions/InstructionStop.java | 67 ++++ .../instructions/InstructionVaen.java | 72 ++++ .../motscles/instructions/InstructionVar.java | 3 +- .../tests/TestInstructionAffiche.java | 108 ++++++ .../tests/TestInstructionEntre.java | 121 ++++++ .../tests/TestInstructionProcedure.java | 142 +++++++ .../tests/TestInstructionRetour.java | 145 +++++++ .../tests/TestInstructionStop.java | 91 +++++ .../tests/TestInstructionVaen.java | 157 ++++++++ .../tests/TestInstructionVar.java | 2 +- .../motscles/tests/TestCommande.java | 22 ++ .../motscles/tests/TestCommandeEfface.java | 92 +++++ .../motscles/tests/TestCommandeLance.java | 138 +++++++ .../motscles/tests/TestCommandeListe.java | 142 +++++++ src/interpreteurlir/programmes/Etiquette.java | 99 +++++ src/interpreteurlir/programmes/Programme.java | 279 ++++++++++++++ .../programmes/tests/TestEtiquette.java | 219 +++++++++++ .../programmes/tests/TestProgramme.java | 364 ++++++++++++++++++ 41 files changed, 3922 insertions(+), 277 deletions(-) create mode 100644 src/interpreteurlir/donnees/litteraux/tests/TestEntier.java create mode 100644 src/interpreteurlir/motscles/CommandeEfface.java create mode 100644 src/interpreteurlir/motscles/CommandeLance.java create mode 100644 src/interpreteurlir/motscles/CommandeListe.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionAffiche.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionEntre.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionProcedure.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionRetour.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionStop.java create mode 100644 src/interpreteurlir/motscles/instructions/InstructionVaen.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionAffiche.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionEntre.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionProcedure.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionRetour.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionStop.java create mode 100644 src/interpreteurlir/motscles/instructions/tests/TestInstructionVaen.java create mode 100644 src/interpreteurlir/motscles/tests/TestCommandeEfface.java create mode 100644 src/interpreteurlir/motscles/tests/TestCommandeLance.java create mode 100644 src/interpreteurlir/motscles/tests/TestCommandeListe.java create mode 100644 src/interpreteurlir/programmes/Etiquette.java create mode 100644 src/interpreteurlir/programmes/Programme.java create mode 100644 src/interpreteurlir/programmes/tests/TestEtiquette.java create mode 100644 src/interpreteurlir/programmes/tests/TestProgramme.java diff --git a/src/interpreteurlir/Analyseur.java b/src/interpreteurlir/Analyseur.java index 67410fd..fb2c05b 100644 --- a/src/interpreteurlir/Analyseur.java +++ b/src/interpreteurlir/Analyseur.java @@ -9,6 +9,8 @@ import java.util.Scanner; import interpreteurlir.expressions.Expression; import interpreteurlir.motscles.Commande; +import interpreteurlir.motscles.instructions.Instruction; +import interpreteurlir.programmes.*; /** * Analyseur de l'entrée standard du programme interpréteur LIR. @@ -34,6 +36,9 @@ public class Analyseur { /** contexte de cet analyseur */ private Contexte contexteGlobal; + + /** programme de cet analyseur */ + private Programme programme; /** * Initialise un analyseur ayant son propre contexte. @@ -43,6 +48,8 @@ public class Analyseur { entree = new Scanner(System.in); contexteGlobal = new Contexte(); Expression.referencerContexte(contexteGlobal); + programme = new Programme(); + Commande.referencerProgramme(programme); } /** @@ -51,18 +58,72 @@ public class Analyseur { */ public void mainLoop() { String ligneSaisie; + String[] decoupage; + String motCle; + String arguments; + String texteEtiquette; for (;;) { + texteEtiquette = null; + 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] : ""; + /* Instruction avec étiquette */ + if (!ligneSaisie.isBlank() + && Character.isDigit(ligneSaisie.charAt(0))) { + decoupage = ligneSaisie.split(" ", 2); + texteEtiquette = decoupage.length >= 1 ? decoupage[0] : ""; + ligneSaisie = decoupage.length >= 2 ? decoupage[1] : ""; + } - executerCommande(motCle, arguments.trim()); + decoupage = ligneSaisie.split(" ", 2); + motCle = decoupage.length >= 1 ? decoupage[0] : ""; + arguments = decoupage.length >= 2 ? decoupage[1] : ""; + + if (texteEtiquette == null) { + executerCommande(motCle, arguments.trim()); + } else { + editerProgramme(texteEtiquette, motCle, arguments.trim()); + } } } + /** + * Ajoute une ligne de code (étiquette associée à une instruction) + * au programme chargé. + * @param texteEtiquette représentation texte de l'étiquette + * @param motCle mot clé de l'instruction + * @param arguments reste de la ligne saisie après le mot clé + */ + private void editerProgramme(String texteEtiquette, String motCle, + String arguments) { + Class aAjouter; + try { + aAjouter = rechercheInstruction(motCle); + + Class classeArg = String.class; + Class classeContexte = Contexte.class; + Instruction inst = (Instruction)aAjouter + .getConstructor(classeArg, classeContexte) + .newInstance(arguments, contexteGlobal); + + Etiquette etiquette = new Etiquette(texteEtiquette); + + programme.ajouterLigne(etiquette, inst); + feedback(false); + + } catch ( InvocationTargetException | IllegalAccessException + | InstantiationException | NoSuchMethodException + | InterpreteurException | ExecutionException lancee) { + + System.err.println(NOK_FEEDBACK + + (lancee.getMessage() != null + ? lancee.getMessage() + : lancee.getCause().getMessage())); + } + + } + /** * Recherche la commande et exécute cette commande si présente. * Affiche un feedback si la commande ne s'en occupe pas ou erreur. @@ -84,7 +145,7 @@ public class Analyseur { feedback(cmd.executer()); } catch ( InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException - | InterpreteurException lancee) { + | InterpreteurException | ExecutionException lancee) { System.err.println(NOK_FEEDBACK + (lancee.getMessage() != null @@ -127,6 +188,8 @@ public class Analyseur { if (motCle == null || motCle.isBlank()) { throw new InterpreteurException(ERREUR_VIDE); + } else if (!motCle.equals(motCle.toLowerCase())) { + throw new InterpreteurException(ERREUR_INCONNU); } motCle = (Character.toUpperCase(motCle.charAt(0))) @@ -145,6 +208,42 @@ public class Analyseur { return aChercher; } + + /** + * Recherche l'instruction correspondant au mot clé. + *