当前位置:文档之家› 编译原理实验报告

编译原理实验报告

院系:计算机科学学院专业、年级: 07计科2大班课程名称:编译原理学号姓名:指导教师:2010 年11月17 日组员学号姓名实验名称实验一:词法分析实验室9205实验目的或要求通过设计一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

具体要求:输入为某语言源代码,达到以下功能:程序输入/输出示例:如源程序为C语言。

输入如下一段:main(){int a,b;a=10;b=a+20;}要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。

(2,”main”)(5,”(“)(5,”)“)(5,”{“}(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”}“)要求:识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。

其他的标识符,单词种别码为2。

常数为无符号数,单词种别码为3。

运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。

分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。

实验原理(算法流程)1.程序思路:2.定义部分:定义常量、变量、数据结构。

3.初始化:从文件将源程序输入到字符缓冲区中。

4.取单词前:去掉多余空白。

调用过程GETNB();5.提取字符组成单词,构造单词扫描过程SCAN()。

6.判断单词的种别码,调用过程LOOKUP();7.显示(导出)结果。

a)实验的具体流程图如下:程序界面(效果图)词法分析器主窗口:输入源程序:点击“分析”,显示实验结果:单击“另存为”,保存分析结果:单击“清空”,清空对话框中的内容,进行下一分析:以上就是程序执行时的窗口效果源程序代码#include<stdio.h>#include<string.h>//#include"pl0.h"#define al 10/*符号的最大长度*/#define nmax 14/*number的最大位数*/#define norw 8/*关键字个数*/char ch;/*获取字符的缓冲区,getch使用*/int cc,ll;/*cc表示当前字符(ch)的位置*/char line[81];/*读取行缓冲区*/char a[al+1];/*临时符号,多处的字节用于存放0*/char anum[nmax+1];/*临时符号,存放number*/char inum[nmax+1];/*存放常数*/char word[norw][al];/*保留字*/char fname[al];/*文件名*/char id[al+1];/*存放标识符或保留字*/int num;/*常数*/int err;//错误计数器FILE * fin;FILE * fout;FILE * fas;/*词法分析结果文件*//*函数执行出错,退出程序*/#define getchdo if(-1==getch()) return -1#define getsymdo if(-1==getsym()) return -1int getch();/*读取一行字符*/int getsym();/*读取一个分词*//*从文件fin中读取一行字符,保存到字符缓冲区line中*/int getch(){if(cc==ll){if(feof(fin))//“feof()”函数返回的是最后一次“读操作的内容”。

{printf("program incomplete");return -1;}ll=0;cc=0;ch=' ';while(ch!=10){if(EOF==fscanf(fin,"%c",&ch))//EOF是文件结束标志的文件{line[ll]=0;break;}line[ll]=ch;ll++;}}ch=line[cc];cc++;return 0;}/*读取一个分词*/int getsym(){int i,j,k;while(ch==' '||ch==10||ch==9)//忽略空格,换行和TAB{getchdo;}if(ch>='a'&&ch<='z')//判断是否为关键字或标识符{k=0;do{if(k<al){a[k]=ch;k++;}getchdo;}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');a[k]=0;if(k>al)printf("error");strcpy(id,a);i=0;j=norw-1;do{k=(i+j)/2;if(strcmp(id,word[k])<=0)//比较字符串与保留字的长度是否相等{j=k-1;}if(strcmp(id,word[k])>=0){i=k+1;}}while(i<=j);if(i-1>j){fprintf(fas,"(1,\"%s\")\n",id);/*分词为关键字*/}else {fprintf(fas,"(2,\"%s\")\n",id);/*标识符*/}}else if(ch>='0'&&ch<='9')/*判断分词是否为常数*/{k=0;num=0;do{num=10*num+ch-'0';anum[k]=ch;k++;getchdo;}while(ch>='0'&&ch<='9');fprintf(fas,"(3,\"%d\") ",num);/*常数*/anum[k]=0;if(k>nmax)/*常数位数超过规定的最大位数,报错*/{ strcpy(inum,anum);fprintf(fas,"常数%s超出范围!",inum);}fprintf(fas,"\n");}else if(ch=='+')/*运算符*/{ fprintf(fas,"(4,\"%c\")\n",ch); getchdo;}else if(ch=='-'){fprintf(fas,"(4,\"%c\")\n",ch); getchdo;}else if(ch=='*'){ fprintf(fas,"(4,\"%c\")\n",ch); getchdo;}else if(ch=='/'){fprintf(fas,"(4,\"%c\")\n",ch); getchdo;}else if(ch=='='){ fprintf(fas,"(4,\"%c\")\n",ch); getchdo;}else if(ch==',')/*界符*/{fprintf(fas,"(5,\"%c\")\n",ch); getchdo;}else if(ch==';'){fprintf(fas,"(5,\"%c\")\n",ch); getchdo;}else if(ch=='{'){fprintf(fas,"(5,\"%c\")\n",ch); getchdo;}else if(ch=='}'){fprintf(fas,"(5,\"%c\")\n",ch); getchdo;}else if(ch=='('){fprintf(fas,"(5,\"%c\")\n",ch);getchdo;}else if(ch==')'){fprintf(fas,"(5,\"%c\")\n",ch);getchdo;}else{/*其他字符*/getchdo;}return 0;}void init()/*初始化*/{/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word[0][0]),"break");//把字符串"break"赋值给关键字数组strcpy(&(word[1][0]),"continue");strcpy(&(word[2][0]),"do");strcpy(&(word[3][0]),"for");strcpy(&(word[4][0]),"if");strcpy(&(word[5][0]),"int");strcpy(&(word[6][0]),"return");strcpy(&(word[7][0]),"while");}int main(){printf("请输入源文件名:");scanf("%s",fname);fin=fopen(fname,"r");if(fin){fas=fopen("fas.txt","w");init();err=0;cc=ll=0;ch=' ';do{getsymdo;}while(!feof(fin));fclose(fas);fclose(fin);}else{printf("can't open file!");}printf("词法分析结果已保存到文件fas.txt\n"); return 0;}实验结果分析及心得体会实验结果如下:输入程序段:main(){ int a,b,c;c=a+b;c=c+20;d=(a-b)*c/a; }分析结果为:(2,"main") (5,"(") (5,")") (5,"{") (1,"int") (2,"a") (5,",") (2,"b") (5,",") (2,"c") (5,";") (2,"c") (4,"=") (2,"a") (4,"+") (2,"b") (5,";") (2,"c") (4,"=")(2,"c")(4,"+")(3,"20")(5,";")(2,"d")(4,"=")(5,"(")(2,"a")(4,"-")(2,"b")(5,")")(4,"*")(2,"c")(4,"/")(2,"a")(5,";")(5,"}")经检查发现实验结果正确。

相关主题