模块
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实验报告:
实验名称:词法分析
实验目的和要求
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
实验内容和步骤:
一、实验内容
对于这个实验,我总共用了四个函数,即主函数、扫描函数、建立缓冲区、取单词。主要完成的功能是从缓冲区中识别出一个个单词,并能够区分所取的单词是什么类型。
二、实验步骤
1、基于实验的内容,构造程序所需的模块
2、根据已建构的模块,写出各个模块的相应程序代码
3、在主函数中调用模块来完成所要得到的效果
在此,我想先介绍一下我的三个子模块,第一个是扫描函数。扫描函数scanner(),其实大
家都比较熟悉了,就是我们上次实验内容,可以原封不动的拿来用。它的功能是调用一次就从缓冲区中取一个字符出来。这为我们的取字符提供了基础,因此如果这个程序不会设计的话,那么这个实验就没法设计了。至于建立第二个模块,就是从文件中把一个个字符读到缓冲区,比较简单,我在这里就不想说了。接下来,我想比较地说一下第三个模块,也就是本实验的主要要求。这个模块的函数程序代码如下:
char getsym()//从缓冲区中取一个单词
{
bool flag=false;//用来
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示取出的单词是否为关键词,如果是则flag的值为true,否则为false
int k=-1; //表示取出的字符放在单词数组的指针
CType='0'; //预先定义的取出的单词的类型
Lasttype='0'; //初始化先前的类型,此变量为判断正负数用
while (ch<=32 && ch>0)//去掉不能显示的字符
Fbuffer=scanner();
if (ch>='a'&& ch<='z'|| ch>='A'&& ch<='Z')//取出标识符或者是关键词
{
k=-1;
while(true)//取出的单词长度不超过WMaxlen,如果超过,则其后的字符无效
{
if((++k)
='a'&& ch<='z'|| ch>='A'&& ch<='Z'||ch>='0' && ch<='9'))
break;
}
Word[++k]='\0';//以'\0'标识取出单词的结束,以方便后面的判断此单词是标识符还是关键词
for (int i=0;i='0' && ch<='9')//判断是不是为整数
{
Word[++k]=ch;
Fbuffer=scanner();
while(true)//如果是数字,则一直接受,且定义它的类型为3
if(ch>='0' && ch<='9')
{
Word[++k]=ch;
Fbuffer=scanner();
}
else {CType='3';break;}//不是数字则跳出循环
//如果以字母开头,且长度不超过WMaxlen,且下面跟有字母,则此整数非法,输出类型为8,在主程序中输出出错信息
if (k='a'&& ch<='z'|| ch>='A'&& ch<='Z')
{
Word[++k]=ch;
Fbuffer=scanner();
//取这个非法整数的单词,其中可包含英文字母和数字
while (ch>='a'&& ch<='z'|| ch>='A'&& ch<='Z'|| ch>='0' && ch<='9'||Fbuffer==-1)
if (kWMaxlen)//如果长度大于取出单词定义的最大长度,则返回类型为8,在主程序中打出出错信息
CType=Longtype;
else CType=Errtype;//否则返回类型7,在主程序出错,并明确写出此单词的具体内容
}
Word[++k]='\0';
}
else if (ch=='+'||ch=='-'||ch=='*'||ch=='/')//取出是运算符号的单词
{
Word[++k]=ch;
if (ch=='+' || ch=='-')//如果是+号或者是-号,则还要判断是不是正负数
if (Lasttype=='6')//判断其取出的当前字母的前一个单词是6号类型的,即是<、>、<=、>=、==、=时则可判断现在取出的是整数
{
Fbuffer=scanner();
while(ch>='0' && ch<='9')//取出整数
{
Word[++k]=ch;
Fbuffer=scanner();
}
CType='3';//如果正负整数,则直接返回类型为3,则表示此单词为整数
return(CType);
}
else Fbuffer=scanner();//如果不是整数,则定义当前取出的单词是运算符,定义此类型为4
Word[++k]='\0';
CType='4';
}
else if (ch=='>'||ch=='<'||ch=='='||ch=='!')//取出运算符的另几类,即<、<=、>、>=、==、=、!=
{
Word[++k]=ch;Fbuffer=scanner();
if( ch=='=')//判断是不是<=、>=、==、!=
{
Word[++k]=ch;
Fbuffer=scanner();
}
Word[++k]='\0';
for (int i=0;i
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
:
1、 出现致命错误,
原因分析:原来把定义取出单词的最大长度放在缓冲区中的最大长度上了。
解决:把缓冲区的长度重新定义一下。
2、
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
错0误,老是在输出的答案中多出一个0字符
原因分析:定义存放在单词字符串中的指针初始值为—1,结果在while(true)以后做赋值操作,这样就多出一个字符
while(true)
if(k)
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
以后,如果能比较顺手的解决的话,那是一件比较开心的事。只是有些时候越想问题就会越多,也越难解决,那就得慢慢调试,慢慢推导了。相信只要想得出,就能调得出,当然耐心是很重要的,花在上面的时间也是要多一点的。