编译原理实验报告-词法分析器_第1页
编译原理实验报告-词法分析器_第2页
编译原理实验报告-词法分析器_第3页
编译原理实验报告-词法分析器_第4页
编译原理实验报告-词法分析器_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验(一)——词法分析器实验描述运行环境:vc++2020对某特定语言A,构造其词法规那么。该语言的单词符号包括:2状态转换图其它3程序流程:词法分析作成一个子程序,由另一个主程序挪用,每次挪用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。实验目的通过动手实践,使学生对构造编译系统的大体理论、编译程序的大体结构有更为深切的明白得和把握;使学生把握编译程序设计的大体方式和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。实验任务编制程序实现要求的功能,并能完成对测试样例程序的分析。实验原理charset[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符charsign[50][10],constant[50][10];//存储标识符和常量概念了一个Analyzer类classAnalyzer{public:Analyzer();//构造函数~Analyzer();//析构函数intIsLetter(charch);//判定是不是是字母,是那么返回1,不然返回0。intIsDigit(charch);//判定是不是为数字,是那么返回1,不然返回0。voidGetChar(char*ch);//将下一个输入字符读到ch中。voidGetBC(char*ch);//检查ch中的字符是不是为空白,假设是,那么挪用GetChar直至ch进入一个非空白字符。voidConcat(char*strTaken,char*ch);//将ch中的字符连接到strToken以后。intReserve(char*strTaken);//对strTaken中的字符串查找保留字表,假设是一个保留字返回它的数码,不然返回0。voidRetract(char*ch);//将搜索指针器回调一个字符位置,将ch置为空白字符。voidinput。;//向寄存输入结果的字符数组输入一句语句。voiddisplay();//输出一些程序终止字符显示样式intanalyzerSubFun();//词法分析器子程序,为了实现词法分析的要紧功能。代码实现//cifa.cpp:概念操纵台应用程序的入口点。//#include"stdafx.h#include"stdio.h#include"string.h"#include"iostream"usingnamespacestd;charset[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符charsign[50][10],constant[50][10];//存储标识符和常量//intWords[500][10];charch;//当前读入字符intsr,to=0;//数组str,strtaken的指针intst=0,dcount=0;intid=0;staticintline=1;inth,l;typedefstructWords/*放置二元组*/{intnum;charletters[20];}DS;DSWords[500];typedefstructwords{charword[20];inttype;}WORDS;WORDSwords[]={{"program",0},{"not”,1},{"begin”,2},{"end”,3},{"if”,4},{"then”,5},{〃var〃,6},{"else”,7},{"int”,8},{"while”,9},{"and”,10},{"do”,11},{"or”,12},{"+”,15},{"-”,16},{”(",17},{"广,18},{”,”,19},{";”,20},{”=”,21},{”<”,22},{”>”,23},{”*”,24},{”**”,25},{”>=”,26},{"<=",27},{"!=",28}};typedefstructkeytable/*放置关键字*/charname[20];intkind;}KEYTABLE;KEYTABLEkeyword[]={/*设置关键字*/{"program”,。},{"not”,1},{"begin”,2},{"end”,3},{"if”,4},{"then",5},{"var",6},{"else”,7},{"int”,8},{"while”,9},{"and”,10},{"do”,11},{"or”,12},};voidopenfile()/*打开文件*/{cout<<""<<endl;cout<<"词法分析器"<<endl;cout<<""<<endl;cout<<”为结尾的文件作为词法分析对象,输入文件名"<<endl;FILE*fp;chara,filename[10];intn=0;gets(filename);if((fp=fopen(filename,"r"))==NULL){printf("cannotopenfile.\n");//exit(0);}elsewhile(!feof(fp))/*文件不终止,那么循环*/{a=getc(fp);/*getc函数带回一个字符,赋给a*/set[n]=a;/*文件的每一个字符都放入set口数组中*/n++;}fclose(fp);/*关闭文件*/set[n-1]='\0';}voidreflesh()/*清空strtaken数组*/{to=0;/*全局变量to是strtaken的指示器*/strcpy(strtaken,"");}voidpre1()/*预处置程序*/{inti,a,b,n=0;do{if(set[n]=='/'&&set[n+1]=='*')a=n;/*记录第一个注释符的位置*/while(!(set[n]=='*'&&set[n+1]=='/')){if(set[n]=='\n')line++;n++;}b=n+1;/*记录第二个注释符的位置*/for(i=a;i<=b;i++)/**/set[i]='';/*把注释的内容换成空格,等待第二步预处置*/}elseif(set[n]=='/'&&set[n+1]=='/'){a=n;/*记录第一个注释符的位置*/while(!set[n]=='\n')n++;b=n+1;/*记录第二个注释符的位置*/for(i=a;i<=b;i++)/**/set[i]='';/*把注释的内容换成空格,等待第二步预处置*/}n++;}while(set[n]!='\0');}voidpre2()/*预处置程序*/{intj=0;sr=0;/*全局变量sr是str[]的指示器*/do{if(set[j]=='||set[j]=='\n'){while(set[j]=='||set[j]=='\n')/*扫描到有持续的空格或换行符*/{if(set[j]=='\n')line++;j++;}str[sr]='';/*用一个空格代替扫描到的持续空格和换行符放入str[]*/sr++;}else{str[sr]=set[j];/*假设当前字符不为空格或换行符就直接放入str[]*/sr++;j++;}}while(set[j]!='\0');str[sr]='\0';}charGetChar()/*把字符读入全局变量ch中,指示器sr前移*/{ch=str[sr];sr++;return(str[sr-1]);}voidGetBC()/*开始读入符号,直至第一个不为空格*/while(ch==,'){ch=GetChar();}}voidConcat()/*把ch中的字符放入strtaken[]*/{strtaken[to]=ch;to++;/*全局变量to是strtaken的指示器*/strtaken[to]='\0';}intIsLetter()/*判定是不是为字母*/{if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))return(1);elsereturn(0);}intIsDigit()/*判定是不是为数字*/{if(ch>='0'&&ch<='9')return(1);elsereturn(0);}intReserve()/*对strtaken中的字符串查找保留字表,假设是那么返回它的编码,不然返回一*/{inti,k=0;for(i=0;i<=12;i++){if(stricmp(strtaken,keyword[i].name)==0){k=1;Words[dcount].num=keyword[i].kind;strcpy(Words[dcount].letters,"-");dcount++;return(keyword[i].kind);}}if(k!=1)return(-1);}voidRetract()/*指示器sr回调一个字符位置,把ch置为空*/{sr--;ch=',;}intInsertId(){inti,k;for(i=0;i<id;i++){k=strcmp(strtaken,sign[i]);if(k==0)return(i);

strcpy(sign[id],strtaken);/*插入标识符*/Words[dcount].num=13;strcpy(Words[dcount].letters,strtaken);id++;dcount++;return(id-1);}intInsertConst(){inti,k;for(i=0;i<st;i++){k=strcmp(strtaken,constant[i]);if(k==0)return(i);}strcpy(constant[st],strtaken);/*插入常数*/Words[dcount].num=14;strcpy(Words[dcount].letters,strtaken);st++;dcount++;return(st-1);}voidanalysis(){*/reflesh();/*清空strtaken*/reflesh();/*清空strtaken数组*/pre1();/*预处置,使注释内容换成单个空格,放回set[]中*/intvalue;pre2();/*预处置,使set[]中持续的空格置换成单个空格,并把set[]的内容放到str[]中sr=0;/*把字符读入全局变量/*把字符读入全局变量ch中,指示器sr前移*/GetBC();/*读取第一个字符*/while(ch!='\0')/*当不等于终止符,继续执行*/{if(IsLetter())//标识符和关键字判定{while(IsLetter()||IsDigit())/*假设第一个是字符,继续读取,直到显现空格*/{Concat();GetChar();/*把字符读入全局变量ch中,指示器sr前移*/}Retract();/*指示器sr回调一个字符位置,把ch置为空*/value=Reserve();/*对strtaken中的字符串查找保留字表,假设是那么返回它的编码,不然返回一*/if(value==-1)/*若是返回值是一,那确实是标识符,把它输出*/{InsertId();/*插入标识符*/}reflesh();}elseif(IsDigit()){while(IsDigit())/*不然,假设第一个是数字,继续读取,直到显现空格*/{Concat();/*把ch中的字符放入strtaken[]*/GetChar();}Retract();/时指示器sr回调一个字符位置,把ch置为空*/InsertConst();/*插入常数,返回类型为int*///printf("%s”,strtaken);//getchar();reflesh();}elseswitch(ch)/*不然,假设是下面的符号*/{case,+':case,-':case'(':case,),:case',':case';':case'=,:case'<,:case,〉,:Concat();for(intc0=15;c0<=23;c0++){if(stricmp(strtaken,words[c0].word)==0){Words[dcount].num=words[c0].type;dcount++;}reflesh();break;default:if(ch==,*,)/*若是是"*"符号,继续读取下一个*/{的情形*/Concat();/*判定是不是为"**"GetChar();if(ch==strtaken[0])Concat();elseRetract();for(intc1=24;c1<=25;c1++){if(stricmp(strtaken,words[c1].word)==0){Words[dcount].num=words[c1].type;dcount++;}}//printf("%s”,strtaken);//getchar();reflesh();break;}elseif(ch=='<'||ch=='>'||ch==,!,){Concat();/*判定是不是为GetChar();if(ch==,=,)Concat();elseRetract();for(intc2=26;c2<=28;c2++){if(stricmp(strtaken,words[c2].word)==0){Words[dcount].num=words[c2].type;dcount++;}的情形*/reflesh();break;}else{h=ch/line;l=ch%line;cout<<"Errorin"<<h<<"行"<<l<<"列”<<endl;//getchar();break;}}GetChar();GetBC();}cout<<"输出二元组:"<<endl;for(intd_i=0;d_i<dcount;d_i++)cout<<Words[d_i].num<<""<<Words[d_i].letters<<endl;cout<<endl;cout<<"输出标识符:"<<endl;for(intsign_i=0;sign_i<id;sign_i++)cout<<sign_i<<""<<sign[sign_i]<<endl;cout<<endl;cout<<"输出常量:"<<endl;for(intconst_i=0;const_i<st;const_i++)cout<<const_i<<""<<constant[const_i]<<endl;cout<<endl;}int_tmain(intargc,_TCHAR*argv[]){openfile();analysi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论