《词法分析》由会员分享,可在线阅读,更多相关《词法分析(9页珍藏版)》请在金锄头文库上搜索。
1、编译原理课程设计报告一、一、 设计概述设计概述(设计目的、环境、要求设计目的、环境、要求)1、设计目的设计目的 本次课程设计的目的是通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数据结构,算法及方法,为今后在大型软件系统实践中设计性能优良的软件系统打下基础。 2、设计环境设计环境实验环境为 Windows 操作系统下,词法分析使用的主要工具是 flex。 3、设计要求设计要求使用 Flex 工具,实现 Decaf 语言词法分析工作,对 Decaf 语言编写的源程序从左至右逐个字符进
2、行扫描,产生一个单词序列。二、二、 实验步骤实验步骤( (包括基本程序的分析步骤、测试的例子包括基本程序的分析步骤、测试的例子) )1、编写程序的分析步骤、编写程序的分析步骤(1 1)根据)根据 pp2pp2 所提供的所提供的 scanner.lscanner.l 文件修改我们所需的文件修改我们所需的词法分析程序词法分析程序 scanner.lscanner.l。 /*scanner.l*Flex 输入文件,生成 scanner */ % #include #include #include #include #include #include “scanner.h“ #include “ha
3、shtable.h“ #include “utility.h“ #include /*Global variable: yylval*-*全局变量,我们可以从 yylval 中获得每个 token 的属性。*以后这个变量由 bison/yacc 自动生成,在这个实验里面,我们手动定义。 */ YYSTYPE yylval; /*Global variable: yylloc*-*全局变量,我们可以从 yylloc 中获得每个 token 的位置属性。*以后也由 bison/yacc 自动生成。编译原理课程设计报告*/ struct yyltype yylloc; static int curL
4、ineNum, curColNum; static char curLine512; static void DoBeforeEachAction(); #define YY_USER_ACTION DoBeforeEachAction(); Hashtable hasht; % %option stack %s N C %x COPY /*在这里定义你的辅助定义和开始条件 */ decimal 0-9 HEX_decimal (decimal|a-fA-F)+ HEX_INTEGER 0XxHEX_decimal+ INTEGER decimal+ EXPONENT Ee-+INTEGER
5、DOUBLE (INTEGER(“.“)decimal*EXPONENT?) BEG_STRING (“n*) STRING (BEG_STRING“) IDENTIFIER (a-zA-Za-zA-Z0-9_*) OPERATOR +-*/%= yy_pop_state(); n curLineNum+; curColNum = 1;if (YYSTATE != COPY) yy_push_state(COPY); WHITE /* ignore space END_COMMENT yy_pop_state(); ReportError(return 0; *n/* /* grab all
6、non-star, non-slash, non-newline */ . /* ignore everything else that doesnt match */ SINGLE_COMMENT /* skip to end of line for / comment */ /* - Keywords - */ “void“ return T_Void; 编译原理课程设计报告“int“ return T_Int; “double“ return T_Double; “bool“ return T_Bool; “string“ return T_String; “class“ return
7、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; “else“ return T_Else; “return“ return T_Return; “New“ return T_New; “NewArray“ return T_NewArray; “Print“ return T_Print; “ReadInteger“ return T_ReadInteger;
8、 “ReadLine“ return T_ReadLine; /* - Operators - */ “=“ return T_GreaterEqual; “=“ return T_Equal; “!=“ return T_NotEqual; “ “|“ return T_Or; OPERATOR return yytext0; /* - Constants - */ “true“|“false“ yylval.boolConstant = (yytext0 = t);return T_BoolConstant; INTEGER yylval.integerConstant = strtol(
9、yytext, NULL, 10);return T_IntConstant; HEX_INTEGER yylval.integerConstant = strtol(yytext, NULL, 16);return T_IntConstant; DOUBLE yylval.doubleConstant = atof(yytext);return T_DoubleConstant; STRING strcpy(yylval.stringConstant,yytext);return T_StringConstant; BEG_STRING/n ReportError( BEG_STRING R
10、eportError(/* - Identifiers - */ IDENTIFIER Declaration *temp;if(temp=hasht.st_lookup(strdup(yytext)=NULL) temp=new Declaration(yytext,yylloc.first_line,1); hasht.st_insert(*temp);else编译原理课程设计报告temp-IncrementOccurrences();yylval.decl=temp;return T_Identifier;/* - Default rule (error) - */ . ReportEr
11、ror( % void yyerror(char *msg) ReportError( void Inityylex() BEGIN(N); / Start in Normal stateyy_push_state(COPY); / but copy first line at startcurLineNum = 1;curColNum = 1; int yywrap() return (1); static void DoBeforeEachAction() yylloc.first_line = curLineNum;yylloc.first_column = curColNum;yyll
12、oc.last_column = curColNum + yyleng - 1;curColNum += yyleng; const char *GetLineNumbered(int num) return (num = curLineNum) ? curLine : NULL; (2 2)根据)根据 pp1pp1 所提供的所提供的 SYMTAB.CSYMTAB.C 和和 SYMTAB.HSYMTAB.H 文件修改我们所需要的哈希表的文件修改我们所需要的哈希表的 头文件头文件 hashtable.hhashtable.h 和实现哈希表的程序和实现哈希表的程序 hashtable.cpphashtable.cpp由于在数据结构方面为了实现很方便的进行查找,插入,删除等操作。于是把它的数由于在数据结构方面为了实现很方便的进行查找,插入,删除等操作。于是把它的数 据结构设计成一哈稀表结构,哈稀表的查找,插入等操作是快速的。所设计的哈稀结据结构设计成一哈稀表结构,