PHP核心理解-flex和bison入门


一般词法分析器和语法分析器会一起使用,语法分析器会调用词法分析器来读取输入,词法分析器匹配到特定的模式后,就向语法分析器报告(类型和值之类的)。也就是说,词法分析器的工作,就是读取、报告、再读、再报告,而语法分析器的工作,就是调用词法分析器读取,以及根据词法分析器的反馈,看输入是否和语法规则匹配。

一、Lex

Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义。

一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。

1、当 Lex收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。 它一次读入一个输入字符,直到找到一个匹配的模式。 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。
2、另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。

Lex 和 C 是强耦合的。一个 .lex 文件(Lex 文件具有 .lex 的扩展名)通过 lex 公用程序来传递,并生成 C 的输出文件。这些文件被编译为词法分析器的可执行版本。

二、Yacc

Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语 法解析器。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例,Yacc 文件有 .y 后缀。

三、flex:词法分析器

flex是一个词法分析器,一个Lex的GNU实现。用来将一个.l文件生成一个.c程序文件。即生成一个词法分析器。然后读取输入,和正则表达式匹配,再执行相应的动作,实现了程序的功能。

我们可以发现flex实现在程序外部就可以接受输入的功能。

四、bison:语法分析器

一个Yacc的GNU实现,根据文法把一系列的记号转换成一个语法分析树。

五、re2c:词法解析器

re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器。它可以产生高效代码,基于C语言,可以支持C/C++代码。 与其它类似的扫描器不同,它偏重于为正则表达式产生高效代码(和他的名字一样)。因此,这比传统的词法分析器有更广泛的应用范围。

PHP在最开始的词法解析器是使用的是flex,后来PHP的改为使用re2c。 在源码目录下的Zend/zend_language_scanner.l 文件是re2c的规则文件, 如果需要修改该规则文件需要安装re2c才能重新编译。

六、php使用的词法解析器和语法解析器

词法解析器:re2c
语法解析器:bison

参考

1、Yacc 与 Lex 快速入门
2、The Lex & Yacc Page
3、PHP的词法解析器:re2c
4、Bison的使用
5、PHP语法分析器:RE2C && BISON 总结
6、编译技术,从BNF范式到文法识别简介
7、flex&bison 学习笔记

你可能感兴趣的:(PHP核心理解-flex和bison入门)