Rumah >Java >javaTutorial >Bagaimana Menghuraikan Ungkapan Aritmetik dengan ANTLR: Panduan Langkah demi Langkah?

Bagaimana Menghuraikan Ungkapan Aritmetik dengan ANTLR: Panduan Langkah demi Langkah?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-28 22:41:13623semak imbas

How to Parse Arithmetic Expressions with ANTLR: A Step-by-Step Guide?

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!

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