试验1:词法分析
Posted LeonQiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试验1:词法分析相关的知识,希望对你有一定的参考价值。
实验一、词法分析实验
商业软件工程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--;
- 运行结果及分析
四、 实验总结
对词法转换过程认识不够,没能独立完成本次试验,对课本的知识还一知半解,刚接触逻辑上有些跟不上,课堂上的东西也没全掌握,很多问题都是靠查阅资料和问同学才解决。
以上是关于试验1:词法分析的主要内容,如果未能解决你的问题,请参考以下文章