Postgres 词法分析和语法分析

本文详细介绍了Postgres数据库如何处理SQL命令,包括词法分析和语法分析的过程,涉及Unix工具Yacc和Lex(Bison和Flex)的使用。文章列举了postgres相关的关键文件,如kwlist.h、kwlookup.cpp、scan.l和gram.y,解释了它们在解析过程中的作用。同时,讨论了词法分析器yylex()和语法分析器yyparse()的实现,以及bison的基本原理和lex的规则段中的正则表达式应用。
摘要由CSDN通过智能技术生成

1: 基本概念

postgres数据库将用户输入的sql命令作为字符串传递给查询分析器,并对其进行词法分析和语法分析,最后生成分析数。

2: 使用工具

词法分析和语法分析是由Unix工具Yacc和Lex制作的。具体使用的是Bison和Flex。

3:postgres相关的文件

[1] kwlist.h: 声明keyword列表(包括保留关键字和非保留关键字,关键字是SQL 语句中具有特殊含义的单词,例如 SELECT , UPDATE , DELETE 等等。 它们之中有的能够直接作为标识符,被称为非保留关键字(简称非保留字),但有需要经过特殊处理(比如加create table `rank`...)才能作为标识符的字,被称为保留关键字(简称保留字))。

具体的:keyword: (name, token_value,category)。

[2] kwlookup.cpp: 定义ScanKeywordLookup函数实现,该函数判断输入的字符串是否是关键字,若是关键字,则返回关键字列表中单词的指针,采用二分查找。没有匹配的则返回NULL。

[3] scanup.c:提供几个词法分析时常用的函数。scanstr函数处理转义字符,downcase_truncate_identifier函数将大写英文字符转换为小写字符,truncate_identifier函数截断超过最大标识符长度的标识符,scanner_isspace函数判断输入字符是否为空白字符

[4] scan.l:定义词法结构,编译生成scan.c;这里会忽略comment等无用信息。

[5] gram.y:定义语法结构,编译生成gram.c;分析后生成语法分析树。

[6] check_keywords.pl: 检查在gram.y和kwlist.h中定义的关键字列表是否一致

4: postgres相关的执行顺序:

        

5: 函数入口raw_parser:

给一个sql语句进行词法分析和语法分析,最后生成一个解析树parsetree.

其中重要的三步:[1] 初始化flex

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值