河北工业大学编译原理实验报告.docx
《河北工业大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学编译原理实验报告.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理实验报告组员: 韦廷廷(112455)、熊敏(112456)、马昊(113042)任课老师:吴 清一、 任务概述 本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。二、系统设计实验采用的实现方法和依据: 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENe
2、lse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示8LT=9LE=10EQ11NE12GT=13GE:=14IS+15PL-16MI*17MU/18DI实验采用的实现方法和依据:文法:E T | E+T | E-T T F | T*F | T/F F i | (E)SLR(1)分析表状态ACTIONGOTO()+-*/i#ETF0S4S51231S6S7Acc2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1R1S8S9R112
3、R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。(2)函数功能说明词法分析部分函数说明:int lookup (char *token) /比较是否是关键字 int GetC
4、har(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 IN
5、DEX(char a)/获取当前字符串对应的索引void yuyi(int n)/语义子程序void INPUT(int a)/语法分析程序(2) 数据结构、各种表格、变量等的说明Cifa.cpp中:char *KeyWordTableMAX_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 T
6、ableMAXROWMAXCOLYufa.cpp中#define NUMBER 9/表达式的个数int StateMAXState;/状态栈int CURRENTSTATE=0;/标识当前状态int LENGTHNUMBER=1,3,3,1,3,3,1,3,1;/表达式右边的长度int Yes=0;/判断是否结束int tag=0;/判断是否需要调用词法程序四、系统工作过程及运行说明(使用操作指南)程序使用:在工程里创建一个b.txt文件以识别算数运算表达式五、源程序清单(要求有详细注释)和实例程序运行结果源程序清单:Cifa.cpp#include#include#include#inclu
7、de#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#def
8、ine jin 21#define ClassOther 200#define EndState -1#define MAX_KEY_NUMBER 20 /*关键字的数量*/#define KEY_WORD_END END /*关键字结束标记*/char *KeyWordTableMAX_KEY_NUMBER=begin,end, if, then, else, KEY_WORD_END;/数组指针char TOKEN20;char ch;int w,n,p,e,d;/w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,int Class;/标识单词类型int ICON;double
9、 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(KeyWordTablen, KEY_WORD_END
10、) /*strcmp比较两串是否相同,若相同返回0*/ if (!strcmp(KeyWordTablen, 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
11、(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)
12、;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
13、; 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
14、 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,
15、c; ch=fgetc(fp);if(ch= |ch=n)scanner_example (fp); else if (isalpha (ch) /判断是否是英文字母 TOKEN0=ch; ch=fgetc(fp); i=1; while (isalnum (ch) TOKENi=ch; i+; ch=fgetc (fp); TOKENi=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
16、, ); if (c=2)end=1;out1(c, ); else if (isdigit(ch)|ch=.) /判断是否是数字或“.” i=0; /TOKENi=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(C
17、urrentState,MU); while(CurrentState!=EndState)TOKENi=ch; i+;ch=fgetc(fp);int c=GetChar(ch); EXCUTE(CurrentState,c); TOKENi=0; fseek(fp,-1,1); / printf(UCON,%g)n,FCON); result=out(UCON);else switch(ch) /关系运算符 case ) out1 (NE, ); else fseek (fp,-1,1); printf(算术表达式不需要n); / out (UCON); break; case =: pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 工业大学 编译 原理 实验 报告
限制150内