标签:
实验一、词法分析实验
商软 伍思敏 201506110249
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词符号本身)
词法分析程序的主要任务:
1.对字符串表示的源程序
2.从左到右进行扫描和分解
3.根据词法规则
4.识别出一个一个具有独立意义的单词符号
5.以供语法分析之用
三、 实验方法、步骤及结果测试
可执行程序名:词法分析.exe
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
char charp[80]; //存放所有输入的字符
char token[8]; //单词自身字符串
char ch; //单个字符
char*rwtab[6]={"begin","if","then","while","do","end"};
int sym; //sym:单词种别码
int s=0,m=0,i=0,w=0,sum=0; //sum:整型常数
void main()
{
printf("请输入一串字符串(以输入#号作为结束):");
do
{
ch=getchar(); //ch获取键盘输入的字符
charp[i++]=ch; //把字符一个个放在charp数组中
}while(ch!=‘#‘); //输入以#号键结束
do
{
analyze(); //识别单词
switch(sym)
{
case -1:
printf(" 错误 : w %d!\n",w);
break;
case -2:
w=w++;break;
case 11:
printf("(%d,%d)\n",sym,sum);
break;
default:
printf("(%d,%s)\n",sym,token);
break;
}
}while(sym!=0);
}
实现主要功能的程序段,重要的是程序的注释解释。
void analyze()
{
for(i=0;i<8;i++)
token[i]=NULL;
ch=charp[s++];
while(ch==‘ ‘)
{
ch=charp[s];
s++;
}
if((ch>=‘0‘&&ch<=‘9‘)) //分析数字
{
while((ch>=‘0‘&&ch<=‘9‘))
{
sum=sum*10+ch-‘0‘;
ch=charp[s++];
}
s--;
sym=11;
if(sum>32767)
sym=-1;
}
else if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)) //分析标识符或者变量名
{
while((ch>=‘0‘&&ch<=‘9‘)||(ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘))
{
token[m++]=ch;
ch=charp[s++];
}
token[m++]=‘\0‘;
s--;
sym=10;
for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,rwtab[i])==0)
{
sym=i+1;
break;
}
}
else switch(ch)//分析其他字符
{
case‘<‘:m=0;token[m++]=ch;
ch=charp[s++];
if(ch==‘=‘)
{
sym=21;
token[m++]=ch;
}
else if(ch==‘>‘)
{
sym=22;
token[m++]=ch;
}
else
{
sym=23;
s--;
}
break;
case‘>‘:m=0;token[m++]=ch;
ch=charp[s++];
if(ch==‘=‘)
{
sym=24;
token[m++]=ch;
}
else
{
sym=20;
s--;
}
break;
case‘:‘:m=0;token[m++]=ch;
ch=charp[s++];
if(ch==‘=‘)
{
sym=18;
token[m++]=ch;
}
else
{
sym=17;
s--;
}
break;
case‘*‘:
sym=13;token[0]=ch;
break;
case‘/‘:
sym=14;token[0]=ch;
break;
case‘+‘:
sym=15;token[0]=ch;
break;
case‘-‘:
sym=16;token[0]=ch;
break;
case‘=‘:
sym=25;token[0]=ch;
break;
case‘;‘:
sym=26;token[0]=ch;
break;
case‘(‘:
sym=27;token[0]=ch;
break;
case‘)‘:
sym=28;token[0]=ch;
break;
case‘#‘:
sym=0;token[0]=ch;
break;
case‘\n‘:
sym=-2;
break;
default:
sym=-1;
break;
}
}
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
第一次接触编译原理有很多东西都是不会和不知道,在这次作业中很多东西不知道,知道要写词法分析的作业的时候我是一脸茫然不知道怎么写才好,和怎么开始写,在网上搜了很多关于编译原理的东西和知道点,看了资料后还是不知道怎么写和词法分析是写关于什么知识方面的,但是后来慢慢接触了,了解到一些知识,慢慢知道更多,希望以后能了解更多。
标签:
原文地址:http://www.cnblogs.com/candyxue/p/5958307.html