一、背景
在分析阅读pg 11的源代码时,发现pg的语法分析模块使用了Lex&Yacc。
pg使用的的Flex & bison——lex & yacc的升级版。
二、Flex & bison简介
Flex和bison是两个用来生成程序的工具,它们生成的程序分别叫做词法分析器和语法分析器,postgresql主要是用来生成SQL语句的词法和语法分析器。
三、Flex & bison 的工作流程
任何一种语言,都是有一定的语法规则的,不管是人类的语言,还是计算机语言(如C/C++编程语言等),因此,可以利用这些已知的规则,来对相应的语言进行分析。
例如汉语中的一个句子,基本的格式是:主(名词/代词)+谓(动词)+宾(名词/代词),当你在说一句话的时候,我们把你说的话(输入)先拆分成一个个有意义的字或者词组,然后对照该语法,看词性及组合,是否符合既定的语法规范,如果符合,则可以知道你说的话是符合规范的。
比如,你说“我吃饭”,输入会被依次拆成:“我”、“吃”、“饭”
它们分别是代词、动词、名词,因此符合上面的语法规则,因此这句话是OK的。而如果说“我饭吃”,则会发现与上面的规范不符合(也没有其他符合的规范),因此这句话语法上是有问题的。
Flex和bison生成的词法和语法分析器就是干这两件事的:
1. Flex生成的词法分析器将输入拆分成一个个记号(token);
2. bison生成的语法分析器根据已有的规则,分析这些token的组合,是否符合语法规范。
四、总结
本文主要介绍了Lex & Yacc 的用途和工作流程。