实验一、词法分析实验
专业:商软2班 姓名:司徒春燕 学号:201506110187
一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
待分析语言的词法规则。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名×××.c
可执行程序名:×××.exe
词法分析.c
- 2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
原理分析:让用户输入程序代码,将代码以字符串的形式存入文件中,再将文件作为参数传到词法分析函数中,识别出各个具有独立意义的单词,即基本关键字、标识符、数字、运算符、分隔符五大类。并依次输出各个单词的种别。
流程图:
- 3. 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
FILE *fp;
char ch;
printf("请输入源程序代码(以#键结束): ");
if((fp=fopen("data.txt","w"))==NULL)
{
printf("Failure to open data.txt! ");
exit(0);
}
ch=getchar();
while(ch!='#') //将字符串存放到文件中
{
fputc(ch,fp);
ch=getchar();
}
fclose(fp);
//词法分析,识别文件中的字符串
while(!feof(fp))
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='='||ch=='>'||ch=='<') //判断判断运算符
printf("%c 运算符 ",ch);
else if(ch==';'||ch=='{'||ch=='}'||ch=='('||ch==')')//判断分隔符
printf("%c 分隔符 ",ch);
else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
//判断字符是不是字母
{
if((fp1=fopen("data1.txt","w"))==NULL)
{
printf("Failure to open data1.txt! ");
exit(0);
}
while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
//将每个字母合并成一个字符串放到一个新的文件中
{
fputc(ch,fp1);
i++;
ch=fgetc(fp);
}
fclose(fp1);
if((fp1=fopen("data1.txt","rb"))==NULL)
//从文件中读取字符串
{
printf("Failure to open data1.txt! ");
exit(0);
}
fgets(alp,i+1,fp1);
for(j=0;j<30;j++)
{
if(strcmp(alp,keyword[j])==0)
//判断是否为关键字或标识符
flag=1;
}
if(flag==1)
printf("%s 关键字 ",alp);
else
printf("%s 标识符 ",alp);
fclose(fp1);
Analyse(fp,ch);
}
else if(ch==' '||ch==' ')//识别回车和空格
printf(" ");
else if(ch>='0'&&ch<='9')//识别数字
{
if((fp2=fopen("data2.txt","w"))==NULL)
{
printf("Failure to open data2.txt! ");
exit(0);
}
while(ch>='0'&&ch<='9')
{
fputc(ch,fp2);
n++;
ch=fgetc(fp);
}
fclose(fp2);
if((fp2=fopen("data2.txt","rb"))==NULL)
{
printf("Failure to open data2.txt! ");
exit(0);
}
fgets(num,n+1,fp2);
printf("%s 数字 ",num);
fclose(fp2);
Analyse(fp,ch);//递归继续识别
}
- 4. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
这次实验对我来说是挺难的,花了很长的时间来做的,程序还有很多地方有待完善。
实验过程中我觉得比较难的是输入源程序,然后录入,再者就是从文件中识别字符串,我通过向同学请教,得知字符串可以存放在文件中,然后整个程序是靠文件来支撑的。