开源语法分析器--ANTLR
1 ANTLR简介
ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个 通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。ANTLR可以通过断言(Predicate)解决识别冲突;支持动作(Action)和返回值(Return Value)来;更棒的是,它可以根据输入自动生成语法树并可视化的显示出来。由此,计算机语言的翻译变成了一项普通的任务—在这之前YACC/LEX显得过于学院派,而以LL(k)为基础的ANTLR虽然在效率上还略有不足,但是经过近些年来的升级修改,使得ANTLR足以应付现存的绝大多数应用。感谢Terence Parr博士和他的同事们十几年来的出色工作,他们为编译理论的基础和语言工具的构造做了大量基础性工作,也直接导致了ANTLR的产生。
1.1 词法分析器(Lexer)
词法分析器又称为Scanner,Lexical analyser和Tokenizer。程序设计语言通常由关键字和严格定义的语法结构组成。编译的最终目的是将程序设计语言的高层指令翻译成物理机器或虚拟机可以执行的指令。词法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token),包括关键字,标识符,符号(symbols)和操作符供语法分析器使用。
1.2 语法分析器(Parser)
编译器又称为Syntactical analyser。在分析字符流的时候,Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系,而这就是Parser的工作。语法分析器将收到的Tokens组织起来,并转换成为目标语言语法定义所允许的序列。
无论是Lexer还是Parser都是一种识别器,Lexer是字符序列识别器而Parser是Token序列识别器。他们在本质上是类似的东西,而只是在分工上有所不同而已。
1.3 树分析器 (tree parser)
树分析器可以用于对语法分析生成的抽象语法树进行遍历,并能执行一些相关的操作。
1.4 ANTLR
ANTLR将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。
1.5,Hive.g文件位置
trunk/hive/hive/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
2,ANTLRWorks软件
2.1,软件使用方法
(1)用菜单打开或新建一个.g文件,然后按子窗口工具栏上的绿色虫子按钮。
ANTLRWorks就会在output子目录生成相关的.java文件并且编译成.class文件。
如果成功,会弹出Input Text对话框,询问测试的输入内容。如:SELECT * FROM SRC;
按OK后,切换到主窗口的Debugger标签页,
(2)按标签页中工具栏上的"Go To End"(符号有点像录音机的快进)
在Parse Tree窗口就会出现一棵树(根在上,叶在下)
一般这棵树很宽,需要调整下面的Zoom缩放,
或者干脆按右下角的"Display as List"切换成
根在左叶在右的树列表。
如果解析的输入文本的叶很多,建议使用根在左叶在右的树进行检查。
(3)如果要修改.g文件,按Debugger标签页左上角的Stop按钮,
中间的.g文件编辑器就会重新变回可编辑了。
2.2,Hive.g的写法
antlr是一个工具包,Hive本身会生成一个Hive.g文件。然后组里将这些内容进行修改,生成我们自己的SQL的语法的Hive.g。
使用antlr使用文件Hive.g将SQL转化为AST。
http://archive.cnblogs.com/a/1361553/ 该文介绍了antlr编译原理基础知识。
http://www.cnblogs.com/6DAN_HUST/archive/2008/12/26/1363011.html 该文介绍了antlr的词法分析。