Implémenter des instructions if/else dans ANTLR en utilisant le modèle d'écoute peut être difficile en raison du fait que ANTLR décide de l'ordre dans lequel parcourir l’arbre d’analyse. Pour bien comprendre comment implémenter des modèles if/else à l'aide d'auditeurs et de visiteurs, considérez ce qui suit :
Par défaut, ANTRL 4 génère des auditeurs. Cependant, si vous fournissez le paramètre de ligne de commande -visitor à org.antlr.v4.Tool, ANTL génère des classes de visiteurs. Ces classes offrent plus de contrôle sur les (sous-)arbres qui sont parcourus/visités.
En utilisant des écouteurs, vous devrez introduire des variables globales pour garder une trace des sous-arbres. -les arbres qui doivent être évalués et ceux qui ne le font pas. Cela peut conduire à une implémentation moins propre.
La mise en œuvre d'instructions if/else à l'aide de visiteurs offre une approche plus propre. Les visiteurs vous permettent de définir votre propre ordre et logique de parcours, ce qui facilite la gestion de la logique conditionnelle.
Pour commencer, utilisez la commande :
java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Mu.g4 -visitor
Cela générera la classe MuBaseVisitor, qui est le point de départ de l'implémentation de votre visiteur.
Voici un exemple de gestion de l'instruction if/else avec un visiteur :
<code class="java">public class EvalVisitor extends MuBaseVisitor<Value> { // ... visitors for other rules // if_stat override @Override public Value visitIf_stat(MuParser.If_statContext ctx) { List<MuParser.Condition_blockContext> conditions = ctx.condition_block(); boolean evaluatedBlock = false; for(MuParser.Condition_blockContext condition : conditions) { Value evaluated = this.visit(condition.expr()); if(evaluated.asBoolean()) { evaluatedBlock = true; // evaluate this block whose expr==true this.visit(condition.stat_block()); break; } } if(!evaluatedBlock && ctx.stat_block() != null) { // evaluate the else-stat_block (if present == not null) this.visit(ctx.stat_block()); } return Value.VOID; } }</code>
Pour tester cela implémentation, utilisez la classe Main suivante :
<code class="java">public class Main { public static void main(String[] args) throws Exception { MuLexer lexer = new MuLexer(new ANTLRFileStream("test.mu")); MuParser parser = new MuParser(new CommonTokenStream(lexer)); ParseTree tree = parser.parse(); EvalVisitor visitor = new EvalVisitor(); visitor.visit(tree); } }</code>
Compilez et exécutez les fichiers source :
javac -cp antlr-4.0-complete.jar *.java java -cp .:antlr-4.0-complete.jar Main
Après avoir exécuté Main, votre console affichera les résultats de l'évaluation du test du fichier d'entrée. mu.
L'implémentation d'instructions if/else dans ANTLR à l'aide de visiteurs offre une approche plus claire et plus structurée par rapport à l'utilisation d'auditeurs. Les visiteurs offrent plus de contrôle sur la traversée de l'arbre d'analyse et vous permettent d'implémenter la logique conditionnelle plus efficacement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!