词法分析实验报告
一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词符号本身)。
三、 实验方法、步骤及结果测试
1. 源程序名:词法分析.c
可执行程序名:词法分析.exe
2. 原理分析及流程图
3. 主要程序段及其解释:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000
int j=1;
long g=0;
char nchar[Max]={""};
int k=0;
char ch=NULL;
char m[30]={""};
int sym=-1;
main()
{
char cha;
int p;
printf("请输入一串字符串:");
while((cha=getchar())!='$')
{
nchar[g]=cha;
g++;
}
do
{
p=getsym();
}while(p);
}
int getsym()
{
int i;
char a[2]={""};
char word[][15]={"begin","do","end","if","then","while"};
int wsym[6]={1,2,3,4,5,6};
int ssym[9]={25,26,27,28,0,13,14,15,16};
char b[9]={'=',';','(',')','#','+','-','*','/'};
if(j==1&&k<g)
{
ch=nchar[k];
j++;
k++;
}
while(ch==' '||ch==10||ch==9||ch==13) //判断是否为无用字符
{
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
if(ch>='a'&&ch<='z')
{
while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_')
{
a[0]=ch;
strcat(m,a);
if(k==g)
{
break;
}
ch=nchar[k];
k++;
}
for(i=0;i<12;i++)
{
if(strcmp(m,&word[i][0])==0)
break;
}
if(i<12) //判断是否为保留字
{
sym=wsym[i];
printf("保留字%s 种别码%d\n",m,wsym[i]);
}
Else //判断是否为标识符
{
sym=10;
printf("标识符%s 种别码10\n",m);
}
if(k==g)
return 0;
strcpy(m,"");
return 1;
}
else if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9') //判断是否为数字
{
a[0]=ch;
strcat(m,a);
if(k==g)
{
break;
}
ch=nchar[k];
k++;
}
sym=11;
printf("常数%s 种别码11\n",m);
if(k==g) //判断是否为运算符
return 0;
strcpy(m,"");
return 1;
}
else if(ch==':')
{
a[0]=ch;
strcat(m,a);
if(k==g)
{
sym=17;
printf("运算符%s 种别码17\n",m);
return 0;
}
ch=nchar[k];
k++;
if(ch=='=')
{
a[0]=ch;
strcat(m,a);
sym=18;
printf("运算符%s 种别码18\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
strcpy(m,"");
return 1;
}
else if(ch=='<')
{
a[0]=ch;
strcat(m,a);
if(k<g)
{
ch=nchar[k];
k++;
}
if(ch=='=')
{
a[0]=ch;
strcat(m,a);
sym=21;
printf("运算符%s 种别码21\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else if(ch=='>')
{
a[0]=ch;
strcat(m,a);
sym=22;
printf("运算符%s 种别码22\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else
{
printf("运算符%s 种别码22\n",m);
}
if(k==g)
{
return 0;
}
strcpy(m,"");
return 1;
}
else if(ch=='>')
{
a[0]=ch;
strcat(m,a);
if(k<g)
{
ch=nchar[k];
k++;
}
if(ch=='=')
{
a[0]=ch;
strcat(m,a);
sym=24;
printf("运算符%s 种别码24\n",m);
if(k==g)
{
return 0;
}
ch=nchar[k];
k++;
}
else
{
sym=23;
printf("运算符%s 种别码23\n",m);
}
if(k==g)
{
return 0;
}
strcpy(m,"");
return 1;
}
else
{
for(i=0;i<9;i++)
{
if(ch==b[i])
break;
}
if(i<9)
{
sym=ssym[i];
a[0]=ch;
strcat(m,a);
sym=ssym[i];
printf("%s 种别码为:%d\n",m,ssym[i]);
}
else
{
a[0]=ch;
strcat(m,a);
sym=-1;
printf("错误!%s不存在种别码\n",m);
}
if(k<g)
{
ch=nchar[k];
k++;
}
else
{
return 0;
}
strcpy(m,"");
return 1;
}
}
4. 运行结果及分析
四、 实验总结
通过这个实验,使我了解了编译器词法分析的过程。虽然在干开始做着个程序是是很茫然的,但是在经过一段时间的思考,有了感觉和眉目就开始左手写词法分析程序,这个也算是第二版本吧,第一个版本有个问题就是不能呢个让它在用户输入完后再执行分析,而是用户一换行就执行一段并输出结果,然后在让用户输入,这样做感觉不是很满意就对输入进行了改进,这只是一个功能简化的程序,如果以后要增加功能在这个基础上改就好了。
浙公网安备 33010602011771号