词法分析的主要目的是将输入的字符串输出为一个个单独的单词符号。即从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序。实现这种过程需要借助词法分析器,其输入时源程序,输出为单词符号,其实现过程如下:
由程序语言定义的具有固定意义的标识符。
用户不能用来表示变量名,函数名等标识符
例:C 语言中的“ if ” “ else ” “ while ” …
标识符
用户使用的,用来表示各种名字,变量名,函数名等
常数
整型、实型、逻辑、字符…
例:1000 , 3.14 , TRUE ,“ Abcd ”
运算符
+ 、 - 、 * 、 / …
界符
, ; { } ()…
剔除无用的空白,跳格(TAB),回车,换行等编辑性字符;若空白符号为单词符号的界符,就将若干空白和并为1个;
剔除注释行,比如/*…*/;
对于确定的有限自动机来说,所谓的自动机不是指一台实际的机器,而是一种数学模型(集合,函数,序列…),利用它模拟计算机识别的功能;所谓确定性是指,f(s, a) = s’ 是单值函数。对任何状态s∈S,和输入符号 a∈∑ ,f(s, a) 唯一的确定下一个状态;所谓有限性是指,S是一个有限的状态集合,并且∑是一个有限的输入符号的字母表。用上述条件,来定义一个DFA,来完成识别一个序列是否被机器所接受。确定的有限自动机是非确定的有限自动机的一个特例。
DFA的设计流程:根据题意,得到相应的正规式;由以上正规式构造相应的NFA为;用子集法对M’进行确定化;对M进行化简。
源程序→词法分析器→单词符号
单词的种类
基本字(保留字,关键字)由程序语言定义的具有固定意义的标识符。
用户不能用来表示变量名,函数名等标识符
例:C 语言中的“ if ” “ else ” “ while ” …
标识符
用户使用的,用来表示各种名字,变量名,函数名等
常数
整型、实型、逻辑、字符…
例:1000 , 3.14 , TRUE ,“ Abcd ”
运算符
+ 、 - 、 * 、 / …
界符
, ; { } ()…
语法分析器的内部设计运行方式为:
输入缓冲区、预处理子程序:
输入源程序文本,放入输入缓冲区中,词法分析工作可在这个输入缓冲区中工作;剔除无用的空白,跳格(TAB),回车,换行等编辑性字符;若空白符号为单词符号的界符,就将若干空白和并为1个;
剔除注释行,比如/*…*/;
源程序的出错列表打印;
将预处理好的子程序放到扫描缓冲区中。扫描缓冲区、扫描器:
扫描缓冲区:
设两个半区,可互补使用;
设两个指针:起点指针:指出正在识别单词起点位置;搜索指针:向前搜索以寻找单词终点。扫描器:扫描缓冲区,直接进行单词的识别。
单词符号的识别方法主要分为三种,分别为超前搜索法、直接分析法和状态转换图法,其中状态转换图法是学习的重点。为了更好地使用状态装换图构造词法分析程序,为了讨论词法分析程序的自动生成,需要将上述转换图的概念稍加形式化。词法分析器需要识别语言中具有不同特征的字,我们可以把具有相同特征的字放在一起组成一个集合,即所谓的正规集然后使用一种形式化的方法来表示正规集,即所谓的正规式。正规式是描述单词结构的一种形式;正规集是该类单词的全集。若两个正规式U和V所表示的正规集相同,则认为二者等价。我们把状态转换图再形式化一下及所谓的有限自动机有两种:确定的有限自动机(DFA)(Deterministic Finite Automata)和非确定的有限自动机(NFA)(Non-deterministic Finite Automata)。对于确定的有限自动机来说,所谓的自动机不是指一台实际的机器,而是一种数学模型(集合,函数,序列…),利用它模拟计算机识别的功能;所谓确定性是指,f(s, a) = s’ 是单值函数。对任何状态s∈S,和输入符号 a∈∑ ,f(s, a) 唯一的确定下一个状态;所谓有限性是指,S是一个有限的状态集合,并且∑是一个有限的输入符号的字母表。用上述条件,来定义一个DFA,来完成识别一个序列是否被机器所接受。确定的有限自动机是非确定的有限自动机的一个特例。
DFA的设计流程:根据题意,得到相应的正规式;由以上正规式构造相应的NFA为;用子集法对M’进行确定化;对M进行化简。
习题六 证明下列正规式关系成立
![](https://i-blog.csdnimg.cn/blog_migrate/91b5fe5f832ee769a9b1a649f4c3c490.jpeg)
习题七 构造正规式相应的DFA
![](https://i-blog.csdnimg.cn/blog_migrate/119ae378c202bfc886936e411c5a7e08.jpeg)
习题八 出下列正规表达式