欢迎来到天天文库
浏览记录
ID:58910523
大小:66.50 KB
页数:21页
时间:2020-10-26
《TINY部分源码分析报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、TINY源码分析一、文件概述MAIN.C:主函数GLOBALS.H:全局定义的文件SCAN.C/SCAN.H:词法分析PARSE.C/PARSE.H:语法分析UTIL.C/UTIL.H:构造树SYMTAB.C/SYMTAB.H:符号表CGEN.C/CGEN.H:生成"汇编代码"CODE.C/CODE.H:这个只是用来把分析过程输出到屏幕的.二、各个文件的分析1.MAIN.C:主要有三个FILE*句柄:source--源代码文件。listing--显示分析过程的文件,这里重定向到stdout。code--目
2、标汇编代码文件。从该文件中可知程序运行的流程:检查参数正确否(tiny.exefilename)->构造语法树(调用parse函数)->根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数。2.GLOBALS.H:定义了关键字个数8个。定义了关键字,运算符等内容的枚举值。定义了语句类型的枚举值,这个决定树的结点。定义了变量类型(也就三种,void,integer,boolean)。定义了树的节点--这个最重要了!!其结构如下所示:typedefstructtreeNode{structtr
3、eeNode*child[MAXCHILDREN];structtreeNode*sibling;intlineno;NodeKindnodekind;union{StmtKindstmt;ExpKindexp;}kind;union{TokenTypeop;intval;char*name;}attr;ExpTypetype;/*fortypecheckingofexps*/}TreeNode;3.UTIL.C/UTIL.H主要函数TreeNode*newStmtNode(StmtKindkind)此函
4、数创建一个有关语法树的声明节点TreeNode*newExpNode(ExpKindkind)此函数创建一个有关语法树的表述节点char*copyString(char*s)此函数分配和创建一个新的已存在树的复制voidprintTree(TreeNode*tree)输出一个语法树这两个文件主要是关于语法树的创建和输出4.SCAN.c/SCAN.H主要有这么几个函数:staticintgetNextChar(void);staticvoidungetNextChar(void);staticTokenTy
5、pereservedLookup(char*s);TokenTypegetToken(void);reservedLookup函数是查找关键字的,在符号表中找。这里还定义了一个保存关键字的结构:staticstruct{char*str;TokenTypetok;}reservedWords[MAXRESERVED]={{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},{"repeat",REPEAT},{"until",UNTIL},{"read",RE
6、AD},{"write",WRITE}};最重要的是getToken(void)函数。这个相当于lex的功能,进行词法分析。也就是一个DFA,switch后面跟了一堆的case。其中getNextChar(void)函数的思路,以下列出:staticintgetNextChar(void){if(!(linepos7、eno,lineBuf);bufsize=strlen(lineBuf);linepos=0;returnlineBuf[linepos++];}else{EOF_flag=TRUE;returnEOF;}}elsereturnlineBuf[linepos++];}4.PARSE.C/PARSE.H有这么几个函数:TreeNode*parse(void)staticTreeNode*stmt_sequence(void);staticTreeNode*statement(void);staticTree8、Node*if_stmt(void);staticTreeNode*repeat_stmt(void);staticTreeNode*assign_stmt(void);staticTreeNode*read_stmt(void);staticTreeNode*write_stmt(void);staticTreeNode*exp(void);staticTreeNode*simple_exp(void);staticTree
7、eno,lineBuf);bufsize=strlen(lineBuf);linepos=0;returnlineBuf[linepos++];}else{EOF_flag=TRUE;returnEOF;}}elsereturnlineBuf[linepos++];}4.PARSE.C/PARSE.H有这么几个函数:TreeNode*parse(void)staticTreeNode*stmt_sequence(void);staticTreeNode*statement(void);staticTree
8、Node*if_stmt(void);staticTreeNode*repeat_stmt(void);staticTreeNode*assign_stmt(void);staticTreeNode*read_stmt(void);staticTreeNode*write_stmt(void);staticTreeNode*exp(void);staticTreeNode*simple_exp(void);staticTree
此文档下载收益归作者所有