#编译原理# 词法分析(三)第二部分 (4)

#编译原理# 词法分析(三)第二部分

2.全局变量和过程(即一个词法分析程序需要引用的变量和过程,一般提前定义好需要使用的,需要用时调用即可)

#编译原理# 词法分析(三)第二部分

 

 

3.词法分析程序算法

其实算法程序的具体结构还是由开发者决定的,例如是否进行字符流的回退,如何进行类型的判断等等,都是由具体的实现进行决定的。

 

将之前的完整状态图构造为算法即可

伪代码:

#编译原理# 词法分析(三)第二部分

 

#编译原理# 词法分析(三)第二部分

当词法分析程序作为子程序时,一般由语法分析程序调用,当词法分析程序组合出一个单词时就返回给语法分析语句,并且返回时应将单词的类别码送入变量单元symbol。(语法分析程序中会设有变量class,用于存放单词的类别码)

 

3.7 词法分析程序的自动生成器LEX

3.7.1 LEX基础说明

功能:输入LEX源程序便可经过LEX后生成词法分析程序L

然后输入S.P.字符串经过L便可输出S.P.单词字符串

 

主要由三部分组成:

1.规则定义式,定义识别规则中要用到的正则表达式名

2.识别规则,用正则表达式给出单词的定义和在识别后的下一步行为(例如要直行的代码片段)

3.用户子程序,给出用户需要的其他操作

各部分之间需要用%%分开

 

规则定义式:如下形式的LEX语句

#编译原理# 词法分析(三)第二部分

,D为正则表达式名字,简名;R为正则表达式

例如:

 

#编译原理# 词法分析(三)第二部分

 

 

 

识别规则:一串如下形式的LEX语句

#编译原理# 词法分析(三)第二部分

P为定义在Σ∪{D1,D2,D3.....}上的正则表达式,词形

A为语句序列,是指识别出词形为P的但此后,词法分析器所应做的动作,基本动作即返回单词的类别编码和单词值。

 

一个完整的LEX源程序:

 

#编译原理# 词法分析(三)第二部分

小提示:正则中{}+,表示至少1次重复

 

3.7.2 LEX的实现

LEX的功能是根据LEX源程序构造一个此法分析程序,该词法分析器实质上是一个有穷自动机。

LEX生成的词法分析程序由两部分组成:状态转换矩阵DFA和控制执行程序。则有LEX的功能即根据LEX源程序生成状态转换矩阵和控制程序。

LEX的处理过程:

 

NFA(空符号,多后继),DFA一定是NFA

转化成的DFA,每个新的终止状态所识别的单词类型,根据该子集包含的原NFA的终止状态而定,只包含一个,则就是那个终止状态是别的单词,如果多个,则需要加一个或。

 

1.扫描每条识别规则P构造一相应的非确定有穷自动机M

2.将各条规则的有穷自动机Mi合并成一个新的NFA M

3.NFA确定化为DFA

4.生成该DFA的状态转换矩阵和控制执行程序

 

LEX的二义性原则,两原则

例如begin是关键字还是标识符

1.最长匹配原则

在识别单词过程中,有一字符串根据最长匹配原则,应识别为这是一个符合Pk规则的单词而不是小范围的:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppdws.html