• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

hive diligentman 3个月前 (08-29) 30次浏览

这篇主要举实际案例说明怎么使用antlr工具、利用antlr生成的Lexer、Parser、TreeParser代码,获取asttree。这些都是hive获取asttree的过程,理解了这些,再理解hive的asttree就很容易了

 

程序设计语言入门小案例一般都用“Hello World”,在编译领域的入门往往选择计算器。而我们这次的小案例就更简单:一个只能计算【两】个【整数】相【加】的计算器,比如:计算1+1…

 

先来考虑一下如果何下手,在我们的计算器中,只接受输入整数和加号,其它的一概不理。这里说的是整数,如果输入了一个字母,我们一定是要拒绝的…对于这一块要写对应的词法规则,这个阶段的过程就叫做词法分析

 

输入满足词法的规则,并不代表我们就能接受,如果是【加号】【整数】【整数】或者【整数】【整数】【加号】这样的排列,我们是不能接受的,这里接受的合法语法是【整数】【加号】【整数】,因此我们需要在词法规则的基础上再定义语法规则,规则定输入满足这样句式的才算是合法… 我们把这个阶段叫做语法分析

 

弄清楚了我们的词法、语法规则后,我们需要以antlr的语言把这些写出来。

antlr语法博大精深,我觉得没必要钻的太深,实现这个案例,用不到antlr太多复杂的语法,只用看懂就行


1、使用antlrworks

双击antlrworks-1.5.1.jar启动antlrworks

File–>New

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

选择ANTLR 3 Grammer  (*.g)  新建Calculator语法文件

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

输入规则:

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

ctrl+s 保存

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

Antlr的语法文件通常会保存在一个 .g的文件中,我们的语法文件叫做 Caculator.g,保存在E:hiveanltrcalculator 目录 下

在E:hiveanltrcalculator目录 创建output目录

File–>Preferences设置Output path

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

运行调试,点击图标中的小甲虫

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

在弹出来的调试界面中,选择 text

输入 1+2

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

之后将会在output窗口看到被识别出来的token流,以及具体语法分析树和ASTTree的结果

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

到此,就是简单使用anltrworks用语法文件来解析输入数据的过程

2、使用eclipse

 

新建一个java项目,antlr-my

File–>New–>Java Project

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

在antlr-my项目下创建grammar、lib

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

下载antlr-3.4-complete.jar   hive中用的是antlr3.4

http://www.java2s.com/Code/Jar/a/Downloadantlr34completejar.htm

将antlr-3.4-complete.jar放在lib下面

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

创建语法文件:

在grammar上面右键, New -> Other,选择 ANTLR中的Combined Grammar

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)输入文件名Caculator

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

设置antlr-my项目相关的antlr插件检查设置:

在antlr-my项目上右键 –>Properties–>ANTLR

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

以上设置完了之后,点ok

在Calculator.g文件中输入内容:

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

点击Interpreter,在expr区域输入表达式1+2 点击执行按钮:

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

我们可以看到下图中具体语法分析树的结果

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

3、用java来获取ASTTree

 

antlr自动生成了词法分析器CalculatorLexer.java和语法分析器 CalculatorParser.java的代码

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

创建测试类:TestCalculator.java

 

Hive源码阅读系列(六)编译模块之词法、语法解析 (中)

 

能够获取生成的ASTTree

 


程序员灯塔 , 版权所有
转载请注明原文链接:https://www.wangt.cc/2019/08/115db05c33/
喜欢 (0)