这篇主要举实际案例说明怎么使用antlr工具、利用antlr生成的Lexer、Parser、TreeParser代码,获取asttree。这些都是hive获取asttree的过程,理解了这些,再理解hive的asttree就很容易了
![de5ca1073655939833c3508cc444604d.png](https://img-blog.csdnimg.cn/img_convert/de5ca1073655939833c3508cc444604d.png)
程序设计语言入门小案例一般都用“Hello World”,在编译领域的入门往往选择计算器。而我们这次的小案例就更简单:一个只能计算【两】个【整数】相【加】的计算器,比如:计算1+1...
先来考虑一下如果何下手,在我们的计算器中,只接受输入整数和加号,其它的一概不理。这里说的是整数,如果输入了一个字母,我们一定是要拒绝的...对于这一块要写对应的词法规则,这个阶段的过程就叫做词法分析
输入满足词法的规则,并不代表我们就能接受,如果是【加号】【整数】【整数】或者【整数】【整数】【加号】这样的排列,我们是不能接受的,这里接受的合法语法是【整数】【加号】【整数】,因此我们需要在词法规则的基础上再定义语法规则,规则定输入满足这样句式的才算是合法... 我们把这个阶段叫做语法分析
弄清楚了我们的词法、语法规则后,我们需要以antlr的语言把这些写出来。
antlr语法博大精深,我觉得没必要钻的太深,实现这个案例,用不到antlr太多复杂的语法,只用看懂就行
1、使用antlrworks
双击antlrworks-1.5.1.jar启动antlrworks
File-->New
![7ddbb3ff9a8f68dc118b62ec771fc1cd.png](https://img-blog.csdnimg.cn/img_convert/7ddbb3ff9a8f68dc118b62ec771fc1cd.png)
选择ANTLR 3 Grammer (*.g) 新建Calculator语法文件
![038dc05c374d7bb4befec452a95f1317.png](https://img-blog.csdnimg.cn/img_convert/038dc05c374d7bb4befec452a95f1317.png)
输入规则:
![dfc810cbabfd4fb45c5e73ac5c030ec7.png](https://img-blog.csdnimg.cn/img_convert/dfc810cbabfd4fb45c5e73ac5c030ec7.png)
ctrl+s 保存
![a373722f22315f5032c9754faad260e2.png](https://img-blog.csdnimg.cn/img_convert/a373722f22315f5032c9754faad260e2.png)
Antlr的语法文件通常会保存在一个 .g的文件中,我们的语法文件叫做 Caculator.g,保存在E:hiveanltrcalculator 目录 下
在E:hiveanltrcalculator目录 创建output目录
File-->Preferences设置Output path
![909b30cbd5f1b146f69541f72037d261.png](https://img-blog.csdnimg.cn/img_convert/909b30cbd5f1b146f69541f72037d261.png)
运行调试,点击图标中的小甲虫
![0da68f64a7a44800393f8f606f6fd4a4.png](https://img-blog.csdnimg.cn/img_convert/0da68f64a7a44800393f8f606f6fd4a4.png)
在弹出来的调试界面中,选择 text
输入 1+2
![d7715845e3833f351abb227246cdfbb9.png](https://img-blog.csdnimg.cn/img_convert/d7715845e3833f351abb227246cdfbb9.png)
![7b4b0ff81cf88be997716d9b64fdab9b.png](https://img-blog.csdnimg.cn/img_convert/7b4b0ff81cf88be997716d9b64fdab9b.png)
之后将会在output窗口看到被识别出来的token流,以及具体语法分析树和ASTTree的结果
![15bcd03143587d6bb2d9823f9bb5ba8b.png](https://img-blog.csdnimg.cn/img_convert/15bcd03143587d6bb2d9823f9bb5ba8b.png)
![59be32c2323c99065fdaa47b8d7ed91d.png](https://img-blog.csdnimg.cn/img_convert/59be32c2323c99065fdaa47b8d7ed91d.png)
到此,就是简单使用anltrworks用语法文件来解析输入数据的过程
2、使用eclipse
新建一个java项目,antlr-my
File-->New-->Java Project
![2bbdec197d994809eeb69b8552028781.png](https://img-blog.csdnimg.cn/img_convert/2bbdec197d994809eeb69b8552028781.png)
在antlr-my项目下创建grammar、lib
![97bb09ac91841a3e96cac6fa09033709.png](https://img-blog.csdnimg.cn/img_convert/97bb09ac91841a3e96cac6fa09033709.png)
下载antlr-3.4-complete.jar hive中用的是antlr3.4
http://www.java2s.com/Code/Jar/a/Downloadantlr34completejar.htm
将antlr-3.4-complete.jar放在lib下面
![f2a35c531d88f9ba11a95caadfff01c0.png](https://img-blog.csdnimg.cn/img_convert/f2a35c531d88f9ba11a95caadfff01c0.png)
创建语法文件:
在grammar上面右键, New -> Other,选择 ANTLR中的Combined Grammar
![b229992e3328c37e0523971049b0fc7a.png](https://img-blog.csdnimg.cn/img_convert/b229992e3328c37e0523971049b0fc7a.png)
输入文件名Caculator
![ce714bea4563f9a24872239b7b82deaa.png](https://img-blog.csdnimg.cn/img_convert/ce714bea4563f9a24872239b7b82deaa.png)
设置antlr-my项目相关的antlr插件检查设置:
在antlr-my项目上右键 -->Properties-->ANTLR
![7cae1a147080654e0a208599ec111ee2.png](https://img-blog.csdnimg.cn/img_convert/7cae1a147080654e0a208599ec111ee2.png)
![d30084fd0dccf3194ad36a73b0009323.png](https://img-blog.csdnimg.cn/img_convert/d30084fd0dccf3194ad36a73b0009323.png)
![83297a834549f38aee34da0f408a882b.png](https://img-blog.csdnimg.cn/img_convert/83297a834549f38aee34da0f408a882b.png)
![f38421cdd37585cc31b011ee04caa4c0.png](https://img-blog.csdnimg.cn/img_convert/f38421cdd37585cc31b011ee04caa4c0.png)
以上设置完了之后,点ok
在Calculator.g文件中输入内容:
![3acc956f148495d6f8a81df67346474a.png](https://img-blog.csdnimg.cn/img_convert/3acc956f148495d6f8a81df67346474a.png)
点击Interpreter,在expr区域输入表达式1+2 点击执行按钮:
![f127a3c0f03a2aefd9443d9536b528a6.png](https://img-blog.csdnimg.cn/img_convert/f127a3c0f03a2aefd9443d9536b528a6.png)
我们可以看到下图中具体语法分析树的结果
![56e4da321abf0de22dcc97f798e6a497.png](https://img-blog.csdnimg.cn/img_convert/56e4da321abf0de22dcc97f798e6a497.png)
3、用java来获取ASTTree
antlr自动生成了词法分析器CalculatorLexer.java和语法分析器 CalculatorParser.java的代码
![a9d1a6dd29905fafa62fcc059cd7313f.png](https://img-blog.csdnimg.cn/img_convert/a9d1a6dd29905fafa62fcc059cd7313f.png)
创建测试类:TestCalculator.java
![8d764d86b354a1973b0da91b8a5ace67.png](https://img-blog.csdnimg.cn/img_convert/8d764d86b354a1973b0da91b8a5ace67.png)
能够获取生成的ASTTree
福利:
Hive源码系列课程第一部分 【Hive源码环境搭建】已经录制完成了:
网易云课堂地址:Hive源码环境搭建
前50名领完优惠券后只用1.9 元就能学习,最最重要的是,能获取整套已经搭建好的环境以及入群学习,有需要的同学快来加入吧!
![a3cc20415b7f47399e96641663cb98e7.png](https://img-blog.csdnimg.cn/img_convert/a3cc20415b7f47399e96641663cb98e7.png)