当前位置: 首页 > >

编译方法实验指导书

发布时间:

《编译原理》实验课程教学大纲
1.实验课程名称: 《编译原理实验》 2.实验课程名称(英文) Compiling Method : 3.课程代码:130016 4.实验课程性质:非独立设课 5.学 时:8 6.学 分:3 7.适用专业:计算机科学与技术 8.先修或同修课程:离散数学,数据结构,高级语言程序设计等 9.开课单位:信息与计算机工程学院 10.制定实验教学大纲的依据: 东北林业大学《编译方法》教学大纲。 11.本实验课在培养实验能力中的地位及作用 通过本实验课程培养学生以下几方面的能力: 加深学生对编译方法所涉及的概念、算法、理论的理解; 体验编译方法所涉及的抽象思维的具体实现; 激励学生在编译方法设计方面的创新精神; 培养正规系统程序设计的能力; 12.应达到的实验能力标准 本课程的实验主要培养学生的抽象思维能力和正规的程序设计能力,加强对编译方法 基本原理、基本概念的理解,使学生初步具备将算法或理论转化为正确程序的能力。 13.实验内容

(1) 实验一 源程序的输入和扫描 实验目的: 编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句, 依次存入输入缓冲区(字符型数据) 。 实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好 相应的代码 . 实验内容:编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓 冲区中读出一个有效字符。 (2) 实验二 算符优先文法处理算术表达式与赋值语句 实验目的:算术表达式和赋值语句的文法是(学生可以根据需要适当改变) : S→i=E E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组基本操作,每一 基本操作用四元式表示。 实验要求:阅读课本有关章节,花一周时间确定算术表达式的文法,设计出算符优先 关系表;考虑好设计方案;设计出模块结构、测试数据,初步编制好程序。 实验内容:编制能够根据文法及算符优先矩阵生成四元式序列的程序

实验指导书 (1) 实验一 源程序的输入和扫描

实验目的: 编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依 次存入输入缓冲区(字符型数据) 。 一、 实验内容 实验目的:建立一个词法分析器,其功能是输入一段源程序,经过处理后,按程序顺 序并以二元式输出单词符号(即程序语言的语法单位) ,并且,如果该单词是关键字或符 号(包括界符和运算符) ,则在相应的关键字表或符号表中找出其位置;如果该单词是关 键字或常数,则直接输出。 二、 程序设计原理与方法 程序设计原理: 当词法分析器从源文件中读入一串字符放进扫描缓冲区并经过预处 理程序处理之后,分析器就从此缓冲区中逐一识别单词符号进行处理。当缓冲区里的字符 串被处理完后,又调入进行同样的操作,这样一直处理到源程序被完全处理完为止。 在程序实现中, 需要用到超前搜索以保证每个单词能被完整的读出来。 (在本程序中, 为了处理方便,每次从源文件中读入一行,并且在处理过程中,所有关键字、符号、标识 符、常数都按字符串处理。 三、 示例程序 #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; /*string for test*/ prepare(); /*get 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]!='>'&&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])) { 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)); 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]=='<'||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; } } 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)); 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)); 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]=='|') { if(str[i]=='|')

}

/*handle ||*/ { 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; }

} else { str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); p_test=0; } } } } fclose(fp_source); getchar(); getchar(); }

四、总结
在上述程序中,主要是实现了把源文件的关键字、标识符、常数、符号分离开的功能。 并附带了简单的错误处理过程,能判断非法表达式。 程序现在还存在的不足之处: 1、能处理的注释必须在一行以内。 2、由于很多内容都是在调试程序时加上去的,因此程序结构显得比较乱。这是因为 刚开始构想 时不够周到而引起的。这在以后的编程过程中必须注意。

(2)

实验二

算符优先文法处理算术表达式与赋值语句

实验目的:算术表达式和赋值语句的文法是(学生可以根据需要适当改变) : S→i=E E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组基本操作,每一 基本操作用四元式表示。

实验内容:编制能够根据文法及算符优先矩阵生成四元式序列的程序
#include "stdio.h" #include "conio.h" #include "string.h" #include "ctype.h" #define MAX 20 static int order[MAX][MAX]; static int matrix[MAX*2][MAX*2]; static int f[MAX],g[MAX]; static int flag[MAX]; char symbol[MAX]; FILE *fp; int num_point; /**/ int num_symbol; /* the number of total symbols */ void searchgraph(int current); void prepare(); int count(int no); void result(); void error(); void compute(); main(){ int choice=0; printf("\n\n\n1. correct table scanf("%d",&choice); if(choice==1) { if((fp=fopen("a:\\算符优先文法\table1.txt","r"))==NULL) { printf("Can not open file a:\\table1.txt"); /*clear screen*/ printf("\nPress any key for leaving!\n"); getchar(); return 0; } clrscr(); compute(); getchar(); } else if(choice==2) { if((fp=fopen("a:\\算符优先文法\table2.txt","r"))==NULL) { printf("Can not open file a:\\table2.txt"); /*clear screen*/ getchar(); printf("\nPress any key for leaving!\n"); return 0; } clrscr(); compute(); getchar(); } 2. inncorrect table\n"); printf("\nPlease input your choice==========> "); /*get the result*/ /*output the result*/ /*convert and output the symbol table from file*/ /*record the text file*/ /*record the matrix of graph*/ /*record the results*/ /*record if a point is passed*/ /*record the symbols of the table*/

} void searchgraph(int current) { int i=0; num_point++; searchgraph(i); } } void prepare() { int i=0,j=0; printf("======= ==========================================================\n The symbol table:\n==========================================="); fscanf(fp,"%d\n",&num_symbol); printf("\n\t"); for(i=0;i<num_symbol;i++) { fscanf(fp,"%c",&symbol[i]); printf("%c",symbol[i]); } printf("\n"); for(i=0;i<num_symbol;i++) { printf("%c\t",symbol[i]); for(j=0;j<num_symbol;j++) { fscanf(fp,"%d",&order[i][j]); switch(order[i][j]) { case 1 : case -1: case 0 : default: } if(j!=num_symbol-1) } } } int count(int no) { int i=0; for(i=0;i<num_symbol*2;i++) flag[i]=0; searchgraph(no); } void result() { int i=0; printf("\n====================================================================\n The the result of the function:\n==================== ====================="); printf("\n\t"); /*output the result*/ return(num_point); num_point=0; printf("\n"); printf("\t"); /*another line*/ printf(">"); printf("<"); printf("="); break; break; break; break; fgetc(fp); if(i!=num_symbol-1) printf("\t"); flag[current]=1; { if(matrix[current][i]==1&&flag[i]==0) for(i=0;i<num_symbol*2;i++)

for(i=0;i<num_symbol;i++) { printf("%c",symbol[i]); if(i!=num_symbol-1)printf("\t"); printf("\nf\t"); for(i=0;i<num_symbol;i++) { printf("%d",f[i]); if(i!=num_symbol-1)printf("\t"); } printf("\ng\t"); for(i=0;i<num_symbol;i++) { printf("%d",g[i]); if(i!=num_symbol-1)printf("\t");} } void error() { int i=0,j=0; { int ERROR=0; for(i=0;i<num_symbol;i++) for(j=0;j<num_symbol;j++) if((order[i][j]==0&&f[i]==g[j])||(order[i][j]==1&&f[i]>g[j]) ||(order[i][j]==-1&&f[i]<g[j])||(order[i][j]==100)); else { if(ERROR) break; } if(ERROR) printf("\n\nERROR! Please check your symbol table!\n"); else result(); } void compute() { int i=0,j=0; prepare(); /* clear */ /* turn to a graph */ matrix[i][j]=0; for(i=0;i<num_symbol*2;i++) for(j=0;j<num_symbol*2;j++) for(i=0;i<num_symbol;i++) for(j=0;j<num_symbol;j++) { if(order[i][j]==1) matrix[i][num_symbol+j]=1; { matrix[i][num_symbol+j]=1; matrix[num_symbol+j][i]=1; else if(order[i][j]==-1) } for(i=0;i<num_symbol;i++) { g[i]=count(num_symbol+i); } error(); /* detect if the table can get a result*/ } f[i]=count(i); /* get result */ } /* < */ matrix[num_symbol+j][i]=1; /* > */ /* = */ else if(order[i][j]==0) ERROR=1; break;} printf("\n"); }




友情链接: