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规则的单词而不是小范围的: