实验一 词法分析实验
专业:商业软件工程 姓名:陈冠中 学号:201506110195
一、 实验目的
词法分析程序完成的是编译第一阶段的工作。词法分析工作是把字符流的源程序变为单词序列,输出到一个中间文件,这个文件作为语法分析程序的输入而继续编译过程。而该实验就是设计一个简单的词法分析程序,通过编制一个程序来完成转换。
二、 实验内容和要求
实验要求:
1.输入:源程序字符串
2.输出:二元组(种别,单词符号本身)
实验内容:
对字符串表示的源程序
从左到右进行扫描和分解
根据词法规则,识别出一个个具有独立意义的单词符号以供语法分析之用
发现词法错误,则返回出错信息
三、 实验方法、步骤及结果测试
1.词法分析程序.c
词法分析程序.exe
2.原理分析及流程图
从录入程序字符串,调用scaner函数 ,读取字符串中的数据,通过判断空格或回车前的单元,进行词法分析,最后以二元组形式输出。
3.主要程序段及其解释:
void scaner()
{
sum=0;
for(m=0;m<8;m++)
t[m++]=NULL;
ch=c[p++];
m=0;
while((ch==' ')||(ch=='\n'))
ch=c[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
t[m++]=ch;
ch=c[p++];
}
p--;
s=10;
//这段代码是在输入一段源程序后,程序对于里面数字和英文单独判断,输出s。
t[m++]=’\0’;
//这里是程序在输入后的字符串进行确定,不进行操作会使程序出错,在输出过程中进行随意分配。
for(n=0;n<6;n++)
if(strcmp(t,w[n])==0)
{
s=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=c[p++];
}
p--;
s=11;
//在对输入的源程序判断时,输入的不在范围的程序段时,输出s
}
else switch(ch)
{
case '<':t[m++]=ch;
ch=c[p++];
if(ch=='>')
{ s=22;
t[m++]=ch;
}
else
{
s=20;
p--;
}
if(ch=='=')
{ s=21;
t[m++]=ch;
}
break;
case '>':t[m++]=ch;
ch=c[p++];
if(ch=='=')
{ s=24;
t[m++]=ch;
}
else
{ s=23;
p--;
}
break;
case '+': s=13;
t[m++]=ch;
break;
case '-':
s=14;
t[m++]=ch;
break;
case '!':ch=c[p++];
if(ch=='=')
{ s=30;
t[m++]=ch;
}
else
{ s=31;
p--;
}
break;
case '=':
s=25;
t[m++]=ch;
break;
case '*': s=15;
t[m++]=ch;
break;
case '/': s=16;
t[m++]=ch;
break;
case '(': s=27;
t[m++]=ch;
break;
case ')': s=28;
t[m++]=ch;
break;
case '{': s=5;
t[m++]=ch;
break;
case '}': s=6;
t[m++]=ch;
break;
case ';': s=26;
t[m++]=ch;
break;
case '\"': s=32;
t[m++]=ch;
break;
case '#': s=0;
t[m++]=ch;
break;
case ':':t[m++]=ch;
ch=c[p++];
if(ch=='=')
{ s=18;
t[m++]=ch;
}
else
{ s=17;
p--;
}
break;
default: s=-1;
break;
}
t[m++]='\0';
}
4.运行结果及分析
四、 实验总结
在看到词法分析这个实验时,对于词法分析的这个含义还不是很清楚,对于老师布置这个作业的意义也不清楚。在看到书上对于词法分析的讲解时,才明白词法分析是整个编译的第一阶段工作,可以说好的词法分析程序会让之后的编译工作变得更轻松。在参考了一些词法分析程序后,对于词法分析程序中的侧重点也有所了解,特别是对于一段源程序的存储与判断,最后与种别表进行相应的对比,这是简单的词法分析过程。在自己实现这个代码时,印象最深的是在对于分界符的判断时,在两个以上的一起判断时,就会出现单个分界符的错误输出,在经过一系列的错误尝试后,最后正确输出。可以说这个词法分析程序结合许多不同的方法,最终得到的简单可行的程序。