30分鐘入門DSL工具Antlr4——概念、案例

本文主要面向初學者介紹Antlr4,一款常用語詞法語法解析器生成的第三方工具包。全文主要回答幾個問題:

  • 1、antlr的是什麼?
  • 2、antlr的功能有哪些,如何使用?
  • 3、在公司中使用antlr案例?

不知道各位是如何關注到antlr,筆者是因爲碩士階段需要寫SQL解析器才漸漸瞭解到它。後來發現它在大數據中非常實用,尤其在SQL方面。

Terence Parr的The Definitive Antlr 4 Reference

1、antlr的是什麼?

它是一個非常強大的文本及二進制文件的解析、翻譯和處理的工具。大家熟悉的Hive和Spark使用antlr生成詞法語法解析器、Twitter使用antlr來解析用戶輸入的查詢內容,Oracle把antlr的功能內嵌在SQL 開發IDE中,NetBeans IDE使用antlr解析C++語言,也有公司使用antlr來從文件中抽取信息。

其實antlr原則上應該是領域特定語言(DSL)開發工具,不僅適用於SQL,還可以用於其他自定義語言。

以上都是很官方的說明,antlr到底是什麼,該怎麼用,下面舉2個簡單例子,一個是簡化SQL解析器,一個是翻譯器。antlr的使用從寫文法文件開始,文件後綴是g4.

####2、antlr的功能及使用
1)簡易SQL解析器g4文法文件

這裏創建一個SqlExample.g4的文件

grammar SqlExample:

fragment A_ :	'a' | 'A';
fragment B_ :	'b' | 'B';
fragment C_ :	'c' | 'C';
fragment D_ :	'd' | 'D';
fragment E_ :	'e' | 'E';
fragment F_ :	'f' | 'F';
fragment G_ :	'g' | 'G';
fragment H_ :	'h' | 'H';
fragment I_ :	'i' | 'I';
fragment J_ :	'j' | 'J';
fragment K_ :	'k' | 'K';
fragment L_ :	'l' | 'L';
fragment M_ :	'm' | 'M';
fragment N_ :	'n' | 'N';
fragment O_ :	'o' | 'O';
fragment P_ :	'p' | 'P';
fragment Q_ :	'q' | 'Q';
fragment R_ :	'r' | 'R';
fragment S_ :	's' | 'S';
fragment T_ :	't' | 'T';
fragment U_ :	'u' | 'U';
fragment V_ :	'v' | 'V';
fragment W_ :	'w' | 'W';
fragment X_ :	'x' | 'X';
fragment Y_ :	'y' | 'Y';
fragment Z_ :	'z' | 'Z';

keyword
 : TRUE
 | FALSE
 | NOT
 // ....
;

SEMI	: ';' ;
DOT    	: '.' ;
COMMA	: ',' ;
ASTERISK: '*' ;


CREATE: C_ R_ E_ A_ T_ E_ ;
DATABASE: D_ A_ T_ A_ B_ A_ S_ E_ ;
SCHEMA: S_ C_ H_ E_ M_ A_ ;
IF: I_ F_ ;
NOT: N_ O_ T_ ;
EXISTS: E_ X_ I_ S_ T_ S_ ;
TRUE: T_ R_ U_ E_ ;
FALSE: F_ A_ L_ S_ E_ ;

ID:
     ( 'A'..'Z' | 'a'..'z' | '_' | '$' | '0'..'9' )+
;

root_statement:
      data_definition_statements
    	(SEMI)?
;

data_definition_statements:
      create_statement
;

create_statement:
       create_database_statement
;

create_database_statement:
	CREATE (DATABASE | SCHEMA) (IF NOT EXISTS)? database_name
;

database_name:  ID
      | keyword
;

對該文法文件使用Intellij IDE的antlr4插件運行文法文件,輸入:create database online; 則出現生成如下語法樹的圖:
這裏寫圖片描述

從圖中可以看出該DDL的建表SQL語句被解析後的語法樹形狀。

g4文法文件通過antlr工具生成lexer詞法解析器和parser語法解析器以及visitor和listener的java文件或其他語言文件(支持多語言)。

lexer是對語句進行詞法分析,把SQL切分爲不同的token,
就可以對語句中的重要信息進行處理。

以下是個人開源的高效SQL解析器的g4文法文件,供大家學習參考:https://github.com/BruceXu1991/UniformSQLParser

補充:本人實驗的版本是Antlr 4.5.3,對於IDEA的ANTLR v4 grammar plugin是1.8.2;在新版本IDEA可能會出現bug導致執行異常。

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