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

上传人:lizhe****0001 文档编号:45877000 上传时间:2018-06-19 格式:DOCX 页数:15 大小:131.62KB
返回 下载 相关 举报
河北工业大学编译原理实验报告_第1页
第1页 / 共15页
河北工业大学编译原理实验报告_第2页
第2页 / 共15页
河北工业大学编译原理实验报告_第3页
第3页 / 共15页
河北工业大学编译原理实验报告_第4页
第4页 / 共15页
河北工业大学编译原理实验报告_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《河北工业大学编译原理实验报告》由会员分享,可在线阅读,更多相关《河北工业大学编译原理实验报告(15页珍藏版)》请在金锄头文库上搜索。

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

2、NDif3IFthen4THENelse5ELSE标识符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#ETF0S4S51231S6S7Acc2R3R3R3S8S9R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S15S6S711R1R1

3、R1S8S9R112R2R2R2S8S9R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7三、系统实现(包括必要的框图,各.h 和.c 文件说明,所有函数功能的说明,数据结构、 各种表格、变量等的说明,以及函数调用关系图等) (1)各.h 和.c 文件说明 Cifa.cpp 的功能:字符串扫描识别。 Table.cpp 的功能:存放 SLR 分析法需要用到的 ACTION 和 GOTO 表。 Yufa.cpp 的功能:引用 Cifa.cpp、Table.cpp 两个文件进行语法、语义的分析。 (2)函数功能说明 词法分析部分函数说明: int lookup

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

5、)/报错函数 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;/标识单词类型

6、 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 文件以识别算数运算表达

7、式 五、源程序清单(要求有详细注释)和实例程序运行结果 源程序清单: 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 /

8、-# 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;c

9、har 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“); retu

10、rn 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(i

11、sdigit(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“);br

12、eak;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 1

13、2: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;cas

14、e 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;/判断是否

15、是空格或换行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=.)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号