LCC编译器的源程序分析(19)全局函数的定义

函数定义funcdefn处理里,已经准备好调用参数和参数返回,接着就是调用全局函数声明来处理。如下面的代码:#132  //声明函数。#133  cfunc = dclglobal(sclass, id, ty, &pt);#134 上面的代码是处理函数全局定义。现在就去就分析dclglobal函数的实现,它主要用来分析全局函数的。它的代码如下:#001 //全局函数声明。...
阅读(3060) 评论(1)

LCC编译器的源程序分析(18)函数定义

 激动人心的时刻就要开始了,从这节开始,就进入处理实际的代码了。由于C语言是函数式的语言,也就是每个程序都是有一个一个的函数组成的,一个C源程序至少包含一个函数(main函数),也可以包含一个main函数和若干个其它函数。因此,函数是C程序的基本单位。仔细地查看一下第一节里的例子代码,它是如下:#001 #include #002 #003 int main(void)#004...
阅读(2928) 评论(0)

LCC编译器的源程序分析(17)参数变量的声明

 函数里的参数变量个数不固定,因此也需要检查这些参数的名称是否相同,还需要检查类型的合法性。现在就来分析上次提到的函数dclparam,它的代码如下:#001 //参数类型声明处理#002 static Symbol dclparam(int sclass, char *id, Type ty, Coordinate *pos) #003 {#004  Symbol p;#...
阅读(2743) 评论(2)

LCC编译器的源程序分析(16)函数的声明

在第一节介绍的例子里,就需要使用到函数声明。比如下面的语句:       printf("nTest3 = %d/r/n",nTest3);如果没有预先的声明,编译器是找不到它的类型定义,所以编译不通过。因此就需要了解什么是函数的声明,在LCC里又是怎么样处理函数的声明的。在hello.i文件里,有下面一句的函数声明:int printf(const char *, ...);要分...
阅读(3054) 评论(1)

LCC编译器的源程序分析(15)结构类型成员的声明

上次只介绍到开始分析结构类型的定义开始部分,接着就要去分析它的成员类型定义了。它调用函数来处理结构的成员,如下代码:#001 static void fields(Type ty) #002 {#003  { #004         int n = 0;#005         while (istypename(t, tsym)) #006         {#00...
阅读(2492) 评论(2)

LCC编译器的源程序分析(14)结构类型的声明

以前都是简单类型的识别和语法分析,现在来分析结构的声明,它是比较复杂的一种数据类型,但结构在编写程序中使用是非常多的。由于程序的方程式就是:数据结构+算法=程序现在面向对象的方程式是:数据结构+算法=对象对象+对象=程序由上面的公式,就可以看出程序中的数据结构是非常重要的,无论是面向对象的编程,还是面向过程的编程,有什么样的数据结构,就需要有什么样算法。而在C语言里,使用结构类...
阅读(2346) 评论(1)

LCC编译器的源程序分析(13)指针类型的声明

在C语言里,指针是最灵活的数据类型,它具有低级语言的特点,高效快速,不过学会它就不是那么容易了。由于指针是直接面向机器的,也就是它是指向内存的地址,因此使用C来编写嵌入式软件,或者操作系统的软件是比较合适的选择。下面就来看例子里的指针语句,如下:typedef char * va_list;上面这句声明了va_list为char的指针类型的别名,那么在LCC里又是怎么样处理它的呢?先识...
阅读(3023) 评论(3)

LCC编译器的源程序分析(12)自定义类型的声明

语法分析是比较复杂的处理,下面再来分析一个例子,它的代码如下:typedef unsigned short wchar_t;typedef wchar_t wint_t;第一句语句在LCC里的处理,前面已经解释清楚,主要生成wchar_t保存符号表里,并且记录这个ID的类型属性。那么第二句是怎么样通过上面的函数来分析的呢?接下来就去分析C编译器怎么处理它。与第一句语句一样,先识...
阅读(2965) 评论(0)

LCC编译器的源程序分析(11)声明与符号表

前一次已经分析了声明的函数,但还有一个声明函数没有分析的,它就是dclr函数,这个函数是大内总管,分别调用前面两个声明函数来处理所有的声明语句,接着又会保存声明的ID和属性到符号表,当然它需要调用处理函数定义的函数,接着在那里把函数生成汇编代码并写到输出文件里。现在就来看代码:#001 static void decl(Symbol (*dcl)(int, char *, Type, Co...
阅读(3281) 评论(0)

LCC编译器的源程序分析(10)声明类型

上一次把声明的说明符已经分析得很清楚,也就是把C的变量和函数声明都已经了解了。最后还剩下一个问题没有解决,这个问题就是声明后面的ID是变量呢?还是函数?或者是指针?为了识别后面的ID,下面来看一个例子。如下的语句:typedef unsigned int size_t;这是第一行处理的代码,它通过函数specifier处理后,已经就把typedef、unsigned、int处理完成,还剩下...
阅读(3351) 评论(1)

LCC编译器的源程序分析(9)声明分析

 在语法分析里,最主要的组成部份是声明分析,并且这是C语言编译器最复杂的组成部分。由于任何变量都需要声明,那么怎么样知道这个变量声明是合法的呢?现在带着这个问题去分下面的代码。为了理解代码的工作,先来看前面的例子里的第一行有效代码:typedef unsigned int size_t;在这句语句里,使用类型定义关键字来声明了一个无符号整数的类型size_t,为了识别这句语句的语法...
阅读(3267) 评论(0)

LCC编译器的源程序分析(8)语法分析的开始

准备好词法分析之后,接着的工作就是检查源程序是否合法,以及源程序表达的意思是什么。这两个问题就是语法和语义的分析,也就是把源程序里所包含的属性分析出来,并保存到符号表里。下面就来仔细地分析LCC编译器是怎么样处理这两个问题的。#001 t = gettok();#002  #003  //调用后端代码生成初始化工作。#004  (*IR->progbeg)(argc, argv);...
阅读(5052) 评论(11)

LCC编译器的源程序分析(7)词法分析

下面开始关键字、ID等识别,采用这种词法分析,是最高效的,由于在识别的过程里,就已经区分它是什么关键字,而不像其它的词法分析程序,需要查找才能决定是否是关键字。#074         case i:#075               if (rcp[0] == f#076               && !(map[rcp[1]]&(DIGIT|LETTER))) {...
阅读(4435) 评论(2)

LCC编译器的源程序分析(6)词法分析

在最开始的例子程序里,程序是由一些单词和符号组成的。其实程序就是一串长长的字符串,这些字符串是按一定的规则编写的,那么就需要检查这些单词和符号是否符合定义的规则。在C语言里,就是定义了C语法和语义。在最开始的例子里,C编译器最先进行词法分析的语句是下面这句:typedef unsigned int size_t;那么C编译器是怎么样把上面的字符串识别出来的呢?其实词法分析就是把上面的字符串...
阅读(4503) 评论(0)

LCC编译器的源程序分析(5)行号同步与类型初始化

上面已经介绍打开文件输入,并且分析了读取到缓冲区里的代码,接着下来就是分析行号同步的处理,还有类型初始化。 先来看看生成中间文件hello.i中的源程序,在它的第1行和第2行如下:#001 #line 1 "hello.c"#002 #line 1 "include/stdio.h"#003 #004 #005 #006 #007 typedef unsigne...
阅读(4010) 评论(0)
25条 共2页1 2 下一页 尾页
    个人资料
    • 访问:5574838次
    • 积分:72912
    • 等级:
    • 排名:第25名
    • 原创:1584篇
    • 转载:61篇
    • 译文:11篇
    • 评论:2082条
    文章存档
    最新评论