《编译原理》上课笔记

2015年03月30日
课本P24 P226 P259(左侧,7-1图)

1.外部声明 external-declaration
	external int a;
	int b;
	void f(){}

2.ucc\examples\sc\decl.c
课本P24
     Declaration   ----->    int Declarator
     Declarator   ----->   * Declarator  | PostfixDeclarator
				------------>D = {PD,*PD,**PD,***PD,.....}
     PostfixDeclarator ---> DirectDeclarator | PostfixDeclarator [num]
                          | PostfixDeclarator (ParameterList)
				------------>PD{DD,DD[num],DD(void),
						DD[num][num],DD(void)(void),
						DD[num](void),DD(void)[num],
						........
						}
     ParameterList --->  int |  ParameterList , int
     DirectDeclarator ----->  id  | (Declarator)

3.P226"类型表达式"
	int  --操作数
	【运算符】:*  --指针类型,[]  --数组类型,()  --函数类型

	3.1
	指针的数组:int *arr[4];          数组的指针:int(*ptr)[4];
	typedef int* INTPIR		  typedef int ARRAY[4]
	INTPIR arr[4];			  ARRAY[4] *prt;

4.P259
代码区
静态区	【编译时】(全局变量、static变量、常量)
堆区	【运行时】(new,malloc)
空闲内存【运行时】
栈区	【运行时】(局部,形参)

	4.1变参
	printf("%d",a);
	printf("%d %d",a,b);
				printf(const char*fmt, ...);

	4.2.13.png(C语言变量布局)
	匿名参数
	无名参数----->参数提升
	char,short->int
	float      ->double

Stmt.c

2015年03月16日
分析器的算法:(ucc/examples/sc/Expr.c)

1.PrimaryExpression -----> id | num | (Expression)

------PE--->-----
	 |	|
	 |	|
	 |     * /
	 |	|
	 ---PE<--
void PrimaryExpression (void){
	if(CurToken == ID)
		NEXT_TOKEN;
	else if((CurToken == NUM)
		NEXT_TOKEN;
	else if((CurToken == LP){
		NEXT_TOKEN;
		if((CurToken == RP)
			NEXT_TOKEN;
	}
	else
		error("( is missed.");

}

2."左结合"
MultiplicativeExpression -----> PrimaryExpression
MultiplicativeExpression -----> MultiplicativeExpression * PrimaryExpression
MultiplicativeExpression -----> MultiplicativeExpression / PrimaryExpression

void MultiplicativeExpression (void){
	PrimaryExpression ();
	while(CurToken == MUL | CurToken == DIV){
		NEXT_TOKEN;
		PrimaryExpression();
	}
}

3.E = {T,T+T,...}
	= T{e,+T,+T+T,...}
	-> T E‘
		E‘ -> e
		   -> +T E‘
void E‘(void){
	if(CurrentToken == +){
		NEXT_TOKEN;
		T();E‘();
	}else{
	}
}

4.“右结合”

ME-> PE  ME‘
ME‘->e(空)
   ->*|/ ME

void MultiplicativeExpression (void){
	PrimaryExpression ();
	if(CurToken == MUL | CurToken == DIV){
		NEXT_TOKEN;
		MultiplicativeExpression();
	}else{
	}
}

5.VisitArithmeticNode()
(a+b)*c

		t1
		*

	t0		c
	+
a		b

中间代码生成:
t0 = a+b;
t1 = t0+c;

6.int(*f(int,int,int))[4]

eg.int (*arr)[4]

typedef int ARRAY[4]
ARRAY *f(int,int,int)

Expr.c

2015年03月22日课本P241
1.S->if(B)S1

if(!B)goto label0;
	S1
label0:

2.if(B)S1 else S2

if(!B)goto label0;
	S1
	goto label1;
label0:S2
	goto label1;
label1:

3.while(B) S1
label0:
	if(!B)goto label1;
	S1
	goto label0;
label1:

4.实验课自己写do...while();语句   ?????

5.if语句
kids[0]->label0
kids[1]->label1
expr->expression
thenStmt->then语句
elseStmt->else语句
next
astStmtNode

课本P129
6.VisitStatementNode->if(c) a=f;else b=k;

kids[0]->label0
kids[1]->label1
expr->c
thenStmt->a=f;
elseStmt->b=k;

7.ExpressionStatement(void){
}				->		a=3+5;

kids[0]->a
expr->   +
       3   5

8.Compund语句
------    ------
|    |	->|    |
------	  ------..........
|next|--  |next|
FIRST(a)首符号的集合

9.linux系统下 make 的结果:
[email protected]:~$ cd src/ucc/examples/sc
[email protected]:~/src/ucc/examples/sc$ make
ucc -o sc lex.c expr.c error.c decl.c stmt.c main.c
cat demo.c
{
	int (*f(int,int,int))[4];
	int (*(*fp2)(int,int,int))(int);
	if(c)
		a = f;
	else{
		b = k;
	}

	while(c){
		while(d){
			if(e){
				d = d - 1;
			}
		}
		c = c - 1;
	}
}

./sc < demo.c
f is:  function(int,int,int) which returns pointer to array[4] of int
fp2 is:  pointer to function(int,int,int) which returns pointer to function(int) which returns int
	if(!c) goto Label_0
	a = f
	goto Label_1
Label_0:
	b = k
Label_1:
Label_2:
	if(!c) goto Label_6
Label_3:
	if(!d) goto Label_5
	if(!e) goto Label_4
	t0 = d - 1
	d = t0
Label_4:
	goto Label_3
Label_5:
	t1 = c - 1
	c = t1
	goto Label_2
Label_6:

  

时间: 2024-10-07 01:02:00

《编译原理》上课笔记的相关文章

编译原理学习笔记 -- 绪论1

1. 语言处理器 语言处理系统 _________ 经过预 _______ 源程序 --> |预处理器| --> 处理的 --> |编译器| --> 目标汇编程序 -------- 源程序 ------- _______ 可重定位的 ______________ --> |汇编器| --> 机器代码 --> |链接器/加载器| --> 目标机器代码 ------- -------------- ↑ 库文件/可重定位对象文件 预处理器:把源程序聚合在一起,并宏

编译原理学习笔记(十一)错误处理

错误处理 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 1. 目标:编译程序对于语法和语义正确的源程序要正确地编译生成等价的目标代码:而对于错误的源程序不能一发现就停止,而是要能检查出错误的性质和出错位置,并使编译能继续下去,同时尽可能多而准确地发现错误和指出各种错误. 2. 编译器的错误处理能力 诊察各类错误的能力. 报错及时准确(出错位置,错误性质). 一次编译找出错误的多少. 改正错误的能力. 遏制重复错误信息的能力. 3. 错误分类:语法错误.语义错误. 语法错误

编译原理学习

编译原理学习笔记---- 不确定有穷自动机(NFA) 一个不确定的有穷自动机T是一个五元组,M={K,∑,f,S,Z} ⒈K是一个有穷集他的每一个元素称作一个状态. ⒉∑是一个字母表,他的每一个元素称为一个输入符号. ⒊f是一个从Kx∑*到K的子集映射即K*∑*->2^K,其中2^K表示K的幂集. ⒋S包含于K集,是一个非空初态集合. ⒌Z包含于K是一个非空的终态集合. 确定有穷自动机(DFA) 一个确定的有穷自动机M是一个五元组:M=(K, ∑,f,S,Z)其中, 1)K是一个有穷集,他的每个

了解编译原理-笔记小结

这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译的过程. 等以后领悟更多了再作补充吧. 希望各路人士能多加指点,谢谢. 词法分析 作用:将输入转换为一个一个的token,而其用一串整数来表示. 协作:只有当解析器需要的时候才会请求词法分析器,继续扫描输入流,在这个过程中将不断生成符号表. 实现:在通常的编程语言中,相对于不确定的有限自动机(NFA

【学习笔记】编译原理-有限自己主动机

一.定义: 不确定的有限自己主动机(NFA): 一种数学模型 (1) 一个有限的状态集合S (2) 一个输入符号集合∑(不包括ε) (3) 一个转换函数move: S X (∑ U {ε}) -> P(S) (4) 状态s0是唯一的開始状态 (5) 状态集合F是接受状态集合,S包括F 确定的有限自己主动机(DFA): 是NFA的特殊情况 (1) 不论什么状态都没有ε转换 (2) 对于不论什么状态s和不论什么输入符号a,最多仅仅有一条标记为a的边离开,即转换函数move: S X ∑-> S能够

《东南大学 编译原理 64讲》 学习笔记

简介: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 编译:就是将程序语言进行翻译,生成可供用户直接执行的二进制代码,即可执行文件. 全部内容大致如课程目录所示. 本视频的配套教程可以使

【学习笔记】编译原理-有限自动机

一.定义: 不确定的有限自动机(NFA): 一种数学模型 (1) 一个有限的状态集合S (2) 一个输入符号集合∑(不包含ε) (3) 一个转换函数move: S X (∑ U {ε}) -> P(S) (4) 状态s0是唯一的开始状态 (5) 状态集合F是接受状态集合,S包含F 确定的有限自动机(DFA): 是NFA的特殊情况 (1) 任何状态都没有ε转换 (2) 对于任何状态s和任何输入符号a,最多只有一条标记为a的边离开,即转换函数move: S X ∑-> S可以是一个部分函数. 二.

关于计算机编译原理

从我个人理解,计算机编译原理,顾名思义,就是关于计算机编程翻译的相关原理,即对计算机编程的,更为深入.更为详细的去解读计算机语言.上网看了许多个人解读编译原理,发现最令我信服的,就是把编译原理类比成人体解剖:只有认真解剖.研究人体各部位,才能在手术中.医治中做到更好的处理.因此,唯有理解编译原理,才能更好地进行计算机的编程等一系列的操作. 博客上有人说到,学习编译原理能够更加容易理解算法之间的关系.能培育自己的观点.提高学习语言的效率.但在我个人看来,学好编译原理,能让我们有一个更强的临时变换的

实况:《编译原理》期末考试一天复习

大学的编译原理课程是讲解如何设计编译器的.我要做的,是在一学期没怎么听课的条件下,用我对算法的理解能力,和互联网以及身边同学的帮助,来在不足一天的时间中复习完考试所需的所有知识. 我手上有两份可用资料: 复习课上记录的,老师对考试知识点的回顾. 同学总结的,会考的算法的列表. 而现在的时间是晚上6:33,我刚刚看完大约四分之一,明天下午1:10就考试了.由于时间紧迫,我必须对自己的任务有个计划,不能浪费一点时间.这个计划会花去我大概半个小时的时间,但它是一定要做的,否则我一定复习不完. 考试涉及

编译原理123

1.编译原理就是什么? 个人理解,编译就是像翻译一样,将一种语言翻译成另一种语言,编译就是将高级语言或汇编语言翻译成电脑能识别的二进制机器语言,编译原理就是讲解这 个编译的过程.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有 利于提高软件人员的素质和能力. 2.学习编译原理有什么好处? 学习编译原