您好,欢迎光临本网站![请登录][注册会员]  
文件名称: TINY+c编译器源码
  所属分类: C
  开发工具:
  文件大小: 55kb
  下载次数: 0
  上传时间: 2008-10-10
  提 供 者: inter*****
 详细说明: 经典的c编译器代码,有手工和自动两种 一:共有16个文件。 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.exe filename)->构造语法树(调用parse函数)->根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数)。 2,GLOBALS.H: 定义了关键字个数8个。 定义了关键字,运算符等内容的枚举值。 定义了语句类型的枚举值,这个决定树的结点。 定义了变量类型(也就三种,void, integer, boolean)。 定义了树的节点--这个最重要了!!其结构如下所示: typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; 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; 从字面就知道意思了。因为关键字少,语法简单,所以孩子结点不多,他这里定义最多3个,所以直接用数组就可以了,不动态分配。 剩下的定义了一些条件编译的变量,对整个编译的核心内容无关紧要。不说了。 3,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; TokenType tok; } reservedWords[MAXRESERVED] = {{"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 < bufsize)) { lineno++; if (fgets(lineBuf,BUFLEN-1,source)) { if (EchoSource) fprintf(listing,"%4d: %s",lineno,lineBuf); bufsize = strlen(lineBuf); linepos = 0; return lineBuf[linepos++]; } else { EOF_flag = TRUE; return EOF; } } else return lineBuf[linepos++]; } 4,PARSE.C/PARSE.H 有这么几个函数: TreeNode * parse(void) static TreeNode * stmt_sequence(void); static TreeNode * statement(void); static TreeNode * if_stmt(void); static TreeNode * repeat_stmt(void); static TreeNode * assign_stmt(void); static TreeNode * read_stmt(void); static TreeNode * write_stmt(void); static TreeNode * exp(void); static TreeNode * simple_exp(void); static TreeNode * term(void); static TreeNode * factor(void); 最重要的是parse这个函数,就是用来构造整个程序的语法树的。下面的一堆私有函数看名字就知道了,,它们构造相应语法的语法树,然后parse最后把它们这些子树整合成一个大树。 5,SYMTAB.C/SYMTAB.H 这个是符号表操作的,也就是词法分析的时候查找表,看该token是不是关键字。如果不是,就当作表识符添加进去。在语法分析的时候也要用到,看变量有没有声明的时候用的。 ...展开收缩
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: c 编译器 经典
 输入关键字,在本站1000多万海量源码库中尽情搜索: