ANTLR:一個簡單範例
ANTLR 是解析文字資料的強大工具,但入門可能會令人生畏。對於那些尋求簡單範例來掌握 ANTLR 基礎知識的人,這裡有一個全面的演示。
建立語法
首先,讓我們在一個名為的檔案中定義一個簡單的語法Exp.g:
grammar Exp; eval : additionExp EOF ; additionExp : multiplyExp ( '+' multiplyExp | '-' multiplyExp )* ; multiplyExp : atomExp ( '*' atomExp | '/' atomExp )* ; atomExp : Number | '(' additionExp ')' ; Number : ('0'..'9')+ ('.' ('0'..'9')+)? ;
產生解析器並Lexer
建立語法後,下載ANTLR jar並執行以下命令來產生解析器和詞法分析器:
java -cp antlr-3.2.jar org.antlr.Tool Exp.g
這將建立 ExpLexer.java、ExpParser .java 和 Exp.tokens 檔案。
建立測試類別
讓我們建立一個名為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()); } }
了解解析器執行
編譯並執行ANTLRDemo。爪哇。如果表達式計算正確,則不會列印任何輸出。否則,將顯示錯誤訊息。
將Java 程式碼加入語法
為了讓解析器更實用,請將Java 程式碼加入{.. .} 區塊:
eval : additionExp { /* plain code block! */ System.out.println("value equals: " + $value); } ;
此範例列印以下結果表達式。
從規則傳回 Double 值
將 returns [double value] 新增到語法中的每個規則以指示它們傳回 double:
eval returns [double value] : additionExp { /* plain code block! */ System.out.println("value equals: " + $value); } ;
修改ANTLRDemo類別
更新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()); } }
再次執行ANTLRDemo.java 對列印到控制台的結果。
以上是如何使用 ANTLR 建立簡單的算術表達式解析器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!