عبارات If/else مع ANTLR 4
يستخدم ANTLR 4 المستمعين بشكل افتراضي، ولكنه يدعم الزوار أيضًا. يوفر الزائرون مزيدًا من التحكم في اجتياز شجرة التحليل، مما يجعلهم أكثر ملاءمة لتنفيذ عبارات if/else. لتمكين الزوار، قم بتشغيل الأمر التالي:
java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Mu.g4 -visitor
سيؤدي هذا إلى إنشاء فئة تسمى 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;
}
}
هنا، نقوم بمراجعة الشروط وتقييم الشرط الصحيح الأول. إذا لم يكن أي شرط صحيحًا وكانت كتلة else موجودة، فإننا نقوم بتقييم ذلك بدلاً من ذلك.
لاستخدام هذا الزائر، أنشئ فئة رئيسية لتحليل وتقييم الإدخال:
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
}
}
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3