05 2007 档案

摘要:函数定义funcdefn处理里,已经准备好调用参数和参数返回,接着就是调用全局函数声明来处理。如下面的代码:#132//声明函数。#133cfunc = dclglobal(sclass, id, ty, &pt);#134上面的代码是处理函数全局定义。现在就去就分析dclglobal函数的实现,它主要用来分析全局函数的。它的代码如下:#001//全局函数声明。#002static Symbol dclglobal(int sclass, char *id, Type ty, Coordinate *pos) #003{第2行里传入的参数分析是:sclass是这个函数名称存储类型。id 阅读全文
posted @ 2007-05-30 22:26 ajuanabc 阅读(221) 评论(0) 推荐(0) 编辑
摘要:激动人心的时刻就要开始了,从这节开始,就进入处理实际的代码了。由于C语言是函数式的语言,也就是每个程序都是有一个一个的函数组成的,一个C源程序至少包含一个函数(main函数),也可以包含一个main函数和若干个其它函数。因此,函数是C程序的基本单位。仔细地查看一下第一节里的例子代码,它是如下:#001#include <stdio.h>#002#003int main(void)#004{#005int nTest1 = 1;#006int nTest2 = 2;#007int nTest3;#008int i;#009#010nTest3 = nTest1 + nTest2;#0 阅读全文
posted @ 2007-05-29 23:26 ajuanabc 阅读(311) 评论(0) 推荐(0) 编辑
摘要:函数里的参数变量个数不固定,因此也需要检查这些参数的名称是否相同,还需要检查类型的合法性。现在就来分析上次提到的函数dclparam,它的代码如下:#001//参数类型声明处理#002static Symbol dclparam(int sclass, char *id, Type ty, Coordinate *pos) #003{#004Symbol p;#005#006if (isfunc(ty))#007 ty = ptr(ty);#008else if (isarray(ty))#009 ty = atop(ty);#010第6行判断这个参数变量是否声明为函数类型,如果是就需要创建新 阅读全文
posted @ 2007-05-28 22:13 ajuanabc 阅读(200) 评论(0) 推荐(0) 编辑
摘要:在第一节介绍的例子里,就需要使用到函数声明。比如下面的语句: printf("nTest3 = %d/r/n",nTest3);如果没有预先的声明,编译器是找不到它的类型定义,所以编译不通过。因此就需要了解什么是函数的声明,在LCC里又是怎么样处理函数的声明的。在hello.i文件里,有下面一句的函数声明:int printf(const char *, ...);要分析上面的声明,就需要先识别类型int,然后再识别ID字符串printf,最后处理括号和参数列表。在LCC的源程序里,先在函数specifier函数里就已经可以把类型和ID识别出来,并判断语法的合法性,主要还剩 阅读全文
posted @ 2007-05-27 18:49 ajuanabc 阅读(225) 评论(0) 推荐(0) 编辑
摘要:上次只介绍到开始分析结构类型的定义开始部分,接着就要去分析它的成员类型定义了。它调用函数来处理结构的成员,如下代码:#001static void fields(Type ty) #002{#003{ #004 int n = 0;#005 while (istypename(t, tsym)) #006 {#007 static char stop[] = { IF, CHAR, '}', 0 };#008#009 Type ty1 = specifier(NULL);第5行判断是否类型定义,如果是的话就不断地进行字段列表处理。在第9行里就调用上前介绍过的声明函数specif 阅读全文
posted @ 2007-05-26 20:05 ajuanabc 阅读(208) 评论(0) 推荐(0) 编辑
摘要:以前都是简单类型的识别和语法分析,现在来分析结构的声明,它是比较复杂的一种数据类型,但结构在编写程序中使用是非常多的。由于程序的方程式就是:数据结构+算法=程序现在面向对象的方程式是:数据结构+算法=对象对象+对象=程序由上面的公式,就可以看出程序中的数据结构是非常重要的,无论是面向对象的编程,还是面向过程的编程,有什么样的数据结构,就需要有什么样算法。而在C语言里,使用结构类型来描述现实中需要的抽象模型。例子里的结构声明如下:struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int 阅读全文
posted @ 2007-05-25 21:38 ajuanabc 阅读(206) 评论(0) 推荐(0) 编辑
摘要:之前发过一个http://blog.csdn.net/piperzero/archive/2007/04/24/1579911.aspx现在再发一个,发现这个也是很好用的。其实两个是差不多的。可以是图片也可以是FLASH。<DIV id=ad_dl01 style="Z-INDEX: 1; LEFT: 5px; VISIBILITY: visible; WIDTH: 100px; POSITION: absolute; TOP: 55px"><TABLE cellSpacing=0 cellPadding=0 width=100 border=0> 阅读全文
posted @ 2007-05-25 04:44 ajuanabc 阅读(145) 评论(0) 推荐(0) 编辑
摘要:在C语言里,指针是最灵活的数据类型,它具有低级语言的特点,高效快速,不过学会它就不是那么容易了。由于指针是直接面向机器的,也就是它是指向内存的地址,因此使用C来编写嵌入式软件,或者操作系统的软件是比较合适的选择。下面就来看例子里的指针语句,如下:typedef char * va_list;上面这句声明了va_list为char的指针类型的别名,那么在LCC里又是怎么样处理它的呢?先识别typedef出来,接着就调函数decl(dclglobal),然后调用函数specifier来处理。在函数specifier里:#001//说明#002static Type specifier(int *s 阅读全文
posted @ 2007-05-23 22:54 ajuanabc 阅读(211) 评论(0) 推荐(0) 编辑
摘要:想到多年前google刚刚在国内有点名气的时候,我和我同学用的最多的google搜索和新浪的分类。分类因为不方便和资料不够齐全的关系被放弃了。google刚开始还是不错的,后来发现一个极为不爽的地方:点击搜索结果不是新窗口打开,这样我每次都要按着shift让它在新窗口打开或者每次后退。后来google改变了这个“缺点”,但是最近居然又再次出现。让我不得不多使用他的对手之一baidu.人们常说或者听说细节决定成败。或者这个是我的一个要求并不适合大多数的人。至少,我放弃了google,或者说不是第一首选了。PS,最近诺顿误杀事件影响很大,CCTV已经N次报道了。搞不清楚诺顿公司是怎么想的,他不怕影 阅读全文
posted @ 2007-05-23 12:11 ajuanabc 阅读(114) 评论(0) 推荐(0) 编辑
摘要:语法分析是比较复杂的处理,下面再来分析一个例子,它的代码如下:typedef unsigned short wchar_t;typedef wchar_t wint_t;第一句语句在LCC里的处理,前面已经解释清楚,主要生成wchar_t保存符号表里,并且记录这个ID的类型属性。那么第二句是怎么样通过上面的函数来分析的呢?接下来就去分析C编译器怎么处理它。与第一句语句一样,先识别typedef出来,接着就调函数decl(dclglobal),然后调用函数specifier来处理。在函数specifier里:#001//说明#002static Type specifier(int *sclas 阅读全文
posted @ 2007-05-22 22:10 ajuanabc 阅读(184) 评论(0) 推荐(0) 编辑
摘要:看到淘宝上的一个效果不错。存了一个,最后整理代码如下:<STYLE type=text/css media=screen>DIV#PreviewBox {DISPLAY: none; PADDING-LEFT: 6px; Z-INDEX: 2006; POSITION: absolute}DIV#PreviewBox SPAN {BACKGROUND: url(http://img.taobao.com/2k6/sys/list/arrow.gif) no-repeat 0px 0px; LEFT: 0px; WIDTH: 7px; POSITION: absolute; TOP: 阅读全文
posted @ 2007-05-22 12:10 ajuanabc 阅读(147) 评论(0) 推荐(0) 编辑
摘要:把下面的19X19的图片设置它的style="margin-bottom:-5px" 这样文字和图片就居中了,这个值随着图片的大小不同而改变。td中<img src="image/ball.jpg" style="margin-bottom:-8px"><a href="index.asp" class="menu">Home</a> 阅读全文
posted @ 2007-05-22 00:10 ajuanabc 阅读(154) 评论(0) 推荐(0) 编辑
摘要:前一次已经分析了声明的函数,但还有一个声明函数没有分析的,它就是dclr函数,这个函数是大内总管,分别调用前面两个声明函数来处理所有的声明语句,接着又会保存声明的ID和属性到符号表,当然它需要调用处理函数定义的函数,接着在那里把函数生成汇编代码并写到输出文件里。现在就来看代码:#001static void decl(Symbol (*dcl)(int, char *, Type, Coordinate *)) #002{#003int sclass;#004Type ty, ty1;#005static char stop[] = { CHAR, STATIC, ID, 0 };#006#0 阅读全文
posted @ 2007-05-21 22:31 ajuanabc 阅读(274) 评论(0) 推荐(0) 编辑
摘要:上一次把声明的说明符已经分析得很清楚,也就是把C的变量和函数声明都已经了解了。最后还剩下一个问题没有解决,这个问题就是声明后面的ID是变量呢?还是函数?或者是指针?为了识别后面的ID,下面来看一个例子。如下的语句:typedef unsigned int size_t;这是第一行处理的代码,它通过函数specifier处理后,已经就把typedef、unsigned、int处理完成,还剩下size_t没有处理。从函数返回specifier后,接着几次递归调用才把它处理完成,现在就来看看分析这句语句的函数调用关系。如下所示:#001program#002decl(dclglobal)#003 s 阅读全文
posted @ 2007-05-20 13:15 ajuanabc 阅读(225) 评论(0) 推荐(0) 编辑
摘要:在语法分析里,最主要的组成部份是声明分析,并且这是C语言编译器最复杂的组成部分。由于任何变量都需要声明,那么怎么样知道这个变量声明是合法的呢?现在带着这个问题去分下面的代码。为了理解代码的工作,先来看前面的例子里的第一行有效代码:typedef unsigned int size_t;在这句语句里,使用类型定义关键字来声明了一个无符号整数的类型size_t,为了识别这句语句的语法,那么最开始的是类型关键字,它相当于存储类型。接着是无符号、整型,最后才是标识ID。其实上面这句语句也可能有这种形式,如下:typedef int size_t;那么上面这句就上面那句少了一个无符号的说明。要分析这种声 阅读全文
posted @ 2007-05-19 23:26 ajuanabc 阅读(262) 评论(0) 推荐(0) 编辑
摘要:准备好词法分析之后,接着的工作就是检查源程序是否合法,以及源程序表达的意思是什么。这两个问题就是语法和语义的分析,也就是把源程序里所包含的属性分析出来,并保存到符号表里。下面就来仔细地分析LCC编译器是怎么样处理这两个问题的。#001t = gettok();#002#003//调用后端代码生成初始化工作。#004(*IR->progbeg)(argc, argv);#005#006for (i = 1; i < argc; i++)#007{#008 if (strcmp(argv[i], "-n") == 0) #009 {#010 if (!YYnull) 阅读全文
posted @ 2007-05-18 23:06 ajuanabc 阅读(298) 评论(0) 推荐(0) 编辑
摘要:下面开始关键字、ID等识别,采用这种词法分析,是最高效的,由于在识别的过程里,就已经区分它是什么关键字,而不像其它的词法分析程序,需要查找才能决定是否是关键字。#074 case 'i':#075 if (rcp[0] == 'f'#076 && !(map[rcp[1]]&(DIGIT|LETTER))) {#077 cp = rcp + 1;#078 return IF;#079 }#080 if (rcp[0] == 'n'#081 &&rcp[1] == 't'#082 && 阅读全文
posted @ 2007-05-17 22:17 ajuanabc 阅读(452) 评论(0) 推荐(0) 编辑
摘要:在最开始的例子程序里,程序是由一些单词和符号组成的。其实程序就是一串长长的字符串,这些字符串是按一定的规则编写的,那么就需要检查这些单词和符号是否符合定义的规则。在C语言里,就是定义了C语法和语义。在最开始的例子里,C编译器最先进行词法分析的语句是下面这句:typedef unsigned int size_t;那么C编译器是怎么样把上面的字符串识别出来的呢?其实词法分析就是把上面的字符串识别为下面的单词:typedefunsignedintsize_t;为了简单和比较方便,词法分析里会把这些单词用一个数字进行标识的,这样就容易存储和分析了。目标已经很明确,现在就来分析一下LCC的词法分析代码 阅读全文
posted @ 2007-05-16 22:34 ajuanabc 阅读(259) 评论(0) 推荐(0) 编辑
摘要:上面已经介绍打开文件输入,并且分析了读取到缓冲区里的代码,接着下来就是分析行号同步的处理,还有类型初始化。先来看看生成中间文件hello.i中的源程序,在它的第1行和第2行如下:#001#line 1 "hello.c"#002#line 1 "include/stdio.h"#003#004#005#006#007typedef unsigned int size_t;这样的源程序是怎么样被处理的呢?像#line参数就是用来识别文件的行号同步和文件名称的。现在就来分析函数nextline,它就会处理这样的源程序,让行号同步和源程序的文件名称也同步更新, 阅读全文
posted @ 2007-05-15 23:00 ajuanabc 阅读(268) 评论(0) 推荐(0) 编辑