ANTLR:演練範例
雖然 ANTLR 網站提供了範例語法,但了解將語法轉換為 Java 程式碼的過程可以難以捉摸。為了更清楚地理解,讓我們深入研究一個簡單的範例。
定義語法
我們將建立一個語法,用於計算涉及四個基本算術運算子的表達式( , -、*、/) 和括號。我們在名為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')+)? ;
產生解析器和詞法分析器的檔案中定義語法
使用ANTLR jar文件,執行以下命令在包含Exp.g 的目錄中:
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
這將建立 ExpLexer.java、ExpParser.java和Exp.tokens.
寫測試類別
建立ANTLRDemo.java來測試語法:
建立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); } }
運行範例
首先,重新編譯解析器和詞法分析器類,然後執行// Recompile javac -cp .:antlr-3.2.jar ANTLRDemo.java // Run java -cp .:antlr-3.2.jar ANTLRDemo
:
:控制台現在應該輸出表達式的結果,即-12。以上是如何使用 ANTLR 解析算術表達式:逐步指南?的詳細內容。更多資訊請關注PHP中文網其他相關文章!