hive原始碼解析(2)之編譯前序

2021-09-13 14:41:58 字數 2489 閱讀 2960

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'

|   '/*' ( options : . )* '*/'

;//定義乙個多行注釋

ws :   ( ' '

| '\t'

| '\r'

| '\n'

) ;//定義乙個可以忽略的字元

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

@members

|  id '=' expr newline

|  newline

expr returns[int value]

:  e=multexpr

(  '+' e=multexpr

|  '-' e=multexpr

multexprreturns [int value]

:  e=atom ('*' e=atom )*

atom returns[int value]

:  int

|  id

integer v =(integer)memory.get($id.text);

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

else system.err.println("#ff0000variable "+$id.text);

|  '(' e=expr ')'

id :   ('a'..'z'|'a'..'z')+ ;

int :   '0'..'9'+ ;

newline:'"r'?'"n' ;

hive原始碼解析之語法解析

hive語法解析器是根據 上次分享的 詞法分析 生成的語法樹為基礎,進行語法解析。根據語法token的情況實現了五個具體的語法解析器。在你生成語法器的時候,semanticanalyze ctory分別針對不同的情況生成對應的某個語法器,如下 semanticanalyze ctory類 現在有五個...

原始碼編譯hive

hive hiveconf hive.root.logger debug,console debug模式執行hive 原始碼編譯hive 環境 hadoop 0.20.2 hive 0.6 svn co hive cd hive ant clean package ant package dhado...

hive原始碼解析之hive執行過程

儲存到相簿 2014 12 26 23 04 上傳 1.入口 bin cli.sh 呼叫clidriver類進行初始化過程 處理 e,f,h等資訊,如果是 h,列印提示資訊,並退出 讀取hive的配置檔案,設定hiveconf 建立乙個控制台,進入互動模式 2.在互動方式下,讀取每乙個輸命令列,直到...