实验一、词法分析实验
商业软件工程3班 李华秋 201506110205
一、 实验目的
编制一个词法分析程序。通过设计一个编译词法分析程序,实现对词法分析转换的理解,加深对转换过程的认识,通过这个软件把理论知识运用到实际之中。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
三、 实验方法、步骤及结果测试
- 源程序名:
- 原理分析及流程图
#include <stdio.h>
#include <string.h>char prog[80],token[8],ch;int syn,p,m,n,sum;char *key[6]={"begin","if","then","while","do","end"};//关键字scaner();
main()
{p=0;
printf("\n请输入字符窜,以‘#’字结束):\n");do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!=‘#‘);
p=0;do{
scaner();switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn);break;case -1:printf("你输入的数据有错!\n");
getch();
exit(0);default: printf("( %-10s%5d )\n",token,syn);break;
}
}while(syn!=0);
getch();
}
scaner()
{ sum=0;for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;while((ch==‘ ‘)||(ch==‘\n‘))ch=prog[p++];if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{ while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;for(n=0;n<6;n++)if(strcmp(token,key[n])==0)
{ syn=n+1;break;
}
}else if((ch>=‘0‘)&&(ch<=‘9‘))
{ while((ch>=‘0‘)&&(ch<=‘9‘))
{ sum=sum*10+ch-‘0‘;
ch=prog[p++];
}
p--;
syn=11;
}else switch(ch)
{ case ‘<‘:token[m++]=ch;
ch=prog[p++];if(ch==‘=‘)
{ syn=22;
token[m++]=ch;
}else
{ syn=20;
p--;
}break;case ‘>‘:token[m++]=ch;
ch=prog[p++];if(ch==‘=‘)
{ syn=24;
token[m++]=ch;
}else
{ syn=23;
p--;
}break;case ‘+‘: token[m++]=ch;
ch=prog[p++];if(ch==‘+‘)
{ syn=17;
token[m++]=ch;
}else
{ syn=13;
p--;
}break;case ‘-‘:token[m++]=ch;
ch=prog[p++];if(ch==‘-‘)
{ syn=29;
token[m++]=ch;
}else
{ syn=14;
p--;
}break;case ‘!‘:ch=prog[p++];if(ch==‘=‘)
{ syn=21;
token[m++]=ch;
}else
{ syn=31;
p--;
}break;case ‘=‘:token[m++]=ch;
ch=prog[p++];if(ch==‘=‘)
{ syn=25;
token[m++]=ch;
}else
{ syn=18;
p--;
}break;case ‘*‘: syn=15;
token[m++]=ch;break;case ‘/‘: syn=16;
token[m++]=ch;break;case ‘(‘: syn=27;
token[m++]=ch;break;case ‘)‘: syn=28;
token[m++]=ch;break;case ‘{‘: syn=5;
token[m++]=ch;break;case ‘}‘: syn=6;
token[m++]=ch;break;case ‘;‘: syn=26;
token[m++]=ch;break;case ‘\"‘: syn=30;
token[m++]=ch;break;case ‘#‘: syn=0;
token[m++]=ch;break;case ‘:‘:syn=17;
token[m++]=ch;break;default: syn=-1;break;
}
token[m++]=‘\0‘;
}
- 主要程序段及其解释:
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch==‘ ‘)||(ch==‘\n‘))ch=prog[p++];
if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{ while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{token[m++]=ch;
ch=prog[p++];
}
p--;
- 运行结果及分析
四、 实验总结
对词法转换过程认识不够,没能独立完成本次试验,对课本的知识还一知半解,刚接触逻辑上有些跟不上,课堂上的东西也没全掌握,很多问题都是靠查阅资料和问同学才解决。