antlr4開發環境搭建

簡介

ANTLR是一款強大的語法分析器生成工具,可用於讀取,處理,執行和翻譯結構化的文本或二進制文件。它被廣泛用於工業實踐。大數據領域中熟知的hive,presto,spark都使用它來構建sql解析器。Twitter使用ANTLR進行語法分析,每天處理超過20億次查詢。

開發環境搭建

1.安裝idea antlr4插件
idea 提供了一個插件ANTLR v4 grammars plugin,可以非常方便的生成代碼。該插件可以在線安裝,也可以離線安裝,我選擇離線安裝。

下載地址:https://plugins.jetbrains.com/plugin/7358-antlr-v4-grammar-plugin/versions
版本:1.14

在這裏插入圖片描述
插件下載完成後,安裝即可。
在這裏插入圖片描述

2.生成代碼
創建Hello.g4,並新增如下內容,該程序用於匹配hello關鍵字。

// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

配置ANTLR插件並生成響應的代碼
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

代碼實現

拷貝HelloBaseVisitor.java,HelloLexer.java,HelloListener.java,HelloParser.java,HelloVisitor.java到項目中
在這裏插入圖片描述
新增代碼

public class HelloVisitorImpl implements HelloVisitor {
    public Object visitR(HelloParser.RContext ctx) {
        return null;
    }

    public Object visit(ParseTree parseTree) {
        return null;
    }

    public Object visitChildren(RuleNode ruleNode) {
        return null;
    }

    public Object visitTerminal(TerminalNode terminalNode) {
        return null;
    }

    public Object visitErrorNode(ErrorNode errorNode) {
        return null;
    }
}

HelloVisitorImpl.java

public class HelloMain {
    public static void main(String[] args) {

        CharStream input = CharStreams.fromString("hello\nhaha");
        // 實例化詞法分析器
        HelloLexer lexer=new HelloLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);

        // 實例化解析器
        HelloParser parser = new HelloParser(tokens);
        ParseTree tree = parser.r();
        HelloVisitorImpl myHelloVisitor = new HelloVisitorImpl();

        myHelloVisitor.visit(tree);
        System.out.println("result:"+ tree.toStringTree(parser));
    }
}

HelloMain.java

<dependency>
	<groupId>org.antlr</groupId>
	<artifactId>antlr4-runtime</artifactId>
	<version>4.8-1</version>
</dependency>

pom.xml中添加antlr4-runtime依賴

運行結果:

"C:\Program Files\Java\jdk1.8.0_192\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=62242:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_192\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_192\jre\lib\rt.jar;E:\antlr4\target\classes;E:\repository\org\antlr\antlr4-runtime\4.8-1\antlr4-runtime-4.8-1.jar" cn.aiaudit.hello.HelloMain
result:(r hello haha)

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章