Melaksanakan pernyataan if/else dalam ANTLR menggunakan corak pendengar boleh mencabar kerana fakta bahawa ANTLR memutuskan susunan dalam yang melintasi pokok parse. Untuk memahami sepenuhnya cara melaksanakan corak if/else menggunakan pendengar dan pelawat, pertimbangkan perkara berikut:
Secara lalai, ANTRL 4 menjana pendengar. Walau bagaimanapun, jika anda memberikan parameter baris arahan -visitor kepada org.antlr.v4.Tool, ANTL menjana kelas pelawat. Kelas ini menawarkan lebih kawalan ke atas pokok (sub) mana yang dilalui/dilawati.
Menggunakan pendengar, anda perlu memperkenalkan pembolehubah global untuk menjejaki sub -pokok yang perlu dinilai dan yang tidak. Ini boleh membawa kepada pelaksanaan yang kurang bersih.
Melaksanakan kenyataan if/else menggunakan pelawat menyediakan pendekatan yang lebih bersih. Pelawat membenarkan anda menentukan susunan dan logik traversal anda sendiri, menjadikannya lebih mudah untuk mengendalikan logik bersyarat.
Untuk bermula, gunakan arahan:
java -cp antlr-4.0-complete.jar org.antlr.v4.Tool Mu.g4 -visitor
Ini akan menjana kelas MuBaseVisitor, yang ialah titik permulaan untuk pelaksanaan pelawat anda.
Berikut ialah contoh pengendalian pernyataan if/else dengan pelawat:
<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>
Untuk menguji ini pelaksanaan, gunakan kelas Utama berikut:
<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>
Kompil dan jalankan fail sumber:
javac -cp antlr-4.0-complete.jar *.java java -cp .:antlr-4.0-complete.jar Main
Selepas menjalankan Utama, konsol anda akan mengeluarkan hasil penilaian ujian fail input. mu.
Melaksanakan kenyataan if/else dalam ANTLR menggunakan pelawat memberikan pendekatan yang lebih jelas dan tersusun berbanding menggunakan pendengar. Pelawat menawarkan lebih kawalan ke atas melintasi pokok parse dan membolehkan anda melaksanakan logik bersyarat dengan lebih cekap.
Atas ialah kandungan terperinci ## Bagaimana Melaksanakan Pernyataan if/Else dengan Berkesan dalam ANTLR Menggunakan Pelawat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!