怎么理解PostgreSQL的词法分析
这篇文章主要讲解了“怎么理解PostgreSQL的词法分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解PostgreSQL的词法分析”吧!
一、词法分析基本概念
首先来理清一些基本概念.
词法分析从左向右扫描输入的SQL语句,将其字符流分割成一个个的词(称为token),这些token是输入流中不可再分割的一串字符,类似于英语中单词,或汉语中的词。
SQL语句中token的类别是有限的,一般来说有常量(数值/字符/字符串等),操作符(算术操作符/逻辑操作符等),分隔符(逗号/分号/括号等),保留关键字,标识符(函数名/过程名等).如:1和200.13是数值常量token,’张三’和’广州市’是字符串常量token,+/-等是操作符token等.
Flex简介
在PostgreSQL中,使用了开源的Flex对SQL进行词法分析.
Flex全称为Fast LEXical analyser generator - scanner generator for lexing in C and C++.
Flex的输入文件格式为:
%{Declarations(声明)%}Definitions(定义)%%Rules(规则)%%Usersubroutines(用户子过程)
如:
%{#defineT_ZEOR0inti=0;%}NUM([0-9]+)%%{NUM}printf("?");//遇到数字,打印?#returnT_ZEOR;//遇到字符#,返回0.ECHO;//遇到其他字符,打印该字符%%intmain(intargc,char*argv[]){yylex();returnT_ZEOR;}intyywrap(){return1;}
该例程的运行效果如下:
[root@localhostmytest]#./mytest1t33..q?t?..q#
SQL词法分析器
使用Flex可以实现一个简单的SQL词法分析器,简单分为以下几个步骤:
1.列出SQL中所有类型的token
2.为每种token分配一个唯一的编号,同时写出该token的正则表达式
3.写出每种token的rule
sql.l
%{intcurrent_linenum=1;voidinit();voidelog(char*msg,intline);typedefenum{T_EQUAL=128,T_SELECT,T_CONST,T_STRING,T_ID}TokeType;staticchar*string_token[]={"T_EQUAL","T_SELECT","T_CONST","T_STRING","T_ID"};%}INTEGER([0-9]+)UNTERM_STRING("'"[^'\n]*)STRING("'"[^'\n]*"'")IDENTIFIER([_a-zA-Z][_a-zA-Z0-9]*)OPERATOR([+*-/%=,;!<>(){}])SINGLE_COMMENT("//"[^\n]*)%%[\n]{current_linenum++;}[\t\r\a]+{/*ignoreallspaces*/}{SINGLE_COMMENT}{/*skipforsinglelinecomment*/}{OPERATOR}{returnyytext[0];}"="{returnT_EQUAL;}"select"{returnT_SELECT;}{INTEGER}{returnT_CONST;}{STRING}{returnT_STRING;}{IDENTIFIER}{returnT_ID;}<<EOF>>{return0;}{UNTERM_STRING}{elog("Unterminatedstringconstant",current_linenum);}.{elog("Unrecognizedcharacter",current_linenum);}%%intmain(intargc,char*argv[]){inttoken;init();while(token=yylex()){if(token<128)printf("%-20c",token);elseprintf("%-20s",string_token[token-128]);puts(yytext);}return0;}voidinit(){printf("%-20s%s\n","TOKEN-TYPE","TOKEN-VALUE");printf("-------------------------------------------------\n");}voidelog(char*msg,intline){printf("\nErroratline%-3d:%s\n\n",line,msg);}intyywrap(void){return1;}
makefile
run:sql./sql<test.sqlsql:lex.yy.cgcc-o$@$<lex.yy.c:sql.lflex$<
样例SQL脚本
select*fromtest1wherec1='TEST';
执行结果:
[root@localhostsql]#make./sql<test.sqlTOKEN-TYPETOKEN-VALUE-------------------------------------------------T_SELECTselect**T_IDfromT_IDtest1T_IDwhereT_IDc1==T_STRING'TEST';;
感谢各位的阅读,以上就是“怎么理解PostgreSQL的词法分析”的内容了,经过本文的学习后,相信大家对怎么理解PostgreSQL的词法分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。