首页 河北工业大学编译原理实验报告

河北工业大学编译原理实验报告

举报
开通vip

河北工业大学编译原理实验报告编译原理实验报告 组员: 韦廷廷(112455)、熊敏(112456)、马昊(113042) 任课老师:吴 清 一、 任务概述 本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。 二、系统设计 实验采用的实现方法和依据: 语言中的各类单词符号及其分类码表 单词符...

河北工业大学编译原理实验报告
编译原理实验报告 组员: 韦廷廷(112455)、熊敏(112456)、马昊(113042) 任课老师:吴 清 一、 任务概述 本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 大家一起讨论,共同商量解决的办法。 二、系统设计 实验采用的实现方法和依据: 语言中的各类单词符号及其分类码 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 单词符号 类别编码 类别码的助记符 单词值 begin 1 BEGIN   end 2 END   if 3 IF   then 4 THEN   else 5 ELSE   标识符 6 ID 字母打头的字母数字串 无符号常数 7 UCON 机内二进制表示 < 8 LT   <= 9 LE   = 10 EQ   <> 11 NE   > 12 GT   >= 13 GE   := 14 IS   + 15 PL   - 16 MI   * 17 MU   / 18 DI           实验采用的实现方法和依据: 文法:E → T | E+T | E-T  T → F | T*F | T/F  F → i | (E) SLR(1)分析表 状态 ACTION GOTO ( ) + - * / i # E T F 0 S4           S5   1 2 3 1     S6 S7       Acc       2   R3 R3 R3 S8 S9   R3       3   R6 R6 R6 R6 R6   R6       4 S4           S5   10 2 3 5   R8 R8 R8 R8 R8   R8       6 S4           S5     11 3 7 S4           S5     12 3 8 S4           S5       13 9 S4           S5       14 10   S15 S6 S7               11   R1 R1 R1 S8 S9   R1       12   R2 R2 R2 S8 S9   R2       13   R4 R4 R4 R4 R4   R4       14   R5 R5 R5 R5 R5   R5       15   R7 R7 R7 R7 R7   R7                               三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等) (1)各.h和.c文件说明 Cifa.cpp的功能:字符串扫描识别。 Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。 Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。 (2)函数功能说明 词法分析部分函数说明: int lookup (char *token)  //比较是否是关键字 int GetChar(char ch) //每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。 int HandleError (void)//报错函数 int EXCUTE (int state, int symbol)//状态转换 int lookup (char *token)  //比较是否是关键字 void out(int  a,char *token)//输出函数 void scanner_example (FILE *fp)//词法分析 语法、语义部分函数功能说明: void REPORT_ERROR()//报错函数 void Accept()//语法成功接受 int  INDEX(char a)//获取当前字符串对应的索引 void yuyi(int n)//语义子程序 void INPUT(int a)//语法分析程序 (2) 数据结构、各种表格、变量等的说明 Cifa.cpp中: char *KeyWordTable[MAX_KEY_NUMBER]={"begin","end", "if", "then", "else", KEY_WORD_END}; //数组指针关键字 int w,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记, int Class;//标识单词类型 Table.cpp #define MAXROW  16 //行数 #define MAXCOL 11 //列数 int Table[MAXROW][MAXCOL] Yufa.cpp中 #define NUMBER 9//表达式的个数 int State[MAXState];//状态栈 int CURRENTSTATE=0;//标识当前状态 int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度 int Yes=0;//判断是否结束 int tag=0;//判断是否需要调用词法程序 四、系统工作过程及运行说明(使用操作指南) 程序使用:在工程里创建一个b.txt文件以识别算数运算表达式 五、源程序清单(要求有详细注释)和实例程序运行结果 源程序清单: Cifa.cpp #include #include #include #include #include #define DIGIT 1 #define POINT 2 #define OTHER 3 #define POWER 4 # define ID 6 # define UCON 7 # define LT 8 # define LE 9 # define EQ 10 # define NE 11 # define GT 12 # define GE 13 # define IS 14 # define PL 15 //+ # define MI 16 //- # define MU 17 # define DI 18 #define zuokuohao 19 #define youkuohao 20 #define jin 21 #define ClassOther 200 #define EndState -1 #define MAX_KEY_NUMBER 20  /*关键字的数量*/ #define KEY_WORD_END "END" /*关键字结束标记*/ char *KeyWordTable[MAX_KEY_NUMBER]={"begin","end", "if", "then", "else", KEY_WORD_END}; //数组指针 char TOKEN[20]; char ch; int w,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记, int Class;//标识单词类型 int ICON; double  FCON; static int CurrentState=0; int result; int start=0;//指示程序的开始 int end=0;//指示程序的结束 int GetChar (void); int EXCUTE (int,int); int HandleOtherWord (void) { return ClassOther; } int HandleError (void) {printf ("Error!\n"); return 0;} int lookup (char *token)  //比较是否是关键字 { int n=0; while (strcmp(KeyWordTable[n], KEY_WORD_END)) /*strcmp比较两串是否相同,若相同返回0*/ { if (!strcmp(KeyWordTable[n], token)) /*比较token所指向的关键字和保留字表中哪个关键字相符*/ { return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/ break; } n++; } return 0; /*单词不是关键字,而是标识符*/ } int GetChar (char a) { char c=a; if(isdigit(c)) { d=c-'0'; //字符c与字符0的ascii码差值,返回类型为一个整数 return DIGIT;} if (c=='.') return POINT; if (c=='E'||c=='e') return POWER; if (c=='+') return PL; if (c=='-') return MU; return OTHER; } void report_error( ) { printf("错误\n"); } void out1(int  a,char *token)//输出函数 { switch (a) { case 1:printf("(BEGIN, )\n");break; case 2:printf("(END, )\n");break; case 3:printf("(IF, )\n");break; case 4:printf("(THEN, )\n");break; case 5:printf("(ELSE, )\n");break; case 6: printf("(ID,%s)\n",token);break; case 8:printf("(LT,%s)\n",token);break; case 9:printf("(LE,%s)\n",token);break; case 10:printf("(EQ,%s)\n",token);break; case 11:printf("(NE,%s)\n",token);break; case 12:printf("(GT,%s)\n",token);break; case 13:printf("(GE,%s)\n",token);break; case 14:printf("(IS,%s)\n",token);break; case 15:printf("(PL,%s)\n",token);break; case 16:printf("(MI,%s)\n",token);break; case 17:printf("(MU,%s)\n",token);break; case 18:printf("(DI,%s)\n",token);break; case 19:printf("((, )\n");break; case 20:printf("(), )\n");break; default: report_error( );break; } } int out(int a) { switch(a) { case 7:return 6;break;//常量 case 15:return 2;break;//+ case 16:return 3;break; case 17:return 4;break; case 18:return 5;break; case 19:return 0;break; case 20:return 1;break; case 21:return 7;break; case 22:return 100;break;//判断是否是空格或换行 case 26: return 26;break;//标识符 default:return 001;report_error();break; } } void scanner_example (FILE *fp)//文件扫描器 { int i, c; ch=fgetc(fp); if(ch==' '||ch=='\n') { scanner_example (fp); } else if (isalpha (ch))  //判断是否是英文字母 { TOKEN[0]=ch; ch=fgetc(fp); i=1; while (isalnum (ch)) { TOKEN[i]=ch; i++; ch=fgetc (fp); } TOKEN[i]='\0'; fseek(fp,-1,1);  /* retract*/ c=lookup (TOKEN); if (c==0) { //printf("算术表达式不需要\n"); result=out(26); //标识符 } else { if(c==1) { start=1; out1 (c," "); } if (c==2) { end=1; out1(c," "); } } } else if (isdigit(ch)||ch=='.')  //判断是否是数字或“.” { i=0; //TOKEN[i]=ch; if(isdigit(ch)) { d=ch-'0'; //字符c与字符0的ascii码差值,返回类型为一个整数 EXCUTE(CurrentState,DIGIT);} if (ch=='.')  EXCUTE(CurrentState,POINT); if (ch=='E'||ch=='e') EXCUTE(CurrentState,POWER); if (ch=='+')EXCUTE(CurrentState,PL) ; if (ch=='-') EXCUTE(CurrentState,MU); while(CurrentState!=EndState) { TOKEN[i]=ch; i++; ch=fgetc(fp); int c=GetChar(ch); EXCUTE(CurrentState,c); } TOKEN[i]='\0'; fseek(fp,-1,1); // printf("(UCON,%g)\n",FCON); result=out(UCON); } else  switch(ch) //关系运算符 { case '<': ch=fgetc(fp); if(ch=='=')out1(LE," "); else if(ch=='>') out1 (NE," "); else { fseek (fp,-1,1); printf("算术表达式不需要\n"); // out (UCON); } break; case '=': printf("算术表达式不需要\n"); //out(EQ, " "); break; case '>': ch=fgetc(fp); if(ch=='=') { printf("算术表达式不需要\n"); //out(GE," "); } else { fseek(fp,-1,1); printf("算术表达式不需要\n"); //out(GT," "); } break; case ':':ch=fgetc(fp); if(ch=='=') { printf("算术表达式不需要\n"); //out(IS," "); } break; case '+':result=out(PL); break; case '-':result=out(MI); break; case '*':result=out(MU); break; case '/':result=out(DI); break; case '(':result=out(zuokuohao);break; case ')':result=out(youkuohao);break; case ';':result=out(jin);break; case EOF:break; default:report_error(); break; } return; } int EXCUTE (int state, int symbol) { switch (state) { case 0:switch (symbol) { case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break; case POINT: w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break; default: HandleOtherWord( );Class=ClassOther; CurrentState=EndState; } break; case 1:switch (symbol) { case DIGIT: w=w*10+d;break;  //CurrentState=1 case POINT: CurrentState=2;break; case POWER: CurrentState=4;break; default: FCON=w;CurrentState=EndState; } break; case 2:switch (symbol) { case DIGIT: n++;w=w*10+d;break; case POWER: CurrentState=4;break; default: FCON=w*pow(10,e*p-n);CurrentState=EndState; } break; case 3:switch (symbol) { case DIGIT: n++;w=w*10+d;CurrentState=2;break; default: HandleError( );CurrentState=EndState; } break; case 4:switch (symbol) { case DIGIT: p=p*10+d;CurrentState=6;break; case MU: e=-1;CurrentState=5;break; case PL: e=1;CurrentState=5;break; default: HandleError( );CurrentState=EndState; } break; case 5:switch (symbol) { case DIGIT: p=p*10+d;CurrentState=6;break; default: HandleError( );CurrentState=EndState; } break; case 6:switch (symbol) { case DIGIT: p=p*10+d;break; default: FCON=w*pow(10,e*p-n);CurrentState=EndState; } break; } return CurrentState; } int cifa(FILE *fp) { CurrentState=0;//初始0状态 scanner_example (fp)    ; return(result); } Table.cpp #include #include #include #include #include #define MAXROW  16 //行数 #define MAXCOL 11 //列数 #define S1 1 #define S2 2 #define S3 3 #define S4 4 #define S5 5 #define S6 6 #define S7 7 #define S8 8 #define S9 9 #define S10 10 #define S11 11 #define S12 12 #define S13 13 #define S14 14 #define S15 15 #define R1 21 #define R2 22 #define R3 23 #define R4 24 #define R5 25 #define R6 26 #define R7 27 #define R8 28 #define acc 100 //SLR(1)分析表,21~30表示规约,1~20表示移近,0报错 int Table[MAXROW][MAXCOL]= {{S4,0,0,0,0,0,S5,0,S1,S2,S3}, {0,0,S6,S7,0,0,0,acc,0,0,0}, {0,23,23,23,8,9,0,23,0,0,0}, {0,26,26,26,26,26,0,26,0,0,0}, {4,0,0,0,0,0,5,0,10,2,3}, {0,28,28,28,28,28,0,28,0,0,0}, {4,0,0,0,0,0,5,0,0,11,3}, {4,0,0,0,0,0,5,0,0,12,3}, {4,0,0,0,0,0,5,0,0,0,13}, {4,0,0,0,0,0,5,0,0,0,14}, {0,15,6,7,0,0,0,0,0,0,0}, {0,21,21,21,8,9,0,21,0,0,0}, {0,22,22,22,8,9,0,22,0,0,0}, {0,24,24,24,24,24,0,24,0,0,0}, {0,25,25,25,25,25,0,25,0,0,0}, {0,27,27,27,27,27,0,27,0,0,0}}; Yufa.cpp #include #include #include #include #include #include"cifa.cpp" #include"table.cpp" # define PL 15 //+ # define MI 16 //- # define MU 17 # define DI 18 #define acc 100 #define MAXState 20 #define NUMBER 9//表达式的个数 #define MAXTEMP 10//最多临时变量的个数 int State[MAXState];//状态栈 int i=0; int CURRENTSTATE=0;//标识当前状态 int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度 int length; int index;//索引 int Yes=0;//判断是否结束 int tag=0;//判断是否需要调用词法程序 //extern char * cifa(); double e1,t4,f7;//整形 char e12[20],t42[20],f72[20];//字符型 int TEMP[MAXTEMP]; int temp=0; int biaoshifu=0; FILE * fp; void REPORT_ERROR() { Yes=1; long f1=ftell(fp); char ch=fgetc(fp); fseek(fp,-1,1); printf("语法错误,第%d个字符'%C'处\n",f1,ch); } void Accept() { Yes=1; //printf("语法分析成功\n"); } int  INDEX(char a)//获取当前字符串对应的索引 { int i; switch (a) { case 'E':i=8;return(i);break; case 'T':i=9;return(i);break; case 'F':i=10;return(i);break; default: REPORT_ERROR();return(0); break; } } void Gen(int a,double i1,double i2,int t)//输出四元式 { switch(a) { case PL:printf("(+,%g,%g,%d)\n",i1,i2,t); break; case MI:printf("(-,%g,%g,%d)\n",i1,i2,t); break; case MU:printf("(*,%g,%g,%d)\n",i1,i2,t); break; case DI:printf("(/,%g,%g,%d)\n",i1,i2,t); break; default:break;    } } void yuyi(int n)//语义子程序 { switch(n) { case 1: { temp++;//产生临时变量, Gen(PL,e1,t4,temp); e1=temp; break; } case 2: { temp++;//产生临时变量,TEMP[temp] Gen(MI,e1,t4,temp); e1=temp; break; } case 3: { e1=t4; break; } case 4: { temp++; Gen(MU,t4,f7,temp); t4=temp; break; } case 5: { temp++; Gen(DI,t4,f7,temp); t4=temp; break; } case 6: { t4=f7; break; } case 7: { f7=e1; break; } case 8: { f7=FCON; break; } default :printf("error\n"); break; }    } void Gen2(int a,char *i1,char *i2,int t)//输出四元式 { switch(a) { case PL:printf("(+,%s,%s,%d)\n",&i1,&i2,t); break; case MI:printf("(-,%s,%s,%d)\n",&i1,&i2,t); break; case MU:printf("(*,%s,%s,%d)\n",&i1,&i2,t); break; case DI:printf("(/,%s,%s,%d)\n",&i1,&i2,t); break; default:break;    } } void  fuzhi(char *a,char *b)//将数组b赋值给数组a { } void yuyi2(int n)//语义子程序 { switch(n) { case 1: { temp++;//产生临时变量 Gen2(PL,e12,t42,temp); e12[0]=temp; break; } case 2: { temp++;//产生临时变量,TEMP[temp] Gen2(MI,e12,t42,temp); e12[0]=temp; break; } case 3: { //e12=t42; strcpy(e12,t42); break; } case 4: { temp++; Gen2(MU,t42,f72,temp); t42[0]=temp; break; } case 5: { temp++; Gen2(DI,t42,f72,temp); t42[0]=temp; break; } case 6: { //t42=f72; strcpy(t42,f72); break; } case 7: { //f72=e12; strcpy(f72,e12); break; } case 8: { //f72=TOKEN[0]; strcpy(f72,TOKEN); break; } default :printf("error\n"); break; }    } void INPUT(int a) { index=a; int index2=0; if(Table[CURRENTSTATE][index]!=acc) { if (Table[CURRENTSTATE][index]==0)//报错 { REPORT_ERROR(); } else if (Table[CURRENTSTATE][index]<20)//移近 {    i++; State[i]=Table[CURRENTSTATE][index]; CURRENTSTATE=State[i]; } else //规约 {    tag=1; length=LENGTH[Table[CURRENTSTATE][index]-20]; i=i-length;//指针回退 switch(Table[CURRENTSTATE][index]-20) { case 1: case 2: case 3:index2=8;break; case 4: case 5: case 6:index2=9;break; case 7: case 8:index2=10;break; default :REPORT_ERROR(); break; } if (biaoshifu!=1)//不是标识符 { yuyi(Table[CURRENTSTATE][index]-20);//规约调用语义子程序 } else { yuyi2(Table[CURRENTSTATE][index]-20);//规约调用语义子程序 } CURRENTSTATE=State[i]; i++; State[i]=Table[CURRENTSTATE][index2]; CURRENTSTATE=State[i];
本文档为【河北工业大学编译原理实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_083599
暂无简介~
格式:doc
大小:142KB
软件:Word
页数:42
分类:互联网
上传时间:2018-12-05
浏览量:85