当前位置:文档之家› 编译方法实验指导书

编译方法实验指导书


(1) 实验一 源程序的输入和扫描 实验目的: 编制一个源程序的输入过程,从键盘、文件或文本框 输入若干行语句,依次存入输入缓冲区(字符型数据)。 实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好 实验计划,编写好相应的代码 . 实验内容:编制一个扫描子程序,该子程序中每次调用能依次从存 放源程序的输入缓冲区中读出一个有效字符。 (2) 实验二 算符优先文法处理算术表达式与赋值语句 实验目的:算术表达式和赋值语句的文法是(学生可以根据需要适当 改变): S→i=E E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组 基本操作,每一基本操作用四元式表示。 实验要求:阅读课本有关章节,花一周时间确定算术表达式的文法, 设计出算符优先关系表;考虑好设计方案;设计出模块结构、测试数 据,初步编制好程序。 实验内容:编制能够根据文法及算符优先矩阵生成四元式序列的程序
{ str_test[p_test]=str[i]; i++; if(str[i-1]=='+') /*handle ++ and +=*/ { if(str[i]=='='||str[i]=='+') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i++; continue; } } if(str[i-1]=='-') /*handle – and -=*/ { if((str[i]=='='||str[i]=='-')||(str[i]=='>')) { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } } if(str[i-1]=='=') /*handle ==*/ { if(str[i]=='=') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } } if(str[i-1]=='<'||str[i-1]=='>') /*handle <= or >= or << or >> or <>*/ { if(str[i]=='='||str[i]=='<'||str[i]=='>') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } }
实验指导书 (1) 实验一 源程序的输入和扫描
实验目的: 编制一个源程序的输入过程,从键盘、文件或文本框输 入若干行语句,依次存入输入缓冲区(字符型数据)。 1、 实验内容 实验目的:建立一个词法分析器,其功能是输入一段源程序,经过 处理后,按程序顺序并以二元式输出单词符号(即程序语言的语法单 位),并且,如果该单词是关键字或符号(包括界符和运算符),则在 相应的关键字表或符号表中找出其位置;如果该单词是关键字或常数, 则直接输出。 2、 程序设计原理与方法 程序设计原理: 当词法分析器从源文件中读入一串字符放进扫描 缓冲区并经过预处理程序处理之后,分析器就从此缓冲区中逐一识别单 词符号进行处理。当缓冲区里的字符串被处理完后,又调入进行同样的 操作,这样一直处理到源程序被完全处理完为止。 在程序实现中,需要用到超前搜索以保证每个单词能被完整的读 出来。(在本程序中,为了处理方便,每次从源文件中读入一行,并且 在处理过程中,所有关键字、符号、标识符、常数都按字符串处理。 三、 示例程序 #include "stdio.h" #include "string.h" #define MAX 50 #define M 160 /*for the size of buffer*/ #define N 50 /*for key*/ main() { int i=0,j; char filename[20]; /*char ch=0;*/ char str_test[M]; int p_test=0; /*striet the existed key-table and icon-table into the memery*/ printf("\n\n\n please input the name of source file: "); scanf("%s",filename); if((fp_source=fopen(filename,"r+"))==NULL) { printf("Can not open file %s!",filename); exit(0); } while(!feof(fp_source)) /*大循环*/
{ for(i=0;i<=M;i++) str[i]=0; i=0; p=0; do /*从源文件读取一行*/ { fscanf(fp_source,"%c",&str[p]); p++; } while(str[p-1]!='\n'&&!feof(fp_source)); LINE++; str[p-1]='\n'; for(i=0;i<=M;i++) str_test[i]=0; i=0; /*清零*/ overview(str,p); /*overview the str_test*/ while(str[i]!='\n') { if(isletter(str[i])&&(i<=p)&&str[i]!='\n') { str_test[p_test]=str[i]; p_test++; i++; while((isletter(str[i])||isnumber(str[i])||str[i]=='_'|| (str[i]==':'&&str[i+1]==92))&&(i<=p)&&str[i]!='\n'&&(i<=p)) { if(str[i]==':'&&str[i+1]==92) { str_test[p_test++]=str[i++]; str_test[p_test]=str[i]; } str_test[p_test]=str[i]; i++; p_test++; } str_test[p_test]='\0'; output(str_test,findkey(str_test)); /*write into file*/ for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; } if(isnumber(str[i])) { str_test[p_test]=str[i]; p_test++; i++; while((isnumber(str[i])||isdot(str[i]))&& (i<=p)&&str[i]!='\n') { str_test[p_test]=str[i]; p_test++; i++; } if(str[i]!=''&&str[i]!='\t'&&str[i]!='\n'&&str[i]!='+'&&str[i]!=''&&str[i]!='*'&&str[i]!='/'&&str[i]!='['&&str[i]!=']'&&str[i]!='<'&&str[i]!='>'&& { i=error(str_test,i); /*exit(0);*/ } str_test[p_test]='\0'; FLAG=2; output(str_test,0); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; } if(isspace(str[i])&&(i<p)) i++; if(issymble(str[i]))
相关主题