词法分析是编译过程的一个阶段:从左到右逐个字符的读入源程序,并对源程序字符流进行扫描和分解,识别出一个个单词。(对源程序的结构进行分析)
PL/0编译程序将词法分析器作为子程序来调用,以语法分析器为主,语法分析器工作,需要词法分析器的输出作为输入,语法分析器需要分析时,发出请求调用词法分析器,词法分析器以二元式形式输出分析得到的单词符号,然后输入到语法分析器作为回应。(词法分析与语法分析在同一遍里,省掉了中间文件或储存区)
单词符号一般分类:
1.关键字(例:If、while)
2.标识符(例:常量名、变量名)
3.常数(例、25、3.14、TRUE、ABC)
4.运算符(例:+ - )
5.界符(例:逗号、括号)
二元式表示单词符号:(单词种别,单词自身的值)<例:(3,‘while’),‘3’表示单词种别为‘关键字’,该单词种别的值为‘while’>
词法分析器其他任务: 滤掉空格和注释、将行号与错误信息关联编译定位、完成编译预处理等
词法规则描述工具(即单词描述工具,分为两类:形式化、半形式化):状态转换图、有穷自动机、正则表达式、正则文法等
即两者之间的相互转换
转换规则如下:
分两类:
FA的表示(五元式):
(状态结点集,输入符号表,转换函数,初态集,终态集)
注:
即:将NFA装换为等价的DFA
方法:子集构造法
步骤:
即:化简DFA
方法:分割法
步骤:
1.第一次分割:
非终态:I0 = {1,2,3,4} ;
终态:I1 = {5,6,7} ;
2.根据输入到达关系检验:
输入a时:
检验I0= {1,2,3,4}: 1、2 到达了I1= {5,6,7}
将1、2从I0= {1,2,3,4}中分割出去: {1,2},{3,4},{5,6,7}
再对I2 = {5,6,7}检验输入a的到达情况:6、7到达了I1= {3,4}
将6、7从I2 = {5,6,7}中分割出去:{1,2},{3,4},{5},{6,7}
再对I0 = {1,2}检验输入a的到达情况:1、2都到达了I3 = {6,7},则不需要分割
再对I1 = {3,4}检验输入a的到达情况:3到达了I0 = {1,2}
将3从I1 = {3,4}中分割出去:{1,2},{3},{4},{5},{6,7}
跳过单元素的I2 = {4},I3 = {5},对I4 = {6,7}检验输入a的到达情况:1、2都到达了I2 = {4},则不需要分割
输入b时:
重复检验输入a情况的方法,对输入b的情况进行分析
3.最终得: I0 = {1,2} ,I1 = {3} ,I2 = {4},I3 = {5},I4 = {6,7}
4.{1} , {3} , {4}, {5},{6},重构输入到达表:
5.画出对应化简后的DFA:
即:正规式与FA的相互转换
转换规则(3条):
‖
2.如下:
‖
‖
(应用3条规则即可完成互相转换)