实验一、词法分析实验
专业:商业软件工程 姓名:钟菲菲 学号:201506110191
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串;
输出:二元组(种别,单词符号本身)。
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名词法分析.c
可执行程序名:词法分析.exe
2. 原理分析及流程图
主要总体设计问题。
3. 主要程序段及其解释:
void Analyse(char a[])//词法分析的主要函数
{
int i=0,j=0,n=0,m=0,temp=0;
char b[N];//数组b存储数组a中除关键字外的其他字母
while(a[i]!='$')//对输入的单词符号进行识别判断是否为关键字或标志符,若是则输出单词本身及其词法规则和种别码
{
if(a[i]>=65&&a[i]<=122)//判断每一个单词符号是否为字母
{
j=0;
while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')
{
b[j]=a[i];
j++;
i++;
}
i--;
b[j]='\0';
for(n=0;n<6;n++)
{
if(strcmp(b,word[n])==0)
{
printf("<关键字,%d,",n+1);
while(word[n][m]!='\0')
{
printf("%c",word[n][m]);
m++;
}
printf(">\n");
temp=1;
}
}
if(temp==0)
printf("<标识符,10,%s>\n",b);
}
else
{
switch(a[i])//用switch结构实现对界符和运算符的识别和其词法规则和种别码的输出
{
case '#': printf("<0,$>\n");
case '+': printf("<运算符,13,+>\n");break;
case '-': printf("<运算符,14,->\n");break;
case '*': printf("<运算符,15,*>\n");break;
case '/': printf("<运算符,16,/>\n");break;
case ':':if(a[i+1]=='=')
{
printf("<运算符,18,:=>\n");
i++;
}
else printf("<界符,17,:>\n");
break;
case '<': if(a[i+1]=='=')
{
printf("<运算符,21,<=>\n");
i++;
}
else if(a[i+1]=='>')
{
printf("<运算符,22,<>>\n");
i++;
}
else printf("<界符,20,<>\n");
break;
case '>': if(a[i+1]=='=')
{
printf("<运算符,24,>=>\n");
i++;
}
else printf("<界符,23,>>\n");
break;
case '=': printf("<运算符,25,=>\n");break;
case ';': printf("<界符,26,;>\n");break;
case '(': printf("<界符,27,(>\n");break;
case ')': printf("<界符,28,)>\n");break;
case' ': break;
case'\n': break;
default:
if(a[i]>='0'&&a[i]<='9')
printf("<数字,%c>\n",a[i]);
else
printf("'%c'输入错误!\n",a[i]);//若输入的单词符号为其他,则输出“输入错误”
break;
}
}
i++;
}
}
4. 运行结果及分析
分析:输入关键字、运算符、界符时,输出其词法规则、单词符号本身以及其种别码,输入数字时,输出其词法规则以及数字本身。
分析:输入的abcd不能够有所输出。
分析:由于没有输入关键字,输入标识符后能够输出了。当输入空格时提示输出错误。
四、 实验总结
主要问题:若同时输入关键字和标识符,输出结果只显示关键字,只有当不输入关键字时输入标识符,才能输出标识符的单词符号。自己的程序还存在很大的不足,试着用很多想法改进了,还是没有完善。今后会再接再厉,有不懂的地方多提问。
来源:https://www.cnblogs.com/ffde/p/5954247.html