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

上传人:无*** 文档编号:93345410 上传时间:2022-05-20 格式:DOC 页数:13 大小:136KB
收藏 版权申诉 举报 下载
河北工业大学编译原理实验报告_第1页
第1页 / 共13页
河北工业大学编译原理实验报告_第2页
第2页 / 共13页
河北工业大学编译原理实验报告_第3页
第3页 / 共13页
资源描述:

《河北工业大学编译原理实验报告》由会员分享,可在线阅读,更多相关《河北工业大学编译原理实验报告(13页珍藏版)》请在装配图网上搜索。

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

2、编码 类别码的助记符 单词值 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 实验采用的实现

3、方法和依据: 文法:E → T | E+T | E-T T → F | T*F | T/F F → i | 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

4、 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

5、 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

6、lookup //比较是否是关键字 int GetChar //每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。 int HandleError //报错函数 int EXCUTE //状态转换 int lookup //比较是否是关键字 void out//输出函数 void scanner_example //词法分

7、析 语法、语义部分函数功能说明: void REPORT_ERROR<>//报错函数 void Accept<>//语法成功接受 int INDEX//获取当前字符串对应的索引 void yuyi//语义子程序 void INPUT//语法分析程序 <2> 数据结构、各种表格、变量等的说明 Cifa.cpp中: char *KeyWordTable[MAX_KEY_NUMBER]={"begin","end", "if", "then", "else", KEY_WORD_END}; //数组指针关键字 int w,n,p,e

8、,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;/

9、/判断是否结束 int tag=0;//判断是否需要调用词法程序 四、系统工作过程及运行说明〔使用操作指南 程序使用:在工程里创建一个b.txt文件以识别算数运算表达式 五、源程序清单〔要求有详细注释和实例程序运行结果 源程序清单: Cifa.cpp 13 / 13 . #include #include #include #include #include #define DIGIT 1 #define POINT 2 #define OTHER 3 #define

10、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 ClassOthe

11、r 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;//标识单词类型

12、int ICON; double FCON; static int CurrentState=0; int result; int start=0;//指示程序的开始 int end=0;//指示程序的结束 int GetChar ; int EXCUTE ; int HandleOtherWord { return ClassOther; } int HandleError {printf <"Error!\n">; return 0;} int lookup /

13、/比较是否是关键字 { int n=0; while > /*strcmp比较两串是否相同,若相同返回0*/ { if > /*比较token所指向的关键字和保留字表中哪个关键字相符*/ { return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/ break; } n++; } return 0; /*单词不是关键

14、字,而是标识符*/ } int GetChar { char c=a; if> { d=c-'0'; //字符c与字符0的ascii码差值,返回类型为一个整数 return DIGIT;} if return POINT; if return POWER; if return PL; if return MU; return OTHER; } void report_error

15、< > { printf<"错误\n">; } void out1//输出函数 { switch { case 1:printf<"\n">;break; case 2:printf<"\n">;break; case 3:printf<"\n">;break; case 4:printf<"\n">;break; case 5:printf<"\n">;break; case 6: print

16、f<"\n",token>;break; case 8:printf<"\n",token>;break; case 9:printf<"\n",token>;break; case 10:printf<"\n",token>;break; case 11:printf<"\n",token>;break; case 12:printf<"\n",token>;break; case 13:printf<"\n",token>;break;

17、case 14:printf<"\n",token>;break; case 15:printf<"\n",token>;break; case 16:printf<"\n",token>;break; case 17:printf<"\n",token>;break; case 18:printf<"\n",token>;break; case 19:printf<"<<, >\n">;break; case 20:printf<"<>, >\n">;break; d

18、efault: report_error< >;break; } } int out { switch { 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 2

19、2:return 100;break;//判断是否是空格或换行 case 26: return 26;break;//标识符 default:return 001;report_error<>;break; } } void scanner_example //文件扫描器 { int i, c; ch=fgetc; if { scanner_example ; } else if > //判断是否是英文字母 {

20、 TOKEN[0]=ch; ch=fgetc; i=1; while > { TOKEN[i]=ch; i++; ch=fgetc ; } TOKEN[i]='\0'; fseek; /* retract*/ c=lookup ; if { //printf<"算术表达式不需要\n">; result=out<26>;

21、//标识符 } else { if { start=1; out1 ; } if { end=1; out1; } } } else if ||ch=='.'> //判断是否是数字或"." { i=0; //TOKEN[i]=ch; if> { d=ch-'0'; //字符c与字符0的as

22、cii码差值,返回类型为一个整数 EXCUTE;} if EXCUTE; if EXCUTE; if EXCUTE ; if EXCUTE; while { TOKEN[i]=ch; i++;

23、 ch=fgetc; int c=GetChar; EXCUTE; } TOKEN[i]='\0'; fseek; // printf<"\n",FCON>; result=out; } else switch //关系运算符 { case '<': ch=fgetc; ifout1; else if'>

24、out1 ; else { fseek ; printf<"算术表达式不需要\n">; // out ; } break; case '=': printf<"算术表达式不需要\n">; //out; break; case '>': ch=fgetc; if { printf<"算术表达式不需要\n">; //out

25、E," ">; } else { fseek; printf<"算术表达式不需要\n">; //out; } break; case ':':ch=fgetc; if { printf<"算术表达式不需要\n">; //out; } break; case '+':result=out; break; case '-'

26、:result=out; break; case '*':result=out; break; case '/':result=out; break; case '<':result=out;break; case '>':result=out;break; case ';':result=out;break; case EOF:break; default:report_error<>; break; } return; } int EXCUTE

27、 symbol> { switch { case 0:switch { 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; CurrentSt

28、ate=EndState; } break; case 1:switch { case DIGIT: w=w*10+d;break; //CurrentState=1 case POINT: CurrentState=2;break; case POWER: CurrentState=4;break; default: FCON=w;CurrentState=EndState; } bre

29、ak; case 2:switch { 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 { case DIGIT: n++;w=w*10+d

30、;CurrentState=2;break; default: HandleError< >;CurrentState=EndState; } break; case 4:switch { case DIGIT: p=p*10+d;CurrentState=6;break; case MU: e=-1;CurrentState=5;break; case PL: e=1;CurrentState=5;break;

31、 default: HandleError< >;CurrentState=EndState; } break; case 5:switch { case DIGIT: p=p*10+d;CurrentState=6;break; default: HandleError< >;CurrentState=EndState; } break; case 6:switch

32、 { case DIGIT: p=p*10+d;break; default: FCON=w*pow<10,e*p-n>;CurrentState=EndState; } break; } return CurrentState; } int cifa { CurrentState=0;//初始0状态 scanner_example ; return; } . Table.cpp #include

33、h> #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

34、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,

35、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},

36、 {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 //+ #

37、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

38、;//判断是否结束 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; char ch=fgetc; fseek; printf<"语法错误,第%d个字符'%C'处\n"

39、,f1,ch>; } void Accept<> { Yes=1; //printf<"语法分析成功\n">; } int INDEX//获取当前字符串对应的索引 { int i; switch { case 'E':i=8;return;break; case 'T':i=9;return;break; case 'F':i=10;return;break; default: REPORT_ERROR<>;return<0>; break; } } void Gen

40、uble i1,double i2,int t>//输出四元式 { switch { 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<"\n",i1,i2,t>; break; default:break; } } void yu

41、yi//语义子程序 { switch { case 1: { temp++;//产生临时变量, Gen; e1=temp; break; } case 2: { temp++;//产生临时变量,TEMP[temp] Gen; e1=temp; break; } case 3: { e1=t4; break; } case 4: { temp++; Ge

42、n; t4=temp; break; } case 5: { temp++; Gen; t4=temp; break; } case 6: { t4=f7; break; } case 7: { f7=e1; break; } case 8: { f7=FCON; break; } default :printf<"error\n">; break; }

43、 } void Gen2//输出四元式 { switch { 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<"\n",&i1,&i2,t>; break; def

44、ault:break; } } void fuzhi//将数组b赋值给数组a { } void yuyi2//语义子程序 { switch { case 1: { temp++;//产生临时变量 Gen2; e12[0]=temp; break; } case 2: { temp++;//产生临时变量,TEMP[temp] Gen2; e12[0]=temp;

45、 break; } case 3: { //e12=t42; strcpy; break; } case 4: { temp++; Gen2; t42[0]=temp; break; } case 5: { temp++; Gen2; t42[0]=temp; break; } case 6: { //t42=f72; strcpy

46、,f72>; break; } case 7: { //f72=e12; strcpy; break; } case 8: { //f72=TOKEN[0]; strcpy; break; } default :printf<"error\n">; break; } } void INPUT { index=a; int index2=0; if

47、 { if //报错 { REPORT_ERROR<>; } else if //移近 { i++; State[i]=Table[CURRENTSTATE][index]; CURRENTSTATE=State[i]; } else //规约 { tag=1; length=LENGTH[Table[CURRENTSTATE][index]-20]

48、; i=i-length;//指针回退 switch { 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

49、=1>//不是标识符 { yuyi;//规约调用语义子程序 } else { yuyi2;//规约调用语义子程序 } CURRENTSTATE=State[i]; i++; State[i]=Table[CURRENTSTATE][index2]; CURRENTSTATE=State[i]; } } else { Accept<>;

50、 CURRENTSTATE=0; } } void main<> { int res; State[0]=0; if<>==NULL> { printf<"file open error!\n">; exit<0>; } else { res=cifa; if//文件以begin开始 { do { res=cifa; if

51、 { fseek;//文件指针回退一个*/ do { if { res=cifa; } tag=0; if { biaoshifu=1; res=res-20; } INPUT; }while;//一个语法句子翻译完成 Yes=0;//归零 i=0;

52、 } cifa; if { end=1; printf<"没有end结束符\n">; } fseek; }while; cifa; if { printf<"end结束标识符后程序没有结束!\n">; } //文件结束 } else { printf<"缺少程序开始符!\n">; } } }

53、. 单独词法识别测试用例及结果截图: 测试一: if myid>=3e2+100 then x:=y 测试二: begin 2.9+3.0e-3 end 词法、语法、语义成语整合实例程序运行结果截图: 正确识别后的程序显示: 错误的程序显示:〔括号不匹配问题 六、 体会和讨论 经过本次的实验,我们对编译原理中的词法分析、语法分析和语义分析有了基本的认识。虽然只有简短的三个小程序,但是,只有在理解的基础上才能写出好的程序来。所以,我们觉得本次的实验重点在于理解编译的过程。由于采用的是小组作业的形式,通过组内同学的互帮互助,理解起来也轻松了很多。实验由于有了大家的辛苦和努力,才有了最后的结果。最后的遗憾是我们组的实验没有将字符和数字同时输入进行语义分析出来,如果有时间,我们会继续努力完善的。

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

相关资源

更多
正为您匹配相似的精品文档

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!