E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
lcc
LCC
编译器的源程序分析(40)赋值表达式树
前面分析了表达式的语法,也分析了语句的语法,但它们最终的目的就是生成合适的中间表示,在
LCC
里是采用树作为中间表示的。
caimouse
·
2007-06-18 22:00
tree
null
存储
编译器
LCC
编译器的源程序分析(39)goto语句
goto语句为无条件跳转语句,它的一般形式为: goto标号;在
LCC
里的是用下面的代码来处理:#001 caseGOTO: #002 walk(NULL,0,0);#003
caimouse
·
2007-06-17 11:00
null
token
编译器
branch
LCC
编译器的源程序分析(38)return语句
下面来分析
LCC
里的代码:#001 caseRETURN: #002 {#003 Typerty
caimouse
·
2007-06-16 20:00
c
null
编译器
branch
LCC
编译器的源程序分析(37)default语句
在
LCC
里是如下处理的: #001 caseDEFAULT: #002 if(swp==NULL)#003 error("illegaldefaultlabel/
caimouse
·
2007-06-15 21:00
LCC
编译器的源程序分析(36)case语句
LCC
处理这个语句的代码如下:#001 caseCASE: #002 {#003 intlab=genlabel(1);#004 if
caimouse
·
2007-06-14 21:00
LCC
编译器的源程序分析(35)switch语句
: 语句1; case常量表达式2: 语句2; … case常量表达式n: 语句n; default: 语句n+1}上面就是switch的语法和语义,现在来分析
LCC
caimouse
·
2007-06-13 19:00
struct
tree
null
编译器
branch
LCC
编译器的源程序分析(34)continue语句
比如下面的例子: while(表达式1) { … if(表达式2) continue; … }下面就来仔细地分析
LCC
里处理continue语句的源程序:#001 caseCONTINUE
caimouse
·
2007-06-12 21:00
null
编译器
branch
LCC
编译器的源程序分析(33)break语句
break语句可以使用流程跳出switch语句的分支选择,当然它还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。但它不能用于循环语句和switch语句之外的其它语句中。比如下面的例子:for(;;){ if(a++>100) break;} 现在就来分析一下面处理break的代码:#001 caseBREAK: #002 walk(NULL,0,
caimouse
·
2007-06-11 21:00
null
编译器
branch
LCC
编译器的源程序分析(32)for循环语句
C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。因此,这个语句的使用频率是最高的,当然它的处理情况比上面两种循环要复杂一些。它的形式如下: for(表达式1;表达式2;表达式3) 语句1它的执行过程是先求解表达式1的值,然后再计算表达式2的值。如果其值为真,就执行语句1,然后再执行表达式3。如果其值为假,就直接
caimouse
·
2007-06-10 14:00
LCC
编译器的源程序分析(31)do while循环语句
do—while语句是实现“直到型”循环结构。一般形式如下:do{ 语句1}while(表达式) 上面的语句是这样的执行的,先执行一次语句1,然后判断表达式的值,如果表达式的值为真,也就是非零时,返回重新执行语句1,如此反复,直到表达式的值等于0为止。这个表达式与前面一个while语句的区别,就是表达式值的判断和语句1执行先后的问题。前面while语句先判断后执行语句1,而do—while语句是先
caimouse
·
2007-06-09 23:00
LCC
编译器的源程序分析(30)while循环语句
LCC
是通过下面的代码来处理这个语句的:#015 caseWHILE: #016 whilestmt(genlabel(3),swp,lev+1);#017 break
caimouse
·
2007-06-08 22:00
LCC
编译器的源程序分析(29)if条件语句
if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3else语句4那么
LCC
又是怎么样处理if语句的呢?
LCC
在函数state
caimouse
·
2007-06-07 21:00
null
编译器
branch
LCC
编译器的源程序分析(28)函数表达式语句
前面已经介绍了很多表达式,但还没有介绍函数表达式语句,那么在
LCC
里是怎么样处理函数调用,也就是函数表达式的呢?
caimouse
·
2007-06-06 21:00
LCC
编译器的源程序分析(27)基本语句
由前面的例子可以知道,C函数里包含数据定义部分和执行部分,执行部分就是由语句组成。计算机最基本的动作就是具备条件判断,这也是计算机具有这么大魔力的原因。而这些条件判断是通过语句来实现的。基本的语句有下面几种:1. 控制语句:if elsefor whiledowhilecontinuebreakswitchgotoreturn2. 函数调用语句max(a,b);3. 表达式语句n
caimouse
·
2007-06-05 21:00
LCC
编译器的源程序分析(26)逗号表达式
逗号表达式是优先级最低的表达式。像下面的例子:1+2,2+3;a=(a,b,c);还有在for语句中的使用:for(inta=3,b=4;atype,root(value(p)),q);#013 }#014 #015 if(tok) #016 test(tok,stop);#017 #018 returnp;#019 }在第3行里是定义了出错时找到下一个恢复错误的符号。第5行
caimouse
·
2007-06-04 21:00
LCC
编译器的源程序分析(25)赋值表达式
变量 赋值运算符表达式上面就是赋值表达式的组成,如下面的例子:x=y=2+8;这样的赋值表达式在
LCC
里是通过函数expr1来实现的。
caimouse
·
2007-06-03 18:00
c
tree
语言
编译器
LCC
编译器的源程序分析(24)条件表达式
a:b;下面就来看
LCC
是怎么样处理条件表达式的,它的代码如下: #001 staticTreeexpr2(void)#002 {#003 Treep=expr3(4);#004 第3行里
caimouse
·
2007-06-03 18:00
LCC
编译器的源程序分析(23)一元运算表达式
在
LCC
里处理一元运算表达式的代码如下:#001 staticTreeunary(void)#002 {#003 Treep;#004 #005 switch(t)#006 {#007 case
caimouse
·
2007-06-03 18:00
LCC
编译器的源程序分析(22)基本表达式
这次就带你去分析一下
LCC
编译器处理表达式的代码。比如在例子里:intnTest1=1;intnTest2=2;赋值语句的右边是一个表达式,这个表达式可以简单的也可以复杂的。
caimouse
·
2007-06-02 20:00
LCC
编译器的源程序分析(21)局部变量的声明
局部变量的处理是比较特别,它是复杂语句里面声明,作用域也只限于复合语句里。如下面的例子:{ inta=2;}上面的a就是局部变量的声明。现在再来仔细地分析compound里处理局部变量的代码。如下:#031 //局部变量声明处理.#032 while( kind[t]==CHAR||kind[t]==STATIC#033 ||istypename(t,tsym)&&g
caimouse
·
2007-06-02 20:00
tree
null
存储
Class
编译器
initialization
LCC
编译器的源程序分析(20)复合语句
它是由{}把一些语句括起来的,如下面的例子:{ y=x+1; z=y+2;}在
LCC
里处理这样的复合语句的函数是compound,它在上面函数定义函数funcdefn是这样调用的:#150 labels
caimouse
·
2007-06-01 00:00
struct
汇编
table
null
编译器
Types
LCC
编译器的源程序分析(19)全局函数的定义
函数定义funcdefn处理里,已经准备好调用参数和参数返回,接着就是调用全局函数声明来处理。如下面的代码:#132 //声明函数。#133 cfunc=dclglobal(sclass,id,ty,&pt);#134 上面的代码是处理函数全局定义。现在就去就分析dclglobal函数的实现,它主要用来分析全局函数的。它的代码如下:#001 //全局函数声明。#002 staticSymbol
caimouse
·
2007-05-30 22:00
null
存储
Class
编译器
initialization
LCC
编译器的源程序分析(18)函数定义
激动人心的时刻就要开始了,从这节开始,就进入处理实际的代码了。由于C语言是函数式的语言,也就是每个程序都是有一个一个的函数组成的,一个C源程序至少包含一个函数(main函数),也可以包含一个main函数和若干个其它函数。因此,函数是C程序的基本单位。仔细地查看一下第一节里的例子代码,它是如下:#001 #include#002 #003 intmain(void)#004 {#005 intn
caimouse
·
2007-05-29 23:00
function
prototype
null
Parameters
compiler
编译器
LCC
编译器的源程序分析(17)参数变量的声明
函数里的参数变量个数不固定,因此也需要检查这些参数的名称是否相同,还需要检查类型的合法性。现在就来分析上次提到的函数dclparam,它的代码如下:#001 //参数类型声明处理#002 staticSymboldclparam(intsclass,char*id,Typety,Coordinate*pos)#003 {#004 Symbolp;#005 #006 if(isfunc(ty)
caimouse
·
2007-05-28 22:00
c
存储
Class
编译器
initialization
LCC
编译器的源程序分析(16)函数的声明
因此就需要了解什么是函数的声明,在
LCC
里又是怎么样处理函数的声明的。在hello.i文件里,有下面一句的函数声明:intprintf(constchar*,...)
caimouse
·
2007-05-27 18:00
LCC
编译器的源程序分析(15)结构类型成员的声明
上次只介绍到开始分析结构类型的定义开始部分,接着就要去分析它的成员类型定义了。它调用函数来处理结构的成员,如下代码:#001 staticvoidfields(Typety)#002 {#003 {#004 intn=0;#005 while(istypename(t,tsym))#006 {#007 staticcharsto
caimouse
·
2007-05-26 20:00
struct
汇编
null
编译器
LCC
编译器的源程序分析(15)结构类型成员的声明
上次只介绍到开始分析结构类型的定义开始部分,接着就要去分析它的成员类型定义了。它调用函数来处理结构的成员,如下代码:#001staticvoidfields(Typety)#002{#003{#004intn=0;#005while(istypename(t,tsym))#006{#007staticcharstop[]={IF,CHAR,'}',0};#008#009Typety1=specif
anjichan4261
·
2007-05-26 20:00
后端
数据结构与算法
LCC
编译器的源程序分析(14)结构类型的声明
以前都是简单类型的识别和语法分析,现在来分析结构的声明,它是比较复杂的一种数据类型,但结构在编写程序中使用是非常多的。由于程序的方程式就是:数据结构+算法=程序现在面向对象的方程式是:数据结构+算法=对象对象+对象=程序由上面的公式,就可以看出程序中的数据结构是非常重要的,无论是面向对象的编程,还是面向过程的编程,有什么样的数据结构,就需要有什么样算法。而在C语言里,使用结构类型来描述现实中需要的
caimouse
·
2007-05-25 21:00
数据结构
编程
算法
struct
File
编译器
LCC
编译器的源程序分析(14)结构类型的声明
以前都是简单类型的识别和语法分析,现在来分析结构的声明,它是比较复杂的一种数据类型,但结构在编写程序中使用是非常多的。由于程序的方程式就是:数据结构+算法=程序现在面向对象的方程式是:数据结构+算法=对象对象+对象=程序由上面的公式,就可以看出程序中的数据结构是非常重要的,无论是面向对象的编程,还是面向过程的编程,有什么样的数据结构,就需要有什么样算法。而在C语言里,使用结构类型来描述现实中需要的
anjichan4261
·
2007-05-25 21:00
数据结构与算法
c/c++
LCC
编译器的源程序分析(13)指针类型的声明
下面就来看例子里的指针语句,如下:typedefchar*va_list;上面这句声明了va_list为char的指针类型的别名,那么在
LCC
里又是怎么样处理它的呢?先识别typedef出
caimouse
·
2007-05-23 22:00
LCC
编译器的源程序分析(12)自定义类型的声明
语法分析是比较复杂的处理,下面再来分析一个例子,它的代码如下:typedefunsignedshortwchar_t;typedefwchar_twint_t;第一句语句在
LCC
里的处理,前面已经解释清楚
caimouse
·
2007-05-22 22:00
c
null
存储
token
编译器
LCC
编译器的源程序分析(11)声明与符号表
前一次已经分析了声明的函数,但还有一个声明函数没有分析的,它就是dclr函数,这个函数是大内总管,分别调用前面两个声明函数来处理所有的声明语句,接着又会保存声明的ID和属性到符号表,当然它需要调用处理函数定义的函数,接着在那里把函数生成汇编代码并写到输出文件里。现在就来看代码:#001 staticvoiddecl(Symbol(*dcl)(int,char*,Type,Coordinate*))
caimouse
·
2007-05-21 22:00
c
汇编
测试
null
存储
编译器
LCC
编译器的源程序分析(10)声明类型
上一次把声明的说明符已经分析得很清楚,也就是把C的变量和函数声明都已经了解了。最后还剩下一个问题没有解决,这个问题就是声明后面的ID是变量呢?还是函数?或者是指针?为了识别后面的ID,下面来看一个例子。如下的语句:typedefunsignedintsize_t;这是第一行处理的代码,它通过函数specifier处理后,已经就把typedef、unsigned、int处理完成,还剩下size_t没
caimouse
·
2007-05-20 13:00
function
null
扩展
Parameters
token
编译器
LCC
编译器的源程序分析(9)声明分析
在语法分析里,最主要的组成部份是声明分析,并且这是C语言编译器最复杂的组成部分。由于任何变量都需要声明,那么怎么样知道这个变量声明是合法的呢?现在带着这个问题去分下面的代码。为了理解代码的工作,先来看前面的例子里的第一行有效代码:typedefunsignedintsize_t;在这句语句里,使用类型定义关键字来声明了一个无符号整数的类型size_t,为了识别这句语句的语法,那么最开始的是类型关
caimouse
·
2007-05-19 23:00
优化
struct
null
存储
语言
编译器
LCC
编译器的源程序分析(8)语法分析的开始
下面就来仔细地分析
LCC
编译器是怎么样处理这两个问题的。#001 t=gettok();#002 #003 //调用后端代码生成初始化工作。
caimouse
·
2007-05-18 23:00
LCC
编译器的源程序分析(7)词法分析
下面开始关键字、ID等识别,采用这种词法分析,是最高效的,由于在识别的过程里,就已经区分它是什么关键字,而不像其它的词法分析程序,需要查找才能决定是否是关键字。#074 case'i':#075 if(rcp[0]=='f'#076 &&!(map[rcp[1]]&(DIGIT|LETTER))){#077
caimouse
·
2007-05-17 22:00
c
struct
token
character
float
编译器
LCC
编译器的源程序分析(6)词法分析
在最开始的例子程序里,程序是由一些单词和符号组成的。其实程序就是一串长长的字符串,这些字符串是按一定的规则编写的,那么就需要检查这些单词和符号是否符合定义的规则。在C语言里,就是定义了C语法和语义。在最开始的例子里,C编译器最先进行词法分析的语句是下面这句:typedefunsignedintsize_t;那么C编译器是怎么样把上面的字符串识别出来的呢?其实词法分析就是把上面的字符串识别为下面的单
caimouse
·
2007-05-16 22:00
c
File
null
语言
编译器
newline
LCC
编译器的源程序分析(5)行号同步与类型初始化
上面已经介绍打开文件输入,并且分析了读取到缓冲区里的代码,接着下来就是分析行号同步的处理,还有类型初始化。 先来看看生成中间文件hello.i中的源程序,在它的第1行和第2行如下:#001 #line1"hello.c"#002 #line1"include/stdio.h"#003 #004 #005 #006 #007 typedefunsignedintsize_t; 这样的源程序是怎么样被
caimouse
·
2007-05-15 23:00
LCC
编译器的源程序分析(4)处理文件参数
上面已经介绍选择不同的目标输出的参数处理,那么接着下来,自然的事情就是处理剩下的两个参数的问题,当然
LCC
是可以处理更多其它参数的,但这里只介绍两个文件参数的处理。
caimouse
·
2007-05-14 22:00
c
File
null
buffer
input
编译器
LCC
编译器的源程序分析(3)选择不同的目标代码接口
在
LCC
里,最重要的一个特征是可以输出不同的目标代码。比如同一个C程序,可以生成MIPS,X86等汇编代码,只需要选择不同的目标参数。
caimouse
·
2007-05-13 21:00
汇编
struct
interface
编译器
binding
X86
LCC
编译器的源程序分析(2)
LCC
编译器的预处理
在
LCC
里预处理主要是把所有包含的头文件和源程序生成一个中间文件,并且把所有宏展开,替换为真实的值。
caimouse
·
2007-05-12 21:00
Date
list
struct
File
任务
编译器
LCC
编译器的源程序分析(1)C编译器的目标
先从简单的目标来分析这个大规模的C编译器,毕竟它的功能比较复杂,并且源程序的行数也是非常多的。因此,把简单的目标定出来,然后再分析它,这样才会有的放矢。接着再跟着编译运行的主线来分析它的源程序。下面先看一下简单的C例子,如下: #001 #include#002 #003 intmain(void)#004 {#005 intnTest1=1;#006 intnTest2=2;#007 in
caimouse
·
2007-05-07 20:00
c
Date
工作
汇编
任务
编译器
LCC
-Win32的使用!
LCC
-Win32的使用!
LCC
-Win32介绍
LCC
-Win32原来是一个免费的开放源代码WIN32编译器,包含一个很好用的IDE,用起来很爽,但是最近源码开始要付费的了(40美圆)。
nomad2
·
2007-03-05 19:00
windows
工作
application
compiler
编译器
wizard
关于
lcc
以及
lcc
-win32的一些链接
1.关于
lcc
,googleit:(1)
lcc
,ARetargetableCompilerforANSIChttp://www.cs.princeton.edu/software/
lcc
/(2)《可变目标
nomad2
·
2007-03-01 14:00
Windows XP 正版验证工具
WindowsXP正版验证工具http://www.cppblog.com/Files/shaker/
LCC
_DLL.rar
To Be C++
·
2006-10-11 19:00
《c语言接口与实现》读后感
这本书是
lcc
的作者写的,其源码可以在国外的网站下载到,china-pub有链接。 书中对atom,list,sta
dawndu
·
2006-04-13 21:00
数据结构
C++
c
exception
lua
语言
几款windows下的C的编译器
lcc
-win32http://www.cs.virginia.edu/~
lcc
-win32/MyTChttp://download.zol.com.cn/detail/4/30278.shtmlMiracleCCompilerhttp
manio
·
2006-01-16 19:00
LCC
-Win32小指南
LCC
-Win32小指南
LCC
-Win32小指南ByDanielGuerreroMiralles翻译:pigprince声明 本文没有任何明确的或者含蓄的表达说明本文是完全正确的,对于应用本文内容所产生的任何结果
天空是蓝色的
·
2005-11-30 10:00
神奇的xx宏
转载时请注明出处和作者联系方式作者联系方式:李先静前段时间研究
lcc
,看见token.h里有这样一些代码:xx(FLOAT, 1,0, 0, 0, CHAR, "float")xx(
absurd
·
2005-08-27 19:00
list
tree
null
Class
token
float
开始看
lcc
编译器的实现。---跟.net暂时扯不上关系。
用同事的china-pub账号买了这本书 http://www.china-pub.com/computers/common/info.asp?id=22711,决定春节在老婆家好好看看一个能实际商业化使用的c编译器到底该怎么实现。 前年就一直为买不到这本书耿耿于怀,而没有能自己实现一个c编译器成为我心中解不开的结,现在总算有机会让我实现愿望了。虽说已经换了工作,研究编译器不再必要了,可毕
·
2005-02-05 16:00
.net
上一页
3
4
5
6
7
8
9
10
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他