这篇主要举实际案例说明怎么使用antlr工具、利用antlr生成的Lexer、Parser、TreeParser代码,获取asttree。这些都是hive获取asttree的过程,理解了这些,再理解hive的asttree就很容易了
![0ffd071b31c0b84b332e9f436fe62125.png](https://i-blog.csdnimg.cn/blog_migrate/fbc2d3701bdcdcfd40910b49a8a0f010.jpeg)
程序设计语言入门小案例一般都用“Hello World”,在编译领域的入门往往选择计算器。而我们这次的小案例就更简单:一个只能计算【两】个【整数】相【加】的计算器,比如:计算1+1...
先来考虑一下如果何下手,在我们的计算器中,只接受输入整数和加号,其它的一概不理。这里说的是整数,如果输入了一个字母,我们一定是要拒绝的...对于这一块要写对应的词法规则,这个阶段的过程就叫做词法分析
输入满足词法的规则,并不代表我们就能接受,如果是【加号】【整数】【整数】或者【整数】【整数】【加号】这样的排列,我们是不能接受的,这里接受的合法语法是【整数】【加号】【整数】,因此我们需要在词法规则的基础上再定义语法规则,规则定输入满足这样句式的才算是合法... 我们把这个阶段叫做语法分析
弄清楚了我们的词法、语法规则后,我们需要以antlr的语言把这些写出来。
antlr语法博大精深,我觉得没必要钻的太深,实现这个案例,用不到antlr太多复杂的语法,只用看懂就行
1、使用antlrworks
双击antlrworks-1.5.1.jar启动antlrworks
File-->New
![204a597d6f61fbb03ed6cc620fc75c0e.png](https://i-blog.csdnimg.cn/blog_migrate/94dd64076de7f6b3f65252ae7092e921.jpeg)
选择ANTLR 3 Grammer (*.g) 新建Calculator语法文件
![c367f1f974e08669930fa35035fb43bc.png](https://i-blog.csdnimg.cn/blog_migrate/b50c0d8c39b372105b99b8f9214abd9e.jpeg)
输入规则:
![b072ff57eb64ae3453a893bc35082d13.png](https://i-blog.csdnimg.cn/blog_migrate/c37646f74ea72be3d0fcadade006a178.jpeg)
ctrl+s 保存
![1129fbf1b60ed96979f1353652394012.png](https://i-blog.csdnimg.cn/blog_migrate/e8c43cdbaf94ef2d3cf858d49aba6099.jpeg)
Antlr的语法文件通常会保存在一个 .g的文件中,我们的语法文件叫做 Caculator.g,保存在E:hiveanltrcalculator 目录 下
在E:hiveanltrcalculator目录 创建output目录
File-->Preferences设置Output path
![3c7753aaf2c6a51db306c0566d38fcbb.png](https://i-blog.csdnimg.cn/blog_migrate/311d9f7e8229539f7b2a6bdf11d8e15b.jpeg)
运行调试,点击图标中的小甲虫
![aed260e0a38910df999a29b478db355b.png](https://i-blog.csdnimg.cn/blog_migrate/d57de195e3486b1cce07ea78a61e5d59.jpeg)
在弹出来的调试界面中,选择 text
输入 1+2
![6ac8ff73da4e55460481ba6531ab83db.png](https://i-blog.csdnimg.cn/blog_migrate/3a3b25cc8f82a629e18e043845fc10f6.jpeg)
![9a255b2191a746f1443688ba8dfa8234.png](https://i-blog.csdnimg.cn/blog_migrate/3f9d2dff235eeb2c545ec38a83f5fddb.jpeg)
之后将会在output窗口看到被识别出来的token流,以及具体语法分析树和ASTTree的结果
![d8e283f50d79ec606dc52ce0b04a637f.png](https://i-blog.csdnimg.cn/blog_migrate/f336705ecf47c942fde7fb94131d6644.jpeg)
![68e8a033f3570d6c7a674814a4632fdd.png](https://i-blog.csdnimg.cn/blog_migrate/666fa1e2ea0882965730b95d5d1c046f.jpeg)
到此,就是简单使用anltrworks用语法文件来解析输入数据的过程
2、使用eclipse
新建一个java项目,antlr-my
File-->New-->Java Project
![da796e0e9664f604e0bed4938fc29dd1.png](https://i-blog.csdnimg.cn/blog_migrate/9acb0c1239a2dc06bafd7c3705ffa146.jpeg)
在antlr-my项目下创建grammar、lib
![70a7078ff67ed4eb8036381331196ed4.png](https://i-blog.csdnimg.cn/blog_migrate/2f8f37d60413e743d006bf764f2ac252.jpeg)
下载antlr-3.4-complete.jar hive中用的是antlr3.4
http://www.java2s.com/Code/Jar/a/Downloadantlr34completejar.htm
将antlr-3.4-complete.jar放在lib下面
![999d6039bbd4fec34289b71118ea8923.png](https://i-blog.csdnimg.cn/blog_migrate/b9770e3548b4630d46cc8e78aee09e99.jpeg)
创建语法文件:
在grammar上面右键, New -> Other,选择 ANTLR中的Combined Grammar
![93019e46b5174661f603777ae2cd2cab.png](https://i-blog.csdnimg.cn/blog_migrate/6a23907df8494631e0555e1fe6d1cfb1.jpeg)
输入文件名Caculator
![7346c1f257745f5b506248180387b0e5.png](https://i-blog.csdnimg.cn/blog_migrate/1eca159800e4d1374dfbff3df2b11570.jpeg)
设置antlr-my项目相关的antlr插件检查设置:
在antlr-my项目上右键 -->Properties-->ANTLR
![10dcdfe0e43ff05d37790dfa2860eb69.png](https://i-blog.csdnimg.cn/blog_migrate/9f2817d287f35cff3631ccfe77739137.jpeg)
![28f908bf1fe38eb49bdf4ff5ab353e84.png](https://i-blog.csdnimg.cn/blog_migrate/0d7ca3837155eae3032d23206a603c41.jpeg)
![3a66efa03b7dddc40a1ba5716b06f3e0.png](https://i-blog.csdnimg.cn/blog_migrate/914d03ce1d46abe2fc784b1d911c63a8.jpeg)
![86c625637c88a25b37a92cde0fa4be0f.png](https://i-blog.csdnimg.cn/blog_migrate/a8331fcfdbf7e6d6ee778a6d4475a0e1.jpeg)
以上设置完了之后,点ok
在Calculator.g文件中输入内容:
![58ccdaf24f567670cfa0efbfaa853090.png](https://i-blog.csdnimg.cn/blog_migrate/77ad5b87ee7305d9167802ba1c9a3d41.jpeg)
点击Interpreter,在expr区域输入表达式1+2 点击执行按钮:
![dfb8135dcc19f9a33ba11982a3f8bb62.png](https://i-blog.csdnimg.cn/blog_migrate/7432e5c84172d7540510ca81f17ac7de.jpeg)
我们可以看到下图中具体语法分析树的结果
![6c764dc50ae74c0af645563cfc8173d1.png](https://i-blog.csdnimg.cn/blog_migrate/34dc156d4c41e3c77c0d69729beb6de2.jpeg)
3、用java来获取ASTTree
antlr自动生成了词法分析器CalculatorLexer.java和语法分析器 CalculatorParser.java的代码
![3382473a2be7edbea37c3abe59762875.png](https://i-blog.csdnimg.cn/blog_migrate/6d9daa4caef7696cb4520400edeb637e.jpeg)
创建测试类:TestCalculator.java
![3a18f15c9cd528ea8e87c02b1d9f9261.png](https://i-blog.csdnimg.cn/blog_migrate/2a694a686424b7f7e91ec54a9492f8ff.jpeg)
能够获取生成的ASTTree
![a1642f5dc2d13a2837d44d3867702bce.png](https://i-blog.csdnimg.cn/blog_migrate/f178f4fc1757fb33aa6e556f5801ba0f.jpeg)
Hey!
我是小萝卜算子
在成为最厉害最厉害最厉害的道路上
很高兴认识你
觉得有用的话
欢迎关注公众号哦