当前位置: 首页 > news >正文

hive源码解析(2)之编译前序

Antlr(ANother Tool for LanguageRecognition)

ü     一种语言识别工具

ü     Antlr提供了一种语言工具框架

ü     定义标示符,关键字(词法分析)

ü     定义表达式(语法分析)

ü     可以将文本转换成抽象语法树(AST)

ü     树的解析(树分析器)

 

(1)词法分析器Lexer

ü  词法分析识别的是字符流

ü  通过词法规则,依次读入字符,并转换成记号(Token)

例如,s e l e ct--->select 关键字的过程就是一个词法分析的过程

ü  词法分析过程是一个ASCII分类整理的过程,哪些地方可以跳过(空格、换行、注释) ,哪些记号属于标识符,哪些记号属于字符串、整数、浮点数等。

ü  词法部分的定义以大写字母开头

词法分析器常见定义:

ID  :        ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*

    ;//定义一个字符

 

INT :          '0'..'9'+

    ;//定义一个正整数

 

FLOAT

   :   ('0'..'9')+ '.' ('0'..'9')*EXPONENT?

   |   '.' ('0'..'9')+ EXPONENT?

   |   ('0'..'9')+ EXPONENT

    ;//定义一个浮点数

COMMENT

   :   '//' ~('\n'|'\r')* '\r'? '\n'{$channel=HIDDEN;}

   |   '/*' ( options {greedy=false;}: . )* '*/' {$channel=HIDDEN;}

    ;//定义一个多行注释

 

WS :   ( ' '

       | '\t'

       | '\r'

       | '\n'

       ) {$channel=HIDDEN;}

    ;//定义一个可以忽略的字符

 

STRING

   :  '"' ( ESC_SEQ |~('\\'|'"') )* '"'

    ;//定义一个字符串

 

CHAR: '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''

    ;

 

fragment

EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+;

 

fragment

HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

 

fragment

ESC_SEQ

   :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')

   |   UNICODE_ESC

   |   OCTAL_ESC

    ;

 

fragment

OCTAL_ESC

   :   '\\' ('0'..'3') ('0'..'7')('0'..'7')

   |   '\\' ('0'..'7') ('0'..'7')

   |   '\\' ('0'..'7')

    ;

 

fragment

UNICODE_ESC

   :   '\\' 'u' HEX_DIGIT HEX_DIGITHEX_DIGIT HEX_DIGIT

;

 

(2)语法分析器(Parser)

ü  根据词法分析输出的记号流,分析语法结构,并添加代表语法结构的抽象单词(如:表达式、类、方法等),按照语法结构生成语法树的过程

ü    语法分析定义了输入字符串的合法性

ü    语法分析将词与词之间的关系用一个语法树表达出来

ü    语法部分的定义由小写字母开头、

ü    语法分析可以生成抽象语法树(AST)

 

(3)树分析器(TreeParser)

ü  树分析器可以用于对语法分析生成的抽象语法树进行遍历,并能执行一些相关的操作。

 

grammar Expr;

 

@header {

package test;

importjava.util.HashMap;

}

 

@lexer::header{package test;}

 

@members {

/** Mapvariable name to Integer object holding value */

HashMap memory= new HashMap();

}

 

prog:   stat+ ;

               

stat:   expr NEWLINE{System.out.println($expr.value);}

    |  ID '=' expr NEWLINE

        {memory.put($ID.text, newInteger($expr.value));}

    |  NEWLINE

    ;

 

expr returns[int value]

    :  e=multExpr {$value = $e.value;}

        (  '+' e=multExpr {$value += $e.value;}

        |  '-' e=multExpr {$value -= $e.value;}

        )*

    ;

   

multExprreturns [int value]

    :  e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*

    ;

 

atom returns[int value]

    :  INT {$value = Integer.parseInt($INT.text);}

    |  ID

        {

        Integer v =(Integer)memory.get($ID.text);

        if ( v!=null ) $value = v.intValue();

        else System.err.println("#ff0000variable "+$ID.text);

        }

    |  '(' e=expr ')' {$value = $e.value;}

    ;

 

ID :   ('a'..'z'|'A'..'Z')+ ;

INT :   '0'..'9'+ ;

NEWLINE:'"r'?'"n' ;

WS  :   (''|'"t')+ {skip();} ;

 


相关文章:

  • eCharts.js使用心得
  • ABAP POH和POV事件中 获得屏幕字段的值
  • Hive优化(2)之系统评估reduce数为1的MR Job优化
  • RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载
  • hive中间接实现不等值连接
  • python之字符编码
  • Hadoop计算文件大小
  • 在Oracle中利用SQL_TRACE跟踪SQL的执行
  • Linux添加/删除用户和用户组
  • Hive优化(3)之随机数避免数据倾斜
  • Angular2学习(一)
  • hive优化(4)之mapjoin和union all避免数据倾斜
  • hive cli
  • Hive优化(5)之选择合适的map数
  • C++ 文件操作(CFile类)
  • SegmentFault for Android 3.0 发布
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2017前端实习生面试总结
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • echarts花样作死的坑
  • HashMap剖析之内部结构
  • Java的Interrupt与线程中断
  • k8s 面向应用开发者的基础命令
  • Laravel Telescope:优雅的应用调试工具
  • mysql_config not found
  • node和express搭建代理服务器(源码)
  • Redis在Web项目中的应用与实践
  • Spring核心 Bean的高级装配
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 服务器从安装到部署全过程(二)
  • 构建二叉树进行数值数组的去重及优化
  • 浏览器缓存机制分析
  • 一起参Ember.js讨论、问答社区。
  • 优化 Vue 项目编译文件大小
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 最近的计划
  • ​【已解决】npm install​卡主不动的情况
  • #Linux(权限管理)
  • #pragma data_seg 共享数据区(转)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $refs 、$nextTic、动态组件、name的使用
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (推荐)叮当——中文语音对话机器人
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Sublime Text3配置Lua运行环境
  • (转)德国人的记事本
  • (转)原始图像数据和PDF中的图像数据
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端