Instructions If/else avec ANTLR 4
ANTLR 4 utilise des écouteurs par défaut, mais il prend également en charge les visiteurs. Les visiteurs offrent plus de contrôle sur le parcours de l'arbre d'analyse, ce qui les rend plus adaptés à l'implémentation d'instructions if/else. Pour activer les visiteurs, exécutez la commande suivante :
java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Mu.g4 -visitor
Cela générera une classe appelée MuBaseVisitor
public class EvalVisitor extends MuBaseVisitor {
// Override visit methods for each rule that needs to be implemented
// Example: visitIf_stat for handling if/else statements
@Override
public Value visitIf_stat(MuParser.If_statContext ctx) {
List conditions = ctx.condition_block();
boolean evaluatedBlock = false;
for (MuParser.Condition_blockContext condition : conditions) {
Value evaluated = this.visit(condition.expr());
if (evaluated.asBoolean()) {
evaluatedBlock = true;
this.visit(condition.stat_block()); // Evaluate the true block
break;
}
}
if (!evaluatedBlock && ctx.stat_block() != null) {
this.visit(ctx.stat_block()); // Evaluate the else block
}
return Value.VOID;
}
}
Ici, nous parcourons les conditions et évaluons la première vraie. Si aucune condition n'est vraie et qu'un bloc else est présent, nous l'évaluons à la place.
Pour utiliser ce visiteur, créez une classe Main pour analyser et évaluer l'entrée :
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); // Start the evaluation process
}
}
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3