试验一词法分析试验.docx

上传人:b****4 文档编号:809882 上传时间:2022-10-13 格式:DOCX 页数:30 大小:371.92KB
下载 相关 举报
试验一词法分析试验.docx_第1页
第1页 / 共30页
试验一词法分析试验.docx_第2页
第2页 / 共30页
试验一词法分析试验.docx_第3页
第3页 / 共30页
试验一词法分析试验.docx_第4页
第4页 / 共30页
试验一词法分析试验.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

试验一词法分析试验.docx

《试验一词法分析试验.docx》由会员分享,可在线阅读,更多相关《试验一词法分析试验.docx(30页珍藏版)》请在冰豆网上搜索。

试验一词法分析试验.docx

试验一词法分析试验

实验一源程序的输入和扫描

学时数:

2

[实验内容]:

1、编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现);然后从缓冲区中依次取出字符显示在屏幕上。

2、从文件每次读入一行到输入缓冲区的功能(可以用字符数组实现)用一个子程序实现。

[实验目的]:

1、通过编制一个源程序的输入、扫描程序,熟悉和了解从文件中读入数据到输入缓冲区的过程。

[实验步骤]:

1、准备:

用TC、VC++等开发工具;确定被处理的语言的语法特点(初步确定,可使用现成语言如Pascal、C等)。

编好程序,写好实验报告。

2、上机:

输入源程序,修改、调试,运行。

编程思想:

采用一个子程序实现的形式。

(1)程序判断源文件是否为NULL,如果是,则输出错误提示!

如果不是,则进入循环。

(2)调用子程序readbuffer(),每次读入一个字符给字符变量,如果字符变量的内容不是回车符,则把字符变量的内容存入数组buffer(),然后读入下一字符,再判断再存入数组,直到一行全存入数组,然后返回主程序,用输出语句输出刚才存入数组的一行字符;

(3)如果没有到文件尾,则重复第

(2)步,直到文件结束,则退出主程序,完成任务!

[程序要求]:

1)首先在E盘上建立一个A.c文件,文件内容如下:

A.c文件内容:

main()

{inta,b,c;

a=10;b=20;

c=a+b;

}

2)然后用C语言编写 一个输入、扫描程序,实现将E盘上建立的文件内容读入缓冲区,并在屏幕上输出该文件内容,要求运行的输出结果与输入的文件内容相同。

运行和调式程序,看输出的文件内容是否和输入的格式一样。

本次实验主要熟悉用C语言实现文件的输入和输出过程,目的就是让同学了解如何实现从键盘输入字符串并写入文件中,然后从文件中读出字符,并按照输入的格式输出在屏幕上。

  源程序:

 输入、扫描程序源代码(仅供参考):

   

 #include

#include

#include

int i;

FILE *fp;

char buffer[256];

//声明变量

int readbuffer()//读字符子程序开始

{

int j=0;

char ch;

while(j<256)

{

ch=fgetc(fp);

if (ch=='\n') //字符变量的内容是回车符吗?

{

i=j;return 0;//是回车符,保存字符个数返回0。

}//if

buffer[j]=ch;//不是回车符,把字符变量的内容存入数组buffer(),字符个数加1。

++j;

}//While

return 1;

}//子程序结束

main()//main()开始

{

if((fp=fopen("d:

\\a.c","r"))==NULL)//文件是否为NULL,这里的路径必须用两个斜杠’\\’,其中一个是C语言中的格式符。

{

printf("THE FILE DOESN’T OPEN!

");//如果是,则输出错误提示。

exit(0);

}

while(!

feof(fp))//到文件尾否,到文件尾feof()函数则返回非零值,循环结束。

{

int j;

j=0;

readbuffer();//如果没有到文件尾,则读入一个字符

while(j

{

printf("%c",buffer[j]);//读入字符个数小于源文件语句行的字符个数,则输出字符

j++;//一行字符个数加一

}

printf("\n");//否则输出回车

getch();

}

fclose(fp);

getch();

}//main()结束

//程序结束

再将输入的A.c文件内容改为如下:

d:

\\a.c.。

main()

{int sum=0,i;

float k;

scanf ("%f plese input (0-100) to total!

",&k)

 for(i=0;i

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[]存放标识符名

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1