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

Bagaimanakah Saya Boleh Mencipta Penghurai Ungkapan Aritmetik Mudah Menggunakan ANTLR?

DDD
DDDasal
2024-12-06 13:51:16821semak imbas

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')+)?
    ;

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!

Kenyataan:
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