《2022年词法分析编译原理课程实验 .pdf》由会员分享,可在线阅读,更多相关《2022年词法分析编译原理课程实验 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编译原理课程实验实验一:词法分析1、实验目的:设计、编制并调试一个词法分析程序,加深对词法分析程序的理解。2、实验要求:(1)能识别关键字、运算符号、界符、标识符、数字(无符号整数、实数(4 分) 、科学计数法表示的数( 5 分) )(2)要求建立一张关键字和种别码表(3)源程序从键盘输入(4 分) 、源程序以文件的形式输入(5 分)typedefstruct node char name20; int data; struct node *next; *linklist,lnode; struct key char name20; int number; kword=int,1,float,
2、2,if,3,switch,4,while,5, do ,6,main ,7,double,8,char ,9,else ,12,for,18 , case ,19,+ ,13,- ,14,* ,15,/ ,16,= ,17, ,20, ,24,= ,25, ,31, ,32, ; ,26,( ,27,) ,28,? ,29,: ,30;/* 定义一个静态表 */ #include #include #include int main() FILE *fp,*fp1; char string81; linklist H, p,r; char a20; char ch; char str=#n
3、; int i,j=0,k=0,f=0,n=0,t=0; H=(linklist)malloc(sizeof (lnode); H-next=NULL; r=H; if (fp=fopen(test.txt, r )=NULL) printf( 不能打开文件 n ); return 0; while (fgets(string,81,fp)!=NULL)/* 读取一行字符存入string中*/ if (!strcmp(string,str)/* 判断 string中是否是 #n*/ p=(linklist)malloc(sizeof (lnode); strcpy(p-name,str); p
4、-data=100; r-next=p; r=p; printf(nn 编译下一段程序nn ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - continue ; else i=0;n+; ch=stringi; while (ch= |ch= t|ch= n) /* 滤去空格 */ i+; ch=stringi; while (stringi!=0&stringi!=n) /* 进行字符匹配 */ p=(linklist)
5、malloc(sizeof (lnode); if (ch= a &ch=z ) /* 对于以字符开头的匹配操作*/ aj=ch; j+;i+; ch=stringi; t=0; /* 标志量 */ while (ch!= + &ch!=-&ch!=*&ch!=/&ch!=;&ch!=(&ch!=)& ch!= ? &ch!=:&ch!=&ch!=&ch!= &ch!= &ch!=!&ch!= ) if (ch z )&(ch 9 ) t=1;/* 为非法标识符的t 置*/ aj+=ch; i+; ch=stringi; aj= 0; if (t=1) /*t 为判断为非法字符*/ print
6、f(第%d 行%s 编译出错 n ,n,a); j=0; else strcpy(p-name,a); j=0;k=0; while (kname,kwordk.name)!=0)/* 查找静态表 */ k=k+1; if (k=31) /* 没找到,为用户定义的标识符*/ p-data=10; elsep-data=kwordk.number;printf(%d,%s)n,p-data,p-name); r-next=p; r=p; elseif (ch= 0 &ch= 0 &ch= a &ch= a &chname,a); j=0; p-data=11; /* 整型常量 */ printf
7、(%d,%s)n,p-data,p-name); r-next=p; r=p; elseif (ch= !|ch= |ch= =|ch= name,a); j=0;k=0; while (kname,kwordk.name)!=0) k=k+1; p-data=kwordk.number;printf(%d,%s)n ,p-data,p-name); r-next=p; r=p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - -
8、elseif (ch= + |ch= -|ch= *|ch= /|ch= ;|ch= (|ch= )|ch= ? |ch= :|ch= |ch=) aj=ch; aj+1=0; strcpy(p-name,a); j=0;i+; ch=stringi;k=0; while (kname,kwordk.name)!=0) k=k+1; p-data=kwordk.number;printf(%d,%s)n,p-data,p-name); r-next=p; r=p; elseif (ch= ) i+; ch=stringi; else printf(第%d 行%c 不能编译,跳过n ,n,ch)
9、; i+; ch=stringi; r-next=NULL; fclose(fp); if (fp1=fopen(result.txt, w)=NULL) printf( 不能打开文件 n ); exit(0); if (fp=fopen(test.txt, r )=NULL) printf( 不能打开文件 n ); return 0; fprintf(fp1,单词的种别码单词自身符号串 n ); p=H-next; j=1;/* 设定一个标志量 */ while (fgets(string,81,fp)!=NULL|j) if (feof(fp)/* 判断文件 test 是否结束,是则j 值
10、为零 */ j=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - if (!strcmp(string,str)|feof(fp)/* 把分析的结果写入文件result*/ fprintf(fp1,/nn); while (p!=NULL&p-data!=100) switch (p-data) case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: c
11、ase 9: case 12: case 18: case 19:fprintf(fp1,( 保留字-%d,%s)n,p-data,p-name);break; case 11:fprintf(fp1,( 整型数 -%d,%s)n ,p-data,p-name);break ; case 13:fprintf(fp1,( 加号 -%d,%s)n ,p-data,p-name);break ; case 14:fprintf(fp1,( 减号 -%d,%s)n ,p-data,p-name);break ; case 15:fprintf(fp1,( 乘号 -%d,%s)n ,p-data,p-
12、name);break ; case 16:fprintf(fp1,( 除号 -%d,%s)n ,p-data,p-name);break ; case 17:fprintf(fp1,( 赋值号 -%d,%s)n ,p-data,p-name);break ; case 20:fprintf(fp1,( 小于号 -%d,%s)n ,p-data,p-name);break ; case 21:fprintf(fp1,( 小于等于 -%d,%s)n ,p-data,p-name);break ; case 22:fprintf(fp1,( 等号 -%d,%s)n ,p-data,p-name);
13、break ; case 23:fprintf(fp1,( 不等于 -%d,%s)n ,p-data,p-name);break ; case 24:fprintf(fp1,( 大于号 -%d,%s)n ,p-data,p-name);break ; case 25:fprintf(fp1,( 大于等于 -%d,%s)n ,p-data,p-name);break ; case 26:fprintf(fp1,( 分号 -%d,%s)n,p-data,p-name);break ; case 27:fprintf(fp1,( 右括弧 -%d,%s)n ,p-data,p-name);break
14、; case 28:fprintf(fp1,( 左括弧 -%d,%s)n ,p-data,p-name);break ; case 29:fprintf(fp1,( 问号 -%d,%s)n ,p-data,p-name);break ; case 30:fprintf(fp1,( 冒号 -%d,%s)n ,p-data,p-name);break ; case 31:fprintf(fp1,( 左花括号 -%d,%s)n ,p-data,p-name);break ; case 32:fprintf(fp1,( 右花括号 -%d,%s)n ,p-data,p-name);break ; cas
15、e 10:fprintf(fp1,( 标识符 -%d,%s)n ,p-data,p-name);break ; default: break ; p=p-next; if (!strcmp(string,str)/* 如果遇到 #n则指向下一个节点*/ p=p-next; fprintf(fp1,/nn); else fprintf(fp1,%s,string);/* 把源程序写入 result文件中 */ fclose(fp);/* 关闭文件 test*/ fclose(fp1);/* 关闭文件 result*/ p=H; while (p) /* 释放链表的结点*/ r=p; p=p-next; free(r); H=NULL; return 1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -