编译原理概念复习

前端后端

目的:增加可移植性

前端

· 与源语言有关、与目标机无关的部分
· 词法分析、语法分析、语义分析与中间代码生成、与机器无关的代码优化,出错处理,符号管理

后端

· 与目标机有关的部分
· 与机器有关的代码优化、目标代码生成

素短语

是一个短语,至少包含一个终结符, 除自身外不再包括其他含终结符的短语(至少包含一个终结符的最小短语)

短语

一棵子树的所有叶子自左至右排列起来 形成一个相对于子树根的短语。

直接短语

仅需要一步推导的句型相对于其父节点是直接短语。

句柄:

一个句型的最左直接短语称为该句型的句柄。(树最左边的一个直接短语)

C语言的活动记录格式

活动记录,就是在程序执行的过程中函数调用时栈上的内容变化。一个函数被调用,反映在栈上的与之相关的内容被称为一帧,其中包含了参数、返回地址、老ebp值、局部变量以及esp和ebp。

C语言默认的调用规约为cdecl,参数从右往左依次入栈,之后是函数的返回地址入栈,接着是老ebp入栈。

在这里插入图片描述
指针sp指向现行过程的活动记录在栈中的起始位置,top指向栈顶对任何局部变量X的引用可表示为变址访问: dx[SP]
dx:变量X相对于活动记录起点的地址,在编译时可确定
连接数据: 返回地址;
动态链:指向调用者的活动记录;
静态链:访问存放在其他活动记录中的非局部数据:
形式单元:存放相应的实在参数的地址或值;
局部数据区:局部变量、内情向量、临时工作单元(如存放对表达式求值的结果)。
在这里插入图片描述

代码优化方法

公共子表达式的删除;复制传播;无用代码的删除;代码外提;强度削弱和归纳变量删除。

S-属性

分析树结点N上的非终结符号A的属性值由N的产生式所关联的语义规则来定义

L-属性

分析树结点N的属性值由N的父结点所关联的语义规则来定义。

解释器和编译器有什么区别?

解释器:边解释边执行:不断读取源程序的语句,解释语句,读取此语句需要的数据,根据执行结果读取下一条语句,继续解释执行,直到返回结果,类似于自然语言翻译的同声传译

编译器:将源程序完整地转换成机器语言程序或汇编语言程序,然后再处理、执行的翻译程序,高级语言程序→汇编/机器语言程序,类似于自然语言翻译的通篇笔译

词法分析的主要任务是什么?为什么要使用token二元组表示词法分析的结果?

把构成源程序的字符串转换成单词符号的序列,去除无意义的空格和注释等。
但如果只把切分出来的单词符号本身作为输出,是不够的。一个单词符号至少要包含两个方面的信息:单词的类别(词类)、单词的属性值,因此用二元式来表示单词符号。

什么是语法制导定义, 什么是语法制导的翻译方案?二者之间有什么关系?

语法制导定义(SDD)是上下文无关文法和属性以及规则的结合,属性与文法符号相关联,规则和产生式相关联。根据需要,将文法符号和某些属性相关联,并通过语义规则来描述如何计算属性的值。
语法制导的翻译方案(SDT):在产生式体中嵌入程序片断(语义动作)的上下文无关文法

S属性的SDD

◼ 每个属性都是综合属性
◼ 都是根据子构造的属性计算整个构造的属性。
◼ 在依赖图中,总是通过子结点的属性值来计算父结点的属性值。可以和自顶向下、自底
向上的语法分析过程一起计算
◼ 自底向上:在构造分析树的子结点的同时计算相关的属性
◼ 自顶向下:递归子程序法中,在过程A()的最后计算A的属性

L属性的SDD

◼ 每个属性要么是综合属性,要么是继承属性,且产生式A→X1X2…Xn中计算Xi.a的规则只能使用
· A的继承属性
· Xi左边的文法符号Xj的继承属性或综合属性。
· Xi自身的继承或综合属性。且这些属性的依赖关系不形成环。
特点:
◼ 依赖图的边总是从左到右,从下到上。
◼ 在扫描过程中,计算一个属性值时相关的依赖
属性都已经计算完成了。

符号表在编译程序各个阶段的作用是什么?

符号表是一张表格,由编译程序建立,存在于内存或磁盘中,用于存储程序编译或运行过程中所使用的变量(标识符)和常量(数字常数、字符常数)等信息。

词法分析阶段:建立符号表,查填符号表,将不重复的标识符、数字常数和字符常数的性质填入符号表中,如:名字、类型、数值等,并且将变量(或常数)在符号表中的入口地址写到其自身的TOKEN字中。

语法分析阶段:主要是使用符号表。在分析过程中,需要用到某个标识符(或常数))时,就从符号表的指定入口处查找出该符号。

语义分析及中间代码生成阶段:主要是查填符号表。在生成四元式时,通常不使用变量的名字,而是使用它们在符号表中的入口位置。另外,在翻译说明语句时,要向符号表中填入变量的类型信息等。

数据存储分配:将变量(或常数)所使用的数据区映像地址写入符号表中的地址(ADDR)栏。若数据区是动态数据,则在符号表中存储过程层号和位移量等信息,待运行时再计算具体地址。

代码优化阶段:使用符号表。一方面,遇到变量时,要到符号表中查找它的具体信息,另一方面,在优化过程中,也有可能要使用符号表,例如在进行合并已知量的优化时,要检查变量是否有常数值,这时要使用符号表的数值(VAL)栏进行判断。

目标代码生成阶段:在此过程中主要是查找符号表,为最终生成目标代码提供必要的信息,如建立DAG节点标记时使用符号表暂存变量的引用活跃信息。

自顶向下翻译的思想是什么?FIRST集和FOLLOW集的作用?

寻找输入符号串的最左推导,再试图根据当前输入单词判断使用哪个产生式。

什么是受控的副作用?举两个语法制导定义中的受控副作用的例子并说明他们的作用

在翻译过程中多余的动作,并且对语法翻译没有产生影响的动作。

指出quicksort的访问链。在图中画出来(PPT中的四条线)。

在这里插入图片描述
访问链被用于访问非局部的数据。
如果过程p在声明时嵌套在过程q的声明中,那么p的活动记录中的访问链指向上层的q的活动记录
从栈顶活动记录开始,访问链形成了一个链路,嵌套深度逐一递减。
在这里插入图片描述

s
	r
	e
	q
		p

显示表:
d1指向深度为1的最近一次的活动(s),d2指向深度为2的最近一次的活动(q(1,9)然后q(1,3)然后e(1,3)),d3指向深度为3的最近一次的活动(p(1,3));同深度之间后一次要指向前一次
在这里插入图片描述

词法分析 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验说明 1、 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2、 单词的BNF示 -> ->|| |ε -> -> |ε -> + -> - -> > -> >= 三、实验要求 (一)准备: 1.阅读课本有关章节,明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。 2.初步编制好程序。 3.准备好多组测试数据。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。 第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如下: (2,”main”) (5,”(“) (5,”)“) (5,”{“) (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 要求: 识别保留字:if、int、for、while、do、return、break、continue; 单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、); 单词种别码为5。 以上为参考,具体可自行增删。 (四)程序思路 这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部示,并查填适当的信息。经过词法分析后,源程序字符串(源程序的外部示)被翻译成具有等长信息的单词串(源程序的内部示),并产生两个格:常数和标识符,它们分别包含了源程序中的所有常数和所有标识符。 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白(可选,看着办)。 4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值