标签:
实验一、词法分析程序实验
专业:商业软件工程 姓名:卓润峰 学号:201506110202
一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
1.输入:源程序字符串。
2.输出:二元组(种别,单词本身)
3.待分析语言的词法规则
主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c
可执行程序名:cifafenxi.exe
2. 原理分析及流程图
3. 主要程序段及其解释:
#include<stdio.h>
#include<string.h>
char one[9][10]={"begin","if","then","while","do","end","main","int","char"};
int number;
int fenxi(char a[],int p)
{
char b[10];
int i=0,j=1,q;
b[0]=a[0];
printf("\n");
if((b[0]>=‘a‘&&b[0]<=‘z‘)||(b[0]>=‘A‘&&b[0]<=‘Z‘))
{
for(j=1;j<10;j++)
{
b[j]=a[j];
if(b[j]==‘ ‘)
{
b[j]=‘\0‘;
p=j;
break;
}
}
for(j=0;j<9;j++)
if(strcmp(b,one[j])==0)
{
printf("(%d,%s)",j+1,b);
q=0;
return p;
}
else
q=1;
if(q==1)
{
printf("(10,%s)",b);
return p;
}
}
if((b[0]>=48)&&(b[0]<=57))
{
for(j=1;j<10;j++)
{
b[j]=a[j];
if(b[j]==‘ ‘)
{
b[j]=‘\0‘;
p=j;
printf("(11,%s)",b);
return p;
}
}
}
if((b[0]==‘+‘)||(b[0]==‘-‘)||(b[0]==‘*‘)||(b[0]==‘/‘)||(b[0]==‘=‘)||(b[0]==‘(‘)||(b[0]==‘)‘)||(b[0]==‘#‘))
{
b[1]=a[1];
if(b[1]==‘ ‘)
{
p=1;
b[1]=‘\0‘;
}
switch(b[0])
{
case ‘+‘:j=13;break;
case ‘-‘:j=14;break;
case ‘*‘:j=15;break;
case ‘/‘:j=16;break;
case ‘=‘:j=25;break;
case ‘;‘:j=26;break;
case ‘(‘:j=27;break;
case ‘)‘:j=28;break;
case ‘#‘:j=0;break;
}
printf("(%d,%s)",j,b);
return p;
}
if((b[0]==‘:‘)||(b[0]==‘>‘)||(b[0]==‘<‘))
{
b[1]=a[1];
if((b[1]!=‘=‘)&&(b[1]!=‘>‘)&&(b[1]!=‘<‘)&&(b[1]==‘ ‘))
{
p=1;
b[1]=‘\0‘;
switch(b[0])
{
case ‘:‘:j=17;break;
case ‘<‘:j=20;break;
case ‘>‘:j=23;break;
}
printf("(%d,%s)",j,b);
return p;
}
else
{
b[1]=a[1];
b[2]=‘\0‘;
p=2;
if((b[0]==‘:‘)&&(b[1]==‘=‘))j=18;
else if((b[0]==‘<‘)&&(b[1]==‘=‘))j=21;
else if((b[0]==‘>‘)&&(b[1]==‘=‘))j=24;
else if((b[0]==‘<‘)&&(b[1]==‘>‘))j=22;
printf("(%d,%s)",j,b);
return p;
}
}
}
void maopao(char a[],int p)
{
int i;
for(i=0;a[i]!=‘\0‘;i++)
a[i]=a[p+i+1];
}
main()
{
char a[100];
int p;
printf("请输入一段程序(空格后回车结尾):");
gets(a);
do
{
p=fenxi(a,p);
maopao(a,p);
}while(a[0]!=‘\0‘);
}
4. 运行结果及分析
四、 实验总结
这是编译原理这门课的开始程序,讲真看这门课真的跟天书一样,很多东西都是很难理解的,很抽象,像这个词法编译器,是老师讲了很久才懂得原理,很多功能还不是很完善,有许多要改进的地方,也有很多的BUG,想了很久也很难解决问题,不过最后还是完成了这个程序,学到了很多知识,也复习了大一所学的c语言许多语法。
实验问题:
1.不知道该如何判断每一个单元的词法。
2.如何不断地进行词法分析,如何结束。
解决方案:
1.定义一个新的数组,并将原字符串读到空格后赋值给这个新的数组,然后对这个新数组中存储的字符串进行判断。
2.利用循环,每判断一次,就将之前判断的单元删除,另后面的字符串浮到上面来继续进行判断,直到原字符串剩下‘\0’,退出循环。
标签:
原文地址:http://www.cnblogs.com/zzrf/p/5954298.html