Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Mencipta Penghurai Ungkapan Aritmetik Mudah Menggunakan ANTLR?
ANTLR: Contoh Mudah
ANTLR ialah alat yang berkuasa untuk menghuraikan data teks, tetapi permulaan boleh menakutkan. Bagi mereka yang mencari contoh mudah untuk memahami asas ANTLR, berikut ialah demonstrasi yang komprehensif.
Mencipta Tatabahasa
Pertama, mari kita tentukan tatabahasa ringkas dalam fail yang dipanggil Exp.g:
grammar Exp; eval : additionExp EOF ; additionExp : multiplyExp ( '+' multiplyExp | '-' multiplyExp )* ; multiplyExp : atomExp ( '*' atomExp | '/' atomExp )* ; atomExp : Number | '(' additionExp ')' ; Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;
Menjana Parser dan Lexer
Setelah tatabahasa dibuat, muat turun balang ANTLR dan jalankan arahan berikut untuk menjana parser dan lexer:
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
Ini akan mencipta ExpLexer.java, ExpParser fail .java dan Exp.tokens.
Mencipta Ujian Kelas
Mari kita buat kelas ujian yang dipanggil ANTLRDemo.java:
import org.antlr.runtime.*; public class ANTLRDemo { public static void main(String[] args) throws Exception { ANTLRStringStream in = new ANTLRStringStream("12*(5-6)"); ExpLexer lexer = new ExpLexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer); ExpParser parser = new ExpParser(tokens); System.out.println(parser.eval()); } }
Memahami Pelaksanaan Parser
Kompilasi dan jalankan ANTLRDemo. java. Jika ungkapan dinilai dengan betul, tiada output akan dicetak. Jika tidak, mesej ralat akan dipaparkan.
Menambah Kod Java pada Tatabahasa
Untuk menjadikan penghurai lebih berfungsi, tambahkan kod Java pada tatabahasa di dalam {.. .} blok:
eval : additionExp { /* plain code block! */ System.out.println("value equals: " + $value); } ;
Contoh ini mencetak hasil ungkapan.
Mengembalikan Nilai Berganda daripada Peraturan
Tambah pulangan [nilai berganda] pada setiap peraturan dalam tatabahasa untuk menunjukkan bahawa ia mengembalikan dua kali ganda:
eval returns [double value] : additionExp { /* plain code block! */ System.out.println("value equals: " + $value); } ;
Mengubah suai kelas ANTLRDemo
Kemas kini kelas ANTLRDemo.java untuk mendapatkan semula nilai yang dikembalikan:
import org.antlr.runtime.*; public class ANTLRDemo { public static void main(String[] args) throws Exception { ANTLRStringStream in = new ANTLRStringStream("12*(5-6)"); ExpLexer lexer = new ExpLexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer); ExpParser parser = new ExpParser(tokens); System.out.println(parser.eval()); } }
Jalankan ANTLRDemo.java sekali lagi untuk melihat hasil yang dicetak ke konsol.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Penghurai Ungkapan Aritmetik Mudah Menggunakan ANTLR?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!