收藏 分享(赏)

词法分析.doc

上传人:weiwoduzun 文档编号:4211396 上传时间:2018-12-15 格式:DOC 页数:9 大小:144KB
下载 相关 举报
词法分析.doc_第1页
第1页 / 共9页
词法分析.doc_第2页
第2页 / 共9页
词法分析.doc_第3页
第3页 / 共9页
词法分析.doc_第4页
第4页 / 共9页
词法分析.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、编译原理课程设计报告一、 设计概述(设计目的、环境、要求)1、 设计目的本次课程设计的目的是通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数据结构,算法及方法,为今后在大型软件系统实践中设计性能优良的软件系统打下基础。2、 设计环境实验环境为 Windows 操作系统下,词法分析使用的主要工具是 flex。3、 设计要求使用 Flex 工具,实现 Decaf 语言词法分析工作,对 Decaf 语言编写的源程序从左至右逐个字符进行扫描,产生一个单词序列。二、 实验步骤(包括基本程序的

2、分析步骤、测试的例子)1、编写程序的分析步骤(1)根据 pp2 所提供的 scanner.l 文件修改我们所需的词法分析程序scanner.l。/*scanner.l* Flex 输入文件,生成 scanner*/%#include #include #include #include #include #include “scanner.h“#include “hashtable.h“#include “utility.h“#include /*Global variable: yylval*-*全局变量,我们可以从 yylval 中获得每个 token 的属性。*以后这个变量由 bison

3、/yacc 自动生成,在这个实验里面,我们手动定义。*/YYSTYPE yylval;/*Global variable: yylloc*-*全局变量,我们可以从 yylloc 中获得每个 token 的位置属性。*以后也由 bison/yacc 自动生成。编译原理课程设计报告*/struct yyltype yylloc;static int curLineNum, curColNum;static char curLine512;static void DoBeforeEachAction(); #define YY_USER_ACTION DoBeforeEachAction();Has

4、htable hasht;%option stack%s N C %x COPY/*在这里定义你的辅助定义和开始条件*/decimal 0-9HEX_decimal (decimal|a-fA-F)+HEX_INTEGER 0XxHEX_decimal+INTEGER decimal+EXPONENT Ee-+INTEGERDOUBLE (INTEGER(“.“)decimal*EXPONENT?)BEG_STRING (“n*)STRING (BEG_STRING“)IDENTIFIER (a-zA-Za-zA-Z0-9_*)OPERATOR +-*/%= yy_pop_state();n

5、curLineNum+; curColNum = 1;if (YYSTATE != COPY) yy_push_state(COPY); WHITE /* ignore space END_COMMENT yy_pop_state(); ReportError(return 0; *n/* /* grab all non-star, non-slash, non-newline */. /* ignore everything else that doesnt match */ SINGLE_COMMENT /* skip to end of line for / comment */ /*

6、- Keywords - */“void“ return T_Void; 编译原理课程设计报告“int“ return T_Int; “double“ return T_Double; “bool“ return T_Bool; “string“ return T_String; “class“ return T_Class; “extends“ return T_Extends; “this“ return T_This; “null“ return T_Null; “while“ return T_While; “for“ return T_For; “if“ return T_If; “

7、else“ return T_Else; “return“ return T_Return; “New“ return T_New; “NewArray“ return T_NewArray; “Print“ return T_Print; “ReadInteger“ return T_ReadInteger; “ReadLine“ return T_ReadLine; /* - Operators - */“=“ return T_GreaterEqual;“=“ return T_Equal; “!=“ return T_NotEqual; “ “|“ return T_Or; OPERA

8、TOR return yytext0; /* - Constants - */“true“|“false“ yylval.boolConstant = (yytext0 = t);return T_BoolConstant; INTEGER yylval.integerConstant = strtol(yytext, NULL, 10);return T_IntConstant; HEX_INTEGER yylval.integerConstant = strtol(yytext, NULL, 16);return T_IntConstant; DOUBLE yylval.doubleCon

9、stant = atof(yytext);return T_DoubleConstant; STRING strcpy(yylval.stringConstant,yytext);return T_StringConstant; BEG_STRING/n ReportError( BEG_STRING ReportError(/* - Identifiers - */IDENTIFIER Declaration *temp;if(temp=hasht.st_lookup(strdup(yytext)=NULL)temp=new Declaration(yytext,yylloc.first_l

10、ine,1);hasht.st_insert(*temp);else编译原理课程设计报告temp-IncrementOccurrences();yylval.decl=temp;return T_Identifier;/* - Default rule (error) - */. ReportError( %void yyerror(char *msg)ReportError(void Inityylex()BEGIN(N); / Start in Normal stateyy_push_state(COPY); / but copy first line at startcurLineNum

11、 = 1;curColNum = 1;int yywrap()return (1);static void DoBeforeEachAction()yylloc.first_line = curLineNum;yylloc.first_column = curColNum;yylloc.last_column = curColNum + yyleng - 1;curColNum += yyleng;const char *GetLineNumbered(int num) return (num = curLineNum) ? curLine : NULL;(2)根据 pp1 所提供的 SYMT

12、AB.C 和 SYMTAB.H 文件修改我们所需要的哈希表的头文件 hashtable.h 和实现哈希表的程序 hashtable.cpp由于在数据结构方面为了实现很方便的进行查找,插入,删除等操作。于是把它的数据结构设计成一哈稀表结构,哈稀表的查找,插入等操作是快速的。所设计的哈稀结构符号表结构如下:编译原理课程设计报告对标识符的处理Y查找,返回对象指针找到否?N出现次数+1 生成一个新的对象然后插入将数据赋值给 yylva.decl程序hashtable.cpp/*Hashtable.cpp:add your code below:*/#include #include “stdlib.h

13、“#include “declaration.h“#include “hashtable.h“/* SHIFT is the power of two used as multiplierin hash function */#define SHIFT 4int Hashtable:hash ( const char * key ) int temp = 0;int i = 0;while (keyi != 0) temp = (temp declation.GetName() != 0)l = l-next;if (l = NULL)编译原理课程设计报告 l = (LineList) mal

14、loc(sizeof(struct LineListRec);l-declation = declation;l-next = hashTableh;hashTableh=l;Declaration * Hashtable:st_lookup (const char* name) int h = hash(name);LineList l = hashTableh;while (l != NULL) if (l = NULL) return NULL;else return hashtable.h/*hashtable:hashtable 的实现方法不会影响最后的结果,所以大家可以自由发挥。允

15、许大家使用类struct 等方法,不过要做相应的改动。hashtable 主要存储变量的声明,由于经常查询,所以要用速度比较快的hashtable 来实现*/#ifndef _H_hashtable#define _H_hashtable#include #include “declaration.h“#define MaxDecla 256class Declaration;#define SIZE 211typedef struct LineListRecDeclaration declation;struct LineListRec * next;*LineList;static Lin

16、eList hashTableSIZE;static int location = 0;class Hashtable private:public:int hash(const char *key);void st_insert(Declaration declation);Declaration *st_lookup(const char *name );#endif 编译原理课程设计报告(3)修改变量声明 declaration.cpp 文件,实现 delcaration 类 declaration.cpp/*declaration.cpp*delcaration 类的实现。*pp1 需

17、要你来实现它*/#include “declaration.h“#include #include Declaration:Declaration(const char *str,int lineNum,int num)name=strdup(str);lineFound=lineNum;numoccur=num;const char * Declaration:GetName()return name;int Declaration:GetLineFound()return lineFound;int Declaration:GetOccurrences()return numoccur;v

18、oid Declaration:IncrementOccurrences()numoccur+;/*Print()*-*由 main.c 调用,注意控制输出格式,使得你的输出和例子中的输出保持一致。*/void Declaration:Print()printf(“(%s seen %d time(s), first on line %d)n“,name,numoccur,lineFound);注:因为 name 是字符串,所以在初始化时必须调用 strdup编译原理课程设计报告(2)测试例子首先运行 pp1 badbool.frag badbool.my,此时 bad1.my 存储的就是用

19、pp1 进行词法分析的结果。然后使用文件比较工具 Textdiff 比较 badbool.my 与 badbool.out。用 TextDiff 进行验证编译原理课程设计报告再运行 pp1 ident.frag ident.my,此时 ident.my 存储的就是用 pp1 进行词法分析的结果。然后使用文件比较工具 Textdiff 比较 ident.my 与 ident.out。用 TextDiff 进行验证三、扩展功能(如无,则不写)四、课程设计心得1、 本次课程设计是一个词法分析器的设计,本来我们需要修改四个部分,分别为scanner.l、hashtable.h、hashtable.cp

20、p、declaration.cpp 。 实现各个部分功能的程序都比较复杂,我在修改过程中遇到了很多困难,之后参考了老师所提供的SYMTAB.C 和 SYMTAB.H 文件以及查找相关资料,对哈希表的插入,查找等才有了些许掌握, 总算能够运行成功。 2、此次实验 declaration 类的实现应该是最简单的一个修改内容,通过这次课程设计,在一定程度上提高了编程能力,对编译原理这一门课程也有了更深的了解。由于所学知识不够全面,课程设计在很多方面还有待完善,在以后的学习过程中,会掌握更多知识,力求做到更好。同时也让我借此机会对类和对象的封装继承有了进一步的了解与掌握,也深刻认识到对与面向对象的内容还需不断学习与巩固。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报