实验一、词法分析实验
专业:商业软件工程3班 姓名:张德标 学号:201506110200
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
内容:对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号以供语法分析只用,发现语法错误,则返回出错信息
要求:输入源程序字符串,输出二元组(种别,单词符号本身)
三、 实验方法、步骤及结果测试
1. 源程序名
2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
3.主要程序段及其解释:
#include<stdio.h>
#include<string.h>
void fengxi();
char a[80],b[8];
char ch;
int p,x,y,i,k,m=0,r;
char *c[6]={"begin","if","then","while","do","end"};
void fengxi() //主要实现词法分析的函数
{
for(i=0;i<8;i++) b[i]=NULL;
ch=a[p++];
while(ch==' ')
{
ch=a[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) // 标识符或者是变量名
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
b[m++]=ch;
ch=a[p++];
}
b[m++]='\0';
p--;
x=10;
for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较
if(strcmp(b,c[i])==0)
{
x=i+1;
break;
}
}
else if((ch>='0'&&ch<='9')) // 数字
{
{
y=0;
while((ch>='0'&&ch<='9'))
{
y=y*10+ch-'0';
ch=a[p++];
}
}
p--;
x=11;
if(y>32767) //整数的最大范围比较
x=-1;
}
else switch(ch) // 其他字符
{
case'<':m=0;b[m++]=ch;
ch=a[p++];
if(ch=='>')
{
x=21;
b[m++]=ch;
}
else if(ch=='=')
{
x=22;
b[m++]=ch;
}
else
{
x=23;
p--;
}
break;
case'>':m=0;b[m++]=ch;
ch=a[p++];
if(ch=='=')
{
x=24;
b[m++]=ch;
}
else
{
x=20;
p--;
}
break;
case':':m=0;b[m++]=ch;
ch=a[p++];
if(ch=='=')
{
x=18;
b[m++]=ch;
}
else
{
x=17;
p--;
}
break;
case'*':x=13;b[0]=ch;break;
case'/':x=14;b[0]=ch;break;
case'+':x=15;b[0]=ch;break;
case'-':x=16;b[0]=ch;break;
case'=':x=25;b[0]=ch;break;
case';':x=26;b[0]=ch;break;
case'(':x=27;b[0]=ch;break;
case')':x=28;b[0]=ch;break;
case'#':x=0;b[0]=ch;break;
case'\n':x=-2;break;
default: x=-1;break;
}
}
main() //主函数
{
p=0;
r=1;
printf("Please input string:\n");
do
{
scanf("%c",&ch);
a[p++]=ch;
}while(ch!='#');
p=0;
do
{
fengxi();
switch(x)
{
case 11:printf("< %d,%d >\n",x,y);break;
case -1:printf("Error in r\n!\n");break;
case -2:r=r++;break;
default:printf("< %d,%s >\n",x,b);break;
}
}while(x!=0);
}
4. 运行结果及分析
四、 实验总结
心得体会:在这次词法分析的实验中,学习了如何用文法描述词法规则。
难点问题:在实现字符串之间的比较的时候,不了解strcmp这个的用法。
解决方法:通过查阅上学期C语言的课本,查找到相关字符串比较的方法。
心得体会,实验过程的难点问题及其解决的方法。