您好,欢迎访问三七文档
1[标准实验报告]南昌航空大学实验报告二00七年三月三日课程名称:编译原理实验名称:词法分析班级:040611-13姓名:毛红梅同组人:指导教师评定:签名:一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。这里以开始定义的c语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。二、实验要求程序能够从左到右一个字符一个字符地读入源程序,并对构成的源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。并给出单词的值和属性。三、实验步骤下面简要分析一下词法分析程序的运行流程:主函数main():打开要分析的C源程序,若不能正确打开,则报错。先从源程序中读入一个字符ch,然后进行如下处理:1、ch是字符:转入关键字和标识符处理子函数;2、ch是数字:转入数字处理函数;3、ch是其他字符:转入其他字符处理子函数;结束。关键字和标识符处理子函数alphaprocess(charbuffer);1、将buffer送入临时数组alphatp[0],再读入一个字符至buffer;2、判断buffer是否为字符或数字,若是,则alphatp[1]=buffer;3、重复1,2,直到2判断为假;在alphatp末尾添加'\0';4、调用search()子函数,在关键字表中匹配alphatp,若匹配成功,2则返回序号;5、调用search,在标识符表中匹配alphatp,若匹配成功,则返回序号;6、在标识符表中添加alphatp,并返回序号;四、参考源代码skh.c程序#includestdio.hmain(){printf(“thisismyfirsttestturborc”);}#includestdio.h#includectype.h#includealloc.h#includestdlib.h#includestring.h#defineNULL0FILE*fp;charcbuffer;char*key[8]={DO,BEGIN,ELSE,END,IF,THEN,VAR,WHILE};char*border[6]={,,;,:=,.,(,)};char*arithmetic[4]={+,-,*,/};char*relation[6]={,=,=,,=,};char*consts[20];char*label[20];intconstnum=0,labelnum=0;intsearch(charsearchchar[],intwordtype){inti=0;switch(wordtype){case1:for(i=0;i=7;i++){if(strcmp(key[i],searchchar)==0)return(i+1);};case2:{for(i=0;i=5;i++){if(strcmp(border[i],searchchar)==0)3return(i+1);};return(0);}case3:{for(i=0;i=3;i++){if(strcmp(arithmetic[i],searchchar)==0){return(i+1);};};return(0);};case4:{for(i=0;i=5;i++){if(strcmp(relation[i],searchchar)==0){return(i+1);};};return(0);};case5:{for(i=0;i=constnum;i++){if(strcmp(consts[i],searchchar)==0){return(i+1);};}consts[i-1]=(char*)malloc(sizeof(searchchar));strcpy(consts[i-1],searchchar);constnum++;return(i);};case6:{for(i=0;i=labelnum;i++){if(strcmp(label[i],searchchar)==0){4return(i+1);};}label[i-1]=(char*)malloc(sizeof(searchchar));strcpy(label[i-1],searchchar);labelnum++;return(i);};}}charalphaprocess(charbuffer){intatype;inti=-1;charalphatp[20];while((isalpha(buffer))||(isdigit(buffer))){alphatp[++i]=buffer;buffer=fgetc(fp);};alphatp[i+1]='\0';if(atype=search(alphatp,1))printf(%s(1,%d)\n,alphatp,atype-1);else{atype=search(alphatp,6);printf(%s(6,%d)\n,alphatp,atype-1);};return(buffer);}chardigitprocess(charbuffer){inti=-1;chardigittp[20];intdtype;while((isdigit(buffer))){digittp[++i]=buffer;5buffer=fgetc(fp);}digittp[i+1]='\0';dtype=search(digittp,5);printf(%s(5,%d)\n,digittp,dtype-1);return(buffer);}charotherprocess(charbuffer){inti=-1;charothertp[20];intotype,otypetp;othertp[0]=buffer;othertp[1]='\0';if(otype=search(othertp,3)){printf(%s(3,%d)\n,othertp,otype-1);buffer=fgetc(fp);gotoout;};if(otype=search(othertp,4)){buffer=fgetc(fp);othertp[1]=buffer;othertp[2]='\0';if(otypetp=search(othertp,4)){printf(%s(4,%d)\n,othertp,otypetp-1);gotoout;}elseothertp[1]='\0';printf(%s(4,%d)\n,othertp,otype-1);gotoout;};if(buffer==':'){buffer=fgetc(fp);6if(buffer=='=')printf(:=(2,2)\n);buffer=fgetc(fp);gotoout;}else{if(otype=search(othertp,2)){printf(%s(2,%d)\n,othertp,otype-1);buffer=fgetc(fp);gotoout;}};if((buffer!='\n')&&(buffer!=''))printf(%cerror,notaword\n,buffer);buffer=fgetc(fp);out:return(buffer);}voidmain(){inti;for(i=0;i=20;i++){label[i]=NULL;consts[i]=NULL;};if((fp=fopen(skh.c,r))==NULL)printf(error);else{cbuffer=fgetc(fp);while(cbuffer!=EOF){if(isalpha(cbuffer))cbuffer=alphaprocess(cbuffer);elseif(isdigit(cbuffer))7cbuffer=digitprocess(cbuffer);elsecbuffer=otherprocess(cbuffer);};printf(over\n);};}五、实验结果#error,notawordinclude(6,0)(4.0)stdio(6,1).(2,3)h(6,2)(4,3)main(6,3)((2,4))(2,5){errornotawordprintf(6,5)((2,4)“errornotawordthis(6,6)is(6,7)my(6,8)first(6,9)lesson(6,10)test(6,11)turbor(6,12)c(6,13)“errornotaword)(2,5);(2,1)}notawordover实验体会通过该实验,本人学会了编译程序中的第一阶段所要完成的任务,从实8验中更加深刻的体会词法分析的工作原理和实现过程,以及每个阶段的数据结构及存储结构。
本文标题:编译原理实验报告
链接地址:https://www.777doc.com/doc-7187860 .html