Skip to content

编译原理

更新: 2021-06-30 20:19:57

课程主要参考:哈工大 编译原理 陈鄞

https://blog.csdn.net/Johan_Joe_King/article/details/79051993https://blog.csdn.net/Johan_Joe_King/article/details/79058597?spm=1001.2014.3001.5501

关于展望符:https://www.cnblogs.com/xpwi/p/11070888.html

短语相关:

https://blog.csdn.net/qq_40147863/article/details/93236597

https://blog.csdn.net/starter_____/article/details/88601595

写实验:

手把手写C:https://lotabout.me/2016/write-a-C-interpreter-8/

语法分析:https://blog.csdn.net/qq_38247544/article/details/84582654

https://www.cnblogs.com/bluemo/p/13937473.html

目标代码生成:https://blog.csdn.net/qq_38247544/article/details/85076074

解释执行:https://blog.csdn.net/qq_38247544/article/details/85223084

晗哥网站:https://jcf94.com/2016/02/21/2016-02-21-pl0/

一、按照知识点/题型

1. 求First集、Follow集

求解规则

另一种表达

(1)对文法的开始符号 S,置‘#’于FOLOOW(S)中;

(2)若A→αBb 是一个规则,则把FIRST(b)-{ε}加到FOLLOW(B)中;

(3)若A→αB 是一个规则,或A→αBb 是一个规则,而 b=>ε,即ε∈FIRST(b),则把FOLLOW(A)加至FOLLOW(B)中。

原来的式子中 虽然是αBβ, 但是β可能为ε的情况,式子会变为αB,这时运用第三条规则。

2. 简答题/概念题

(1) 编译程序分哪几个主要部分?各部分的主要功能是什么?

词法分析器,又称扫描器,输入源程序,进行语法分析,输出单词符号。

语法分析器

语法分析器,简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出各类

语法单位,最终判断输入串是否构成语法上正确的「程序」。

语义分析与中间代码产生器

语义分析与中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分

析,并把它们翻译成一定形式的中间代码。有的编译程序在识别语法单位后,会构造并输出一棵表示语

法结构的语法树,然后根据语法树进行语义分析和中间代码的产生。有的直接调用语义子程序,所以上

述三者可能是互相穿插的。

优化器

对中间代码进行优化处理

目标代码生成器

把中间代码翻译成目标程序

表格管理

在编译程序的工作过程中的一系列表格,用来登记源程序的各类信息和编译各阶段的进展状况。最重要

的是符号表,用来登记源程序中出现的每个名字以及名字的各种属性。

出错处理

出错处理程序:对出现在源程序中的错误进行处理,如果有错误应该设法发现错误,并且把有关错误信

息报告给用户。源程序中错误通常分为:语法错误和语义错误两大类。

(2) 描述LR语法分析算法。

(3) 解释语法制导翻译。

(4) L(G)={an bn︱n≥1},试求上下文无关文法G。

(5) C语言活动记录的结构是怎样的?

从下往上:返回地址、动态链、静态链、形式单元、局部变量、内情变量、临时单元

SP TOP

(6) 语法分析有哪些方法,特点是什么

自上而下 LL(1)

自下而上 LR(0) SLR LR(1) LALR

(7) 属性文法是什么,L属性文法和S属性文法?

S属性文法:只有综合属性,适合自下而上,从自己或者儿子传过来,可以一遍过

L属性文法:综合属性 + 继承属性,适合自上而下,从自己或者父亲或者左边好兄弟传过来,可以一遍过

(8) 画出程序设计总框图

1625002920245-9b4f014f-0503-4053-add4-901d247cde88.png

(10) 写三元式、四元式、间接三元式、后缀式

(11) 短语的概念,算符优先文法

短语 定义: 若 S 为文法 G 的开始符号,αβδ 是该文法的一个句型,即 S ⇒* αβδ,且有 A ⇒+ β,则称 β 是句型 αβδ 相对于非终结符 A 的短语。语法树: 在语法树中表示所有分支结点对应子树,短语即子树叶子对应的符号。注: 子树包括语法树本身,及句型本身也可以称为短语。直接短语 定义: 若 S ⇒* αβδ,且文法中包含产生式 A → β,则称 β 是句型 αβδ 相对于非终结符 A 的直接短语。语法树: 在语法树中表示为该短语只有上下相邻父子两代

句柄 “可规约串”,句柄对应某个产生式的右部,是某个,但不是任意一个。作为一种规约对象,句柄表示最左直接短语。语法树: 在语法树上,则表示为最左边的只包含相邻父子节点的短语(最左直接短语)

素短语 定义: 是指一个短语至少包含一个终结符,并且除它自身之外不再包含其他素短语

最左素短语 定义: 最左素短语就是句型最左边的素短语,是算符优先分析法的规约对象。语法树: 通过语法树分析时,要注意先判断是否为素短语,再找相对最左端的素短语。

1.写出编译的各个流程以及各部分的作用

3.什么是display表,它的作用是什么

4.LR的原理是什么

5.写出活跃变量的数据流方程并说出它的作用

中间代码优化有哪几种

局部优化

基本块

循环优化

代码外提

强度削弱

删除归纳变量

符号表的作用

说出传地址和传质这两种参数传递方式的异同

回填思想

有哪些存储分配策略?

1625003378641-c9660f2c-2b31-4eb8-8252-037602e20b76.png
1625009728648-1f2b33b5-5bfd-40db-bd27-bbe7dde7532f.png
1625009755123-64eb1bb2-661b-42f2-8a31-04189fa4cd99.jpeg
1625009777239-f14017e4-4c41-4973-bd13-132c6428acdc.jpeg

3. 已知正规式,求NFA,并且确定化最小化(必考)√

4. 证明文法消除左递归后是LL(1) √, LR(1),SLR文法、画出分析__表(必考)

证明二义性、写出LR分析表(必考) √

编译原理LR(0)项目集规范族

https://blog.csdn.net/Johan_Joe_King/article/details/79051993

https://blog.csdn.net/Johan_Joe_King/article/details/79058597?spm=1001.2014.3001.5501

5. 语法制导翻译,三地址、四地址码序列(必考)

6. 构造DAG,写中间代码(必考) √

短语、直接短语、句柄、素短语、最左素短语

https://blog.csdn.net/starter_____/article/details/88601595


二、按照讲课顺序

1 概述

1.1 源程序转换为目标代码的过程

1623847945427-9ffeeada-d981-4bab-a90b-c91fa3b9b622.png

1.2 编辑器的结构

1623848590243-9902eb7a-c097-411f-8058-e152e46107b3.png

1.3 token的类型与划分

1623848905868-9cbe48d7-0b6a-41cb-b82a-9cd5494a4c62.png

2 语言与文法的基本概念

2.1 词法分析、语法分析基本概念

正闭包、克林闭包

后者就是前者加上一个epsilon

1623849901233-10d9af30-c10b-41ac-8ac5-fc29fb64b6b1.png
1623849934935-2c649c7c-990e-4737-b54a-071103a93d95.png
1623850009015-1ae95ab9-284c-450c-b0f7-a3026d3213a0.png

2.2 文法的形式化定义

放弃了打下标,太难用了。

文法包括下面这四个部分,终结符、非终结符、产生式、开始符号,例子是描述表达式的文法。

1623850612219-15c7a32d-7f23-4549-b1e6-c8878a342843.png

2.3 四种文法

1623852461092-f4dcaea0-704c-4136-b78b-f0c967ad48a9.png

2.4 FCG 上下文无关文法 分析树

直接短语是某一步直接推出来的那种

1623853546390-eb50d70d-da86-4b08-a180-f65af506bd1b.png

3 词法分析

3.1 有穷自动机

1624015005427-a160913d-c5b1-4b25-859d-abdd3a6e2867.png

S是状态们,比如 0 1 2 3

第三个参数:状态表…等

非确定有穷自动机,在映射的转换函数中,沿着a可能会到多个状态

3.2 DFA的算法实现

1624015706305-5422599e-f128-4c4e-9885-ebf5d2d2a13f.png

4 语法分析

4.1 自顶向下的分析

最左推导 = 最右归约

在自底向上的分析中,总是采用最左归约的方式,因此把最左归约称为规范归约,而最右推导相应地称为规范推导。这句话不太懂,为啥突然扯到自底向上的分析中。

自顶向下的语法分析采用最左推导方式,即总是选择每个句型的最左非终结符进行替换,替换的规则是:根据输入流中的下一个终结符,来选择最左非终结符的一个候选式。

4.2 递归下降分析

1624091443584-7865b993-c007-4921-9b19-feb9f64c9144.png

4.3 预测分析

1624091503647-9a915abf-f94a-47ef-9068-3ac2e7e64e2e.png

4.4 消除左递归

1624092430765-8a5b9992-8185-44f1-b522-a1f75b942e51.png

消除间接左递归

1624092541267-f7a9bcf4-26d8-4b93-967d-5e67f2904e23.png
1624092611525-c757fe1d-70a8-44c5-9470-a9a558ac6c71.png

提取左公因子

1624092640081-41f5362a-afd9-4da0-84ad-71dde4ed85a4.png

4.5 程序设计

1624194780253-fe68db13-4eb3-49ea-a80f-375d5ddd2899.png1624194872164-164c91b3-35c9-487b-92fe-77b72e82e5fc.png1624195162026-4a2c9a1a-16bf-4fa3-8841-95b3f012f195.png

1624195250535-9dc2dcf1-a54c-4187-92bb-938894cebc13.png
1624195308493-ef3ec840-3a52-45db-959b-72d4be7be92c.png

一些零碎知识点

1624963481668-b09365de-0e87-4c73-b0e5-c1fe80639087.png

1624963570605-b06cdc28-227e-4a49-8ba4-59ff4c9ccba8.png1624969788423-1e414737-57c1-4ff0-90a4-ee610a72dade.png

基本块

1625003721143-af55750d-32d2-4ff4-8091-c760f315977c.png
1625003772038-1c11cf14-f05b-4ae6-96a3-8db9a7478222.png
1624989446742-e3f17191-f598-4650-bcf8-e63716a5be5c.png
1624989490832-ebd792b6-2f65-410f-907d-515fd0e0ee33.png
1624989539342-2f038b91-fa6d-45e9-ad64-f07532199b26.png
1624989600743-5b4391be-f13c-4aad-9a93-56fa0e266f73.png
1624989644208-c580b275-1736-4b64-8511-adeab7ae71a9.png
1624990082063-5ecb8527-0c41-48b2-a438-03dab5fed96f.png
1624990930719-cb11e265-16ef-486a-9c00-2b67d8b62a91.png
1624991110599-a2599c66-27e8-4d56-9461-266f612ba102.png
1624991208692-e357106f-2f5c-4533-90fd-ffa9bcb87537.png
1624991494336-0885dd4e-6dad-44f2-8f24-68f4ce77415b.png

1624993382155-b4c97795-253f-48cd-979c-c0d0000fbc89.png1624993499569-6567913a-72ed-45b6-a5c0-f13fe885ca40.png

更新: 2021-06-30 20:19:57
原文: https://www.yuque.com/qer233/sdu_note/compile