实验一、词法分析系统实验
专业 商业软件工程2班 姓名 朱晓城 学号 201506110143
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
1. 输入:源程序字符串
2. 输出:二元组(种别,但此本身)
3. 待分析语言的语法规则
三、 实验方法、步骤及结果测试
1. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
2. 主要程序段及其解释:
for(n=0;n<100;n++)
{token[n]='\0';}
n=0;
ch=sum[a++];//全局变量p=0
while(ch==' '){ch=sum[a++];}//有空格就继续(判断标识符前是否存在空格)
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
do{
token[n++]=ch;
ch=sum[a++];
}while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
zbm=21;
for(n=0;n<18;n++)
{
if(strcmp(token,keyword[n])==0)//判断输入的英文是否与原定义的特殊单词相符 {
zbm=n+1;
}
}
a--;
}
else if(ch>='0'&&ch<='9')
{
a--;
do
{
token[n++]=sum[a++];
ch=sum[a];
}while(ch>='0'&&ch<='9');
zbm=22;
return;
}
else
{
switch(ch)
{
case '+':zbm=24;token[0]=ch;break;
case '-':zbm=25;token[0]=ch;break;
case '*':zbm=26;token[0]=ch;break;
case '/':zbm=27;token[0]=ch;break;
case ':':zbm=28;token[0]=ch;
ch=sum[a++];
if(ch=='='){token[1]=ch;zbm++;}
else a--;
break;
case '<':zbm=30;token[0]=ch;
ch=sum[a++];
if(ch=='='){token[1]=ch;zbm++;}
else if(ch=='>'){token[1]=ch;zbm=zbm+2;}
else a--;
break;
case '>':zbm=33;token[0]=ch;
ch=sum[a++];
if(ch=='='){token[1]=ch;zbm++;}
else a--;
break;
case '=':zbm=35;token[0]=ch;break;
case ';':zbm=36;token[0]=ch;break;
case '(':zbm=37;token[0]=ch;break;
case ')':zbm=38;token[0]=ch;break;
case '{':zbm=39;token[0]=ch;break;
case '}':zbm=40;token[0]=ch;break;
case '!':zbm=41;token[0]=ch;break;
case '@':zbm=42;token[0]=ch;break;
case '$':zbm=43;token[0]=ch;break;
case '%':zbm=44;token[0]=ch;break;
case '^':zbm=45;token[0]=ch;break;
case '&':zbm=46;token[0]=ch;break;
case '#':zbm=0;token[0]=ch;break;
default: printf("输入有误\n");zbm=-1;break;
}
}
该段程序,主要是根据输入的句子进行分析,从而进行分类,赋予各自的种别码。
3.运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
因为在中间有录入到回车键,而源程序没有给换行进行分类,因此自动分为输入有误的一类。
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
第一次遇到这种一来就做这么大个程序,开始的时候一脸懵逼,从网站上看各种的分析,例子,还是不懂,虽说也有一个很模糊的思路,但是这种一开始就让我自己做出来的真的很难。而且刚教的分而治之的办法我确实没有别人想的那么仔细。基本只能靠在其他同学的程序跟网上的例子中找合适的,然后仿照着来做。
说真的,我其实根本就搞不懂这一门学科学的是什么。上课的时候也是一头雾水,根本听不懂,原因主要还是在我自己本身就上课不认真,下课不复习预习吧。现在时间还在,只能靠自己慢慢赶上来了。