sum =sum+i;
}
再运行输入、扫描程序进行调试,输出必须与上面a.c文件中输入的代码相同。
[实验报告]:
1、写出调试程序出现的问题及解决的方法。
2、写实验报告及程序清单。
3、报告给出测试的结果。
实验二无符号数的有穷自动机的实现
学时数:
4
[实验内容]:
无符号数的有穷自动机的实现。
利用状态表和有限自动机的运行原理编制程序,使得程序能够识别一个输入串是否为一个无符号定点实数。
[实验目的]:
1、理解有限自动机的作用;进一步理解自动机理论。
2、用状态图和状态表表示有限自动机;
3、以程序实现有限自动机的运行过程;掌握文法转换成自动机的技术及有穷自动机实现的方法。
[实验要求]:
1、设计要求:
利用状态图或状态表相关理论,利用有限自动机理论。
2、功能要求:
输入一个单行无空格的字符串(以“#”号结束),如果该字符串是一个合法的输入,则显示“接受”,否则显示“不接受”。
3、输入/输出示例(以无符号定点实数为例):
(1)输入:
“3.14”,输出:
“接受”;
(2)输入:
“3.1.4”,输出:
“不接受”;(3)输入:
“3ab”,输出:
“不接受”。
[实验提示]:
1、无符号数的BNF描述如下:
0.<无符号数>∷=<无符号数整数>|<无符号数实数>
1.<无符号数实数>∷=<无符号数整数>.<数字串>[E<比例因子>]|<无符号数整数>[E<比例因子>]
2.<比例因子>∷=<有符号数整数>
3.<有符号数整数>∷=[<正负号>]<无符号数整数>
4.<正负号>∷=+|-
5.<无符号数整数>∷=<数字串>
6.<数字串>∷=<数字>{<数字>}
7.<数字>∷=0|1|2|…|9
2、根据G[<无符号数>]文法构造成状态转换图(有穷自动机),见图1。
图1
例:
一个无符号定点小数的有穷自动机状态图:
见图2
图2
3、构造状态矩阵;将有穷自动机的状态S1S2……Sn及输入的字a1a2……am构成一个n*m的矩阵。
1)根据状态矩阵设计出一个词法分析程序识别无符号数。
2)扫描无符号数,根据文法给出无符号数出错的位置。
[实验报告]:
1、写出无符号数词法分析的思想。
2、画出算法流程图。
3、写出调试程序出现的问题及解决的方法。
4、打印实验报告及程序清单。
5、报告给出测试的结果。
根据有限自动机原理设计出无符号定点小数的状态表:
行的下标值表示当前状态;列的下标值表示输入的字符即数字或小数点(设0表示数字,1表示小数点)。
列行
0
数字
1
小数点
0
1
2
1
1
2
2
3
-1
3
3
-1
第0列上的元素值表示为输入数字的后继状态;第1列上的元素值为输入小数点的后继状态;
第i行(也就是行号)表示第i个状态,该行上对应列上的元素值是输入数字或小数点的后继状态。
有了状态表后就可以构造出一个两维数组state,从状态表可以看出这是一个4行2列的数组。
例:
在程序中设计一个两维数组state来构造一个静态状态表,将状态表中的数赋予两维数组。
State[4][2]={{1,2},{1,2},{3,-1},{3,-1}};
状态表中行0,1,2,3表示状态,-1表示没有此状态,其中1表示整数部分的状态,2表示小数点的状态,3表示小数部分的状态。
程序中设变量S为为状态,初始状态s=0,d变量表示输入的字符,当输入字符是0-9的数字d=0,输入字符是小数点则d=1。
根据状态s和d就可以取出他的后继状态s=state[s][d],判断后继状态s的值就可识别无符号定点实数。
设置一个表示终态标志数组intQ[s]={0,1,0,1};其中列号表示状态,对应的元素值为终态标志,0非终态,1终态。
从状态图中可以看到,只有在1和3状态下(也就是在输入数字时)出现正常结束,所以一列和三列上对应的元素值设为1。
试验示例:
有限自动机的运行
程序功能:
利用状态表和有限自动机的运行原理,识别一个输入串是否为一个有效的无符号定点实数。
例:
输入:
1#
输出:
接受
输入:
3.14#
输出:
接受
输入:
3ab#
输出:
不接受
输入:
1.2.3
输出:
不接受
输入数据要求:
不能有空格,以'#'结束(在本程序也可以不用'#'结束)。
输出要求:
如果是无符号定点实数,显示“接受”;否则显示“不接受”。
注:
同学们可以将状态表改变成识别“无符号实数”的有限自动机的状态表,编写程序、调试、运行。
实验三词法分析处理(查添符号表)
学时数:
4
[实验内容]:
1、查添符号表(标识符为以字母开头的字母数字串)。
2、读入标识符,若表中已有该标识符,则取出其在表中的位置,输出该标识符极其编号;否则产生一个新的编号,连同标识符一起添入名表;最后输出标识符表。
[实验目的]:
1、了解符号表的几种结构,掌握符号表的存取方法。
2、了解编译时如何对标识符进行处理。
3、掌握词法扫描,查填符号表.
[实验要求]:
1、从键盘上输入标识符,标识符之间用逗号隔开,最后以分号结束(也可以用其他符号做结束标志)。
如:
a1,b,x1,x2,y,ac2;
2、编号从100开始,最后输出的标识符不能有重复出现;
3、标识符的长度必须小于或等于8个字符。
[实验步骤]:
1、根据标识符的文法规则,画出标识符的状态转换图。
2、画出读取标识符的程序框图。
3、写出程序,上机调试并输出结果。
[实验提示]:
1、标识符的BNF描述如下:
0.<标识符>∷=<字母>{<字母>|<数字>}
1.<字母>∷=A|B|C|…|Z|a|b|c|…|z
2.<数字>∷=0|1|2|…|9
2、画出标识符的状态转换图,设计出一个词法分析程序识别出标识符。
读入一个字符,首字符必须是字母,其后读入的字符为字母或数字,若不符合这个文法则显示出错信息。
3、构建符号表,将识别出的标识符添入符号表。
若表中已存在该标识符,标识符不添入符号表,则输出该标识符及其在表中的编号,并统计单词出现的次数;否则产生一个新的编号,连同标识符一起添入符号表,最后输出标识符表。
标识符的状态转换图:
实验结果分析:
如果在输入文件中分别出现字符串长度超过8个、有两个或者两个以上的”;”连续出现、出现汉字非规定字符和以数字开头等会出现什么样的情况?
编程说明:
1、变量数组的说明:
1)定义一个工作数组A,该数组有8个元素(标识符长度为8)。
2)定义标识符表结构id包含两个成员,数组name存放登记标识符名字,变量addr记录标识符编号。
3)如果工作数组A中为合法标识符,则将其名字填入结构id中的name数组,将其编号填入addr数组。
若工作数组A中为非法标识符,错误标志errty置1,显示出错信息。
4)用变量K记录读入的标识符个数。
5)用变量I记录每个标识符的字符个数。
6)用变量errty记录标识符首字符非字符的错误标志。
若工作数组A中为非法标识符,错误标志errty置1,显示出错信息。
7)用变量errty1记录标识符中有非字母数字字符的错误标志。
标识符输出形式:
标识符名称标识符编号
star1
next12
loop13
建立一个标识符表结构structid,结构中包括两个成员,一个数组name[]存放标识符名