编译原理复习

第1章 引论

  • 编译程序的基本任务是将源语言程序翻译成等价的目标语言程序
  • 编译过程

    包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成6个阶段,除此之外还有表格管理以及出错处理。

    1. 词法分析

      任务:从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。

      输入为:源程序

    2. 语法分析

      任务:在词法分析的基础上将单词序列分解成各类语法短语。

    3. 语义分析

      任务:审查源程序有无语义错误,为代码生成阶段收集类型信息。

    4. 中间代码生成

      常用的三种方式:三元式、四元式、逆波兰式。

    5. 代码优化
    6. 目标代码生成
  • 什么是编译程序

    从功能上看,一个编译程序就是一个语言翻译程序。语言翻译程序把一种语言(称为源语言)书写的程序翻译成另一种语言(称作目标语言)的等价程序。

  • 什么是源程序

    源语言编写的程序称为源程序

  • 什么是目标程序

    目标语言书写的程序称为目标程序

  • 编译阶段的前端、后端

    有时把编译的过程分为前端和后端,前端的工作主要依赖于源语言而与目标机无关,前端通常包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,还包括与前端每个阶段相关的出错处理工作和符号表管理工作。

后端指的是那些依赖于目标机而一般不依赖于源语言,只与中间代码有关的那些阶段的工作,即目标代码生成,以及相关出错处理和符号表的操作。

  • 一个编译过程可由一遍、两遍或多遍完成。所谓“遍”,也称为“趟”,是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。

  • 解释程序和编译程序的区别

    解释程序以源程序作为输入,不产生目标程序,而是边解释边执行源程序本身。
    编译程序实现以源语言表示的算法向目标语言表示的算法的等价变换。

第2章 文法和语言

  • 直接推导

    设α->β是文法G=(VN,VT,P,S)的规则(或说是P中的一个产生式),γ和δ是V*中的任意符号,若有符号串v、w满足 v = γαδ, w = γβδ 则说v(应用规则α->β)直接产生w,或说w是v的直接推导。

  • 语言

    文法G所产生的语言定义为集合{x | S ? x,其中S为文法识别符号,且x∈VT* ,推导为星推导}

文法描述的语言是该文法一切句子的集合。

  • 文法的类型

    1.设G=(VN,VT,P,S),如果它的每个产生式 α->β 是这样一种结构: α∈(VN∪VT)*

    且至少含有一个非终结符, 而 β∈(VN∪VT)*, 则G是一个0型文法,也叫短语文法。

    2.设G=(VN,VT,P,S)作为一个文法,若P中的每一个产生式 α->β 均满足 |β| ≥ |α| ,仅仅 S->ε 除外,则文法G是1型或上下文有关的。

    3.设G=(VN,VT,P,S),若P中的每一个产生式 α->β 满足:α是一个非终结符, β∈(VN∪VT)* ,则此文法称为2型的或上下文无关的。

    4.设G=(VN,VT,P,S), 若P中的每一个产生式的形式都是A->aB 或 A->a, 其中A和B都是非终结符,a∈VT*,则G是3型文法或正规文法。

  • 语法树

    描述上下文无关文法的句型推导的直观工具,即语法树,也称推导树。

  • 最左(最右)推导、规范推导

    如果在推导的任何一步 α?β,其中α、β是句型,都是对α中的最左(最右)非终结符进行替换,则称这种推导为最左(最右)推导。 最右推导通常被称为规范推导。

如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法是二义的。

如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。

文法产生的语言是相同的,则他们是等价的。

  • 短语、直接短语、句柄
    书上的定义:

我的理解:

一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语。

如果子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的直接短语。

直接短语中的最左直接短语为该句型的句柄。
  • 有害规则

    所谓有害规则,是指形为U->U的产生式,它对描述语言显然是没有必要的,说它有害是说它会引起文法的二义性。

第3章 词法分析

经过编译得到的目标程序是机器语言程序/汇编语言程序

词法分析程序所输出的单词符号可采用以下二元式表示:(单词种别,单词自身的值)

  • 正规文法和正规式的相互转换P46
  • DFA

    一个确定的有穷自动机M是一个五元组:

    M = (K,Σ ,f,S,Z)

    其中:

    (1)K 是一个有穷集,它的每个元素称为一个状态。

    (2)Σ 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称 Σ 为输入符号表。

    (3)f 是转换函数,是 K×Σ->K 上的映像。例如,f(k1,a)=k2(k1∈K,k2∈K),就意味着,当前状态为k1,输入字符为a时,将转换到下一个状态k2,把k2称作k1的一个后继状态。

    (4)S∈K,是唯一的一个初态。

    (5)Z?K,是一个终态集,终态也称可接收状态或结束状态。

  • NFA

    一个不确定的有穷自动机M是一个五元组:

    M = (K,Σ ,f,S,Z)

    其中:

    (1)K 是一个有穷集,它的每个元素称为一个状态。

    (2)Σ 是一个有穷字母表,它的每个元素称为一个输入符号

    (3)f是一个从 K×Σ*

    到 K 的全体子集的映像,即 K×Σ* -> 2k,其中2k表示K的幂集。

    (4)S∈K,是一个非空初态集。

    (5)Z?K,是一个终态集。

状态集合I的ε-闭包,表示为 ε-closure(I) ,定义为一个状态集,是状态集I中的任何状态S经任意条 ε 弧而能到达的状态的集合。

第4章 自顶向下语法分析方法

自顶向下分析方法也称面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入的单词符号串完全相匹配的句子。若输入串是给定文法的句子,则必能推出,反之必然出错。

确定的自顶向下分析方法,是从文法的开始符号开始,考虑如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符以往下推导,或如何构造一颗相应的语法树。

FIRST集 FOLLOW集 提取左公共因子 消除左递归 LL(1)预测分析

  • 提取左公共因子

    A->α(β|γ) 变化为:

    A->αA‘

    A‘->β|γ

  • 消除左递归

    S->Sa

    S->b 变换为:

    S->bS‘

    S‘->aS‘|ε

第5章 自底向上优先分析

实现自底向上分析最常用的技术是 移进-归约分析 ,它的基本思想是对输入符号串自左向右进行扫描,并将输入符号逐个移入一个后进后出栈中,边移进边分析,一旦栈顶符号串形成某个句型的句柄或其他可规约串时就进行规约,规约的结果是将句柄或其他可规约串从栈顶部分弹出,而将相应的非终结符压入栈中。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就确认了输入串是文法的句子。

简单优先分析法 归约句柄

算符优先分析法 归约最左素短语

  • 最左素短语

    设有文法G[S],其句型的素短语是一个短语,它至少包含一个终结符,并除自身外不包含其他素短语,最左边的素短语称最左素短语。

第7章 语法制导的语义计算

  • 终结符具有什么属性

    综合属性和继承属性

  • S-属性文法和L-属性文法
    只包含综合属性的属性文法称为S-属性文法、L-属性文法既可以包含综合属性,也可以包含继承属性,但要求产生式右端某文法符号的继承属性的计算只取决于该符号左边符号的属性。

第8章 静态语义分析和中间代码生成

  • 符号表的作用

    1.收集符号(标识符)的属性信息

    2.在语义分析中,符号表所登记的内容是进行上下文语义合法性检查的依据。

    3.在目标代码生成阶段,符号表是对符号名进行地址分配的依据。

  • 符号表的常见属性

    符号的名字、符号的类别、符号的类型、符号的存储类别和存储分配信息、符号的作用域与可见性......

  • 符号表的总体组织方式
    1. 属性总类完全相同的符号放在一起
    2. 所有语言中的符号都组织在一张符号表中
    3. 折中方式,根据符号属性相似程度分类组织成若干表
  • 符号表项的组织传统上采用三种构造方法

    1.线性法
    2.散列法
    3.二分法

关键字域的组织用关键字池

  • 什么是数组内情向量

    编译程序对数组说明的主要工作是把数组有关信息汇集在一个叫做“内情向量”的表格中以便以后计算引用这些信息

信息包括:数组的类型,维数,各维的上下界以及数组的首地址

第9章 运行时存储组织

  • 运行时存储区域常常划成目标区、静态数据区、栈区、堆区。
  • 存储分配策略

    静态存储分配和动态存储分配,动态分为栈式存储分配和堆式存储分配。

  • 嵌套过程定义中非局部量的访问

    实现方法有那些?

    采用Display表、为活动记录增加静态链域

PS:
这里只总结了部分知识、大题部分也没有叙述

整理这些重点知识的同时还学会了markdown里怎么打上下标...

原文地址:https://www.cnblogs.com/p1ng/p/12121557.html

时间: 2024-11-02 11:00:19

编译原理复习的相关文章

Compiler_编译原理复习小注

本文出自:点击打开链接 词法分析: 1.之前一直没有理解关于正则表达式扩展的单目运算符.关于正则定义式的扩展: 在一个问题就是关于回退: 之前一直没有考虑回退符号的问题.回退一个符号,到达终态.实验那么做虽然没有问题,但是这个地方一直理解错了.  Compiler_编译原理复习小注

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

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

编译原理--01 复习大纲(清华大学出版社第3版)

前言 目前以手中这本清华大学出版社出版的编译原理(第3版,张素琴等编著)作为复习总结,因为考试都是大题,一部分概念会被忽略.所有内容都需要通过举例和推导来帮助加深理解,优先为过几天的考试服务.该文实现了教材中那些特别复杂的推导符号,并且这几天会加紧持续更新. 第2章 文法和语言 符号和符号串 空符号串用\(\varepsilon\)表示,长度为0 若 \(\Sigma=\{0,1\}\) ,则 \(\Sigma^*=\{\varepsilon,0,1,00,11,000,001,...\}\),

编译原理

1.编译原理是什么? (1)就是对程序语言进行翻译: (2)介绍编译程序构造的原理和基本方法: (3)从本质上讲是一个算法问题: 2.学习编译原理有什么好处? (1)接触一些新的算法,如,贪心算法,图论算法等: (2)学习一些新的思想,如,有限状态机,递归下降等: (3)多了一项技能: 3.不学有什么损失? (1)将来出社会可能比较难混: (2)不学好这门课程期末可能不及格: (3)有学不一定有用,不学肯定没用: 4.如何学习编译原理? (1)上课跟上老师的步伐,课前预习,课后复习: (2)多从

程序员的三大浪漫之一——编译原理

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为,既然编译过程是将一种语言翻译为另一种语言的计算机程序的过程,顾名思义,编译原理就是为我们解释计算机是如何将一种语言翻译成另一种语言这

关于计算机编译原理

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

0909编译原理作业

1.学习编译原理既掌握编译理论和方法方面的基本知识,而且也获得设计.实现.分析和移植编译程序方面的初步能力.知道程序编译器是怎么编译的,学好了以后可以开发编译器.学会使自己写的程序更优,提高程序的效率.告诉我们编译器是怎么在内存中为程序的函数(包括变量)分配空间的等等. 2.编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力.编译原理是计算机科学与技术中一个非常成熟的分支,非

0909 编译原理

1.编译原理学什么? 编译原理是计算机专业的一门重要专业课.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 2.为什么学编译原理? 编译原理是计算机专业设置的一门重要的专业课程.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了. 3.怎么学编译原理? 1)提高学习

如何更好的学习编译原理?

编译原理就是什么?编译原理对于我们学计算机来说,是一门很重要的学科,它在计算机科学与技术的历史发展中发挥了巨大作用,是计算机系统的核 心支持软件.这门课程关注的是编译器方面的产生原理和技术问题,从本质上来讲就是一个算法问题. 学习编译原理有什么好处?1. 词法分析方面,掌握正则表达式,了解dfa/nfa.2. Parsing 方面,能读懂BNF,知道AST,会写简单的递归下降parser,会用 antlr之类的parser generator.3. 优化方面,知道现代编译器的优化能力有多强,知道