ANTLR: Contoh Walk-through
Walaupun laman web ANTLR menyediakan contoh tatabahasa, memahami proses menukar tatabahasa kepada kod Java boleh sukar difahami. Untuk pemahaman yang lebih jelas, mari kita teliti contoh mudah.
Mentakrif Tatabahasa
Kami akan mencipta tatabahasa yang menilai ungkapan yang melibatkan empat operator aritmetik asas ( , -, *, /) dan kurungan. Kami mentakrifkan tatabahasa dalam fail bernama Exp.g.
Exp.g
grammar Exp; eval returns [double value] : exp=additionExp {$value = $exp.value;} ; additionExp returns [double value] : m1=multiplyExp {$value = $m1.value;} ( '+' m2=multiplyExp {$value += $m2.value;} | '-' m2=multiplyExp {$value -= $m2.value;} )* ; multiplyExp returns [double value] : a1=atomExp {$value = $a1.value;} ( '*' a2=atomExp {$value *= $a2.value;} | '/' a2=atomExp {$value /= $a2.value;} )* ; atomExp returns [double value] : n=Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ; Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;
Menjana Parser dan Lexer
Menggunakan fail balang ANTLR, laksanakan arahan berikut dalam direktori yang mengandungi Exp.g:
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
Ini akan mencipta ExpLexer.java, ExpParser.java dan Exp. token.
Menulis Kelas Ujian
Buat ANTLRDemo.java untuk menguji tatabahasa:
ANTLRDemo.java
import org.antlr.runtime.*; public class ANTLRDemo { public static void main(String[] args) throws Exception { ANTLRInputStream in = new ANTLRInputStream("12*(5-6)"); ExpLexer lexer = new ExpLexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer); ExpParser parser = new ExpParser(tokens); System.out.println(parser.eval().value); } }
Menjalankan Contoh
Mula-mula, susun semula kelas parser dan lexer, kemudian jalankan ANTLRDemo:
// Recompile javac -cp .:antlr-3.2.jar ANTLRDemo.java // Run java -cp .:antlr-3.2.jar ANTLRDemo
Konsol kini seharusnya mengeluarkan hasil ungkapan, yang ialah -12.
Atas ialah kandungan terperinci Bagaimana Menghuraikan Ungkapan Aritmetik dengan ANTLR: Panduan Langkah demi Langkah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!