ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:22.89KB ,
资源ID:3868523      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3868523.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(TINY部分源码分析报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

TINY部分源码分析报告.docx

1、TINY部分源码分析报告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-目标汇编代码文件。从该文件中可知程序运行的流程:检查参数正确否(tiny.

2、exe )-构造语法树(调用parse函数)-根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数。2.GLOBALS.H:定义了关键字个数8个。定义了关键字,运算符等内容的枚举值。定义了语句类型的枚举值,这个决定树的结点。定义了变量类型(也就三种,void, integer, boolean)。定义了树的节点-这个最重要了!其结构如下所示:typedef struct treeNodestruct treeNode * childMAXCHILDREN;struct treeNode * sibling;int lineno;NodeKind nodekind;union S

3、tmtKind stmt; ExpKind exp; kind;union TokenType op;int val;char * name; attr;ExpType type; /* for type checking of exps */ TreeNode;3.UTIL.C/UTIL.H 主要函数TreeNode * newStmtNode(StmtKind kind) 此函数创建一个有关语法树的声明节点TreeNode * newExpNode(ExpKind kind) 此函数创建一个有关语法树的表述节点char * copyString(char * s) 此函数分配和创建一个新的

4、已存在树的复制 void printTree( TreeNode * tree ) 输出一个语法树 这两个文件主要是关于语法树的创建和输出4.SCAN.c/SCAN.H主要有这么几个函数:static int getNextChar(void);static void ungetNextChar(void);static TokenType reservedLookup (char * s);TokenType getToken(void);reservedLookup函数是查找关键字的,在符号表中找。这里还定义了一个保存关键字的结构:static struct char* str;Token

5、Type tok; reservedWordsMAXRESERVED=if,IF,then,THEN,else,ELSE,end,END,repeat,REPEAT,until,UNTIL,read,READ,write,WRITE;最重要的是getToken(void)函数。这个相当于lex的功能,进行词法分析。也就是一个DFA,switch后面跟了一堆的case。其中getNextChar(void)函数的思路,以下列出:static int getNextChar(void)if (!(linepos 构造语法树(调用parse函数)-根据语法树生成代码(调用codeGen函数),同时熟

6、悉了编译器是如何使用prase函数进行语法树的构建以及语法树生成代码的转化,最主要的是进一步清晰了解到编译器的构造和运行原理,加深了对课本知识的运用和拓展,感觉收获很大!Main.c/*/* File: main.c */* Main program for TINY compiler */* Compiler Construction: Principles and Practice */* Kenneth C. Louden */*/#include globals.h/* set NO_PARSE to TRUE to get a scanner-only compiler ,NO_PA

7、RSE为true时创建一个只扫描的编译器 */#define NO_PARSE FALSE /* set NO_ANALYZE to TRUE to get a parser-only compiler ,NO_ANALYZE为true时创建一个只分析和扫描的编译器*/#define NO_ANALYZE FALSE/* set NO_CODE to TRUE to get a compiler that does not * generate code NO_CODE为true时创建一个执行语义分析,但不生成代码的编译器 */#define NO_CODE FALSE#include uti

8、l.h#if NO_PARSE#include scan.h /如果NO_PARSE为true,调用头文件scan.h#else#include parse.h /否则调用头文件prase.h#if !NO_ANALYZE#include analyze.h /如果NO_ANALYZE为true,调用头文件analyze.h#if !NO_CODE#include cgen.h /如果NO_CODE为true,调用头文件cgen.h#endif #endif#endif /结束预处理语句符号/* allocate global variables 分配全局变量*/int lineno = 0;

9、FILE * source; /指针指向源代码文件地址FILE * listing; /指针指向显示分析过程的文件的地址FILE * code; /指针指向目标汇编代码文件的地址/* allocate and set tracing flags 分配和设置跟踪标志*/int EchoSource = FALSE;int TraceScan = FALSE;int TraceParse = FALSE;int TraceAnalyze = FALSE;int TraceCode = FALSE;int Error = FALSE; /跟踪标志全部初始化为falsemain( int argc,

10、char * argv ) TreeNode * syntaxTree; char pgm120; /* source code */ if (argc != 2) fprintf(stderr,usage: %s n,argv0); exit(1); /如果argv不为2,打印显示信息并退出 strcpy(pgm,argv1) ; /复制argv1地址以null为退出字符的存储器区块到另一个存储器区块品pgm内 if (strchr (pgm, .) = NULL) strcat(pgm,.tny); /把.tyn文件所指字符串添加到pgm结尾处并添加0。 source = fopen(pg

11、m,r); /以只读的方式打开pgm文件,并将指向pgm文件的指针返回给source if (source=NULL) fprintf(stderr, not foundn,pgm); exit(1); /如果源代码文件为空,打印显示信息并退出 listing = stdout; /* send listing to screen 清单发送到屏幕*/ fprintf(listing,nTINY COMPILATION: %sn,pgm); /答应显示语句#if NO_PARSE while (getToken()!=ENDFILE); /如果输入流没有结束就继续进行循环,直至结束#else s

12、yntaxTree = parse();/调用prase()函数构造语法树 if (TraceParse) fprintf(listing,nSyntax tree:n); printTree(syntaxTree); / 如果语法分析追踪标志为TRUE且没有语法错误,则将生成的语法树输出到屏幕 #if !NO_ANALYZE if (! Error) if (TraceAnalyze) fprintf(listing,nBuilding Symbol Table.n); buildSymtab(syntaxTree); /输出含符号表信息的语法树 if (TraceAnalyze) fpri

13、ntf(listing,nChecking Types.n); typeCheck(syntaxTree);/输出含类型检查的语法树 if (TraceAnalyze) fprintf(listing,nType Checking Finishedn);/打印结束信息 #if !NO_CODE if (! Error) char * codefile; int fnlen = strcspn(pgm,.); codefile = (char *) calloc(fnlen+4, sizeof(char); strncpy(code); strcat(codefile,.tm); /将源文件名,

14、去掉扩展名,添加扩展名.tm code = fopen(codefile,w);/以只写的方式打开目标汇编代码文件,并返回地址给codez指针 if (code = NULL) printf(Unable to open %sn,codefile); exit(1); /如果code指针为空,打印显示信息并退出 codeGen(syntaxTree,code目标代码生成 fclose(code); #endif#endif#endif/结束之前对应的条件编译 fclose(source); /关闭源代码文件 return 0;GLOBALS.H/*/* File: globals.h */*

15、Global types and vars for TINY compiler */* must come before other include files */* Compiler Construction: Principles and Practice */* Kenneth C. Louden */*/#ifndef _GLOBALS_H_ #define _GLOBALS_H_ /宏定义#include #include #include #include /头文件引用#ifndef FALSE#define FALSE 0 /定义FALSE为0#endif #ifndef TR

16、UE#define TRUE 1 /定义TRUE为1#endif/* MAXRESERVED = the number of reserved words */#define MAXRESERVED 8 /定义了关键字个数8个typedef enum /* book-keeping tokens */ END, /* reserved words */ IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE, /* multicharacter tokens */ ID,NUM, /* special symbols */ ASSIGN,EQ,LT,PLUS,MINU

17、S,TIMES,OVER,LPAREN,RPAREN,SEMI TokenType; / 定义了关键字,运算符等内容的枚举值 extern FILE* source; /* source code text file源代码地址 */ extern FILE* listing; /* listing output text file 显示分析过程的文件的地址*/extern FILE* code; /* code text TM simulator 目标汇编代码文件的地址*/extern int lineno; /* source line number for listing */*/* Sy

18、ntax tree for parsing */*/typedef enum StmtK,ExpK NodeKind;/定义了语句类型的枚举值,这个决定树的节点typedef enum IfK,RepeatK,AssignK,ReadK,WriteK StmtKind;typedef enum OpK,ConstK,IdK ExpKind;/* ExpType is used for type checking */typedef enum Void,Integer,Boolean ExpType;/定义了变量类型#define MAXCHILDREN 3 /定义了最大子节点typedef s

19、truct treeNode/定义了树的节点 struct treeNode * childMAXCHILDREN; struct treeNode * sibling; int lineno; NodeKind nodekind; union StmtKind stmt; ExpKind exp; kind; union TokenType op; int val; char * name; attr; ExpType type; /* for type checking of exps */ TreeNode;/*/* Flags for tracing */*/* EchoSource

20、= TRUE causes the source program to * be echoed to the listing line numbers * during parsing */extern int EchoSource;/* TraceScan = TRUE causes token information to be * printed to the listing each token is * recognized by the scanner */extern int TraceScan;/* TraceParse = TRUE causes the syntax tre

21、e to be * printed to the listing linearized form * (using indents for children) */extern int TraceParse;/* TraceAnalyze = TRUE causes symbol table inserts * and lookups to be reported to the listing file */extern int TraceAnalyze;/* TraceCode = TRUE causes comments to be written * to the TM code cod

22、e is generated */extern int TraceCode;/* Error = TRUE prevents further passes if an error occurs */extern int Error; #endifSCAN.C/* 词法扫描程序 */#include globals.h#include util.h#include scan.h/*定义的状态*/typedef enum START, /*初始状态*/ INASSIGN, /*进入到赋值状态*/ INCOMMENT, /*进入到注释状态*/ INNUM, /*进入到数字状态*/ INID, /*进

23、入到标志符状态*/ DONE /*状态结束*/StateType;/*每当语法分析程序需要一个单词时,就调用该子程序,得到 (类别码,单词的值)*/* 语义标识符和保留字*/char tokenStringMAXTOKENLEN+1;/* BUFLEN = 源代码的输入缓冲长度 */#define BUFLEN 256static char lineBufBUFLEN; /* 当前行 */static int linepos = 0; /* 在linebuf中的当前位置*/static int bufsize = 0; /* 缓冲区的字符串当前大小*/static int EOF_flag =

24、 FALSE; /* 如果读入下一个字符出错,设置EOF_flag为假。*/* 从linebuffer中读取下一个非空白字符,如果读完,则读入新行。 */static int getNextChar(void) if (!(linepos bufsize) lineno+; if (fgets(lineBuf,BUFLEN-1,source) if (EchoSource) fprintf(listing,%4d: %s,lineno,lineBuf); bufsize = strlen(lineBuf); linepos = 0; return lineBuflinepos+; else E

25、OF_flag = TRUE; return EOF; else return lineBuflinepos+;/* 如果读入下一个字符出错,在linebuf中回退一个字符 。*/static void ungetNextChar(void) if (!EOF_flag) linepos- ;/* 保留字的查找表 */static struct char* str; TokenType tok; reservedWordsMAXRESERVED = if,IF,then,THEN,else,ELSE,end,END, repeat,REPEAT,until,UNTIL,read,READ, write,WRITE; /* 标识符是否是保留字*/static TokenType reservedLookup (char * s) int i; for (i=0;iMAXRESERVED;i+) if (!s

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1