Rumah > Java > javaTutorial > Bagaimanakah Saya Boleh Mencipta Penghurai Ungkapan Aritmetik Mudah Menggunakan ANTLR?

Bagaimanakah Saya Boleh Mencipta Penghurai Ungkapan Aritmetik Mudah Menggunakan ANTLR?

DDD
Lepaskan: 2024-12-06 13:51:16
asal
825 orang telah melayarinya

How Can I Create a Simple Arithmetic Expression Parser Using 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')+)?
    ;
Salin selepas log masuk

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
Salin selepas log masuk

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());
    }
}
Salin selepas log masuk
Salin selepas log masuk

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);
        }
    ;
Salin selepas log masuk

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);
        }
    ;
Salin selepas log masuk

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());
    }
}
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan