资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
编译原理实验报告组员: 韦廷廷(112455)、熊敏(112456)、马昊(113042)任课老师:吴 清一、任务概述本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析 程序,验证实际编译系统的实现方法。我们组的分工并不是词法分析、语法分析、语义分 析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法, 按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。 二、系统设计实验采用的实现方法和依据:语言中的各类单词符号及其分类码表语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示11NE12GT=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#ETF0S4S51231S6S7Acc2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1R1S8S9R112R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各.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 *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 TableMAXROWMAXCOLYufa.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#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 *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 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) /*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 (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) /判断是否是英文字母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,“ “);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=.)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号