编译原理学习笔记

第一章 总论

编译程序功能

从基本功能上看,编译程序是一种翻译程序。将高级语言程序(源程序)翻译至低级语言程序(目标程序)。

编译程序的组成
  1. 前端:词法分析,语法分析,语义分析(分析)
  2. 中端:中间代码生成和优化(综合)
  3. 后端:目标代码生成和优化(综合)

在这里插入图片描述

词法分析(扫描程序)

从左到右一个字符一个字符地扫描源程序字符,根据词法规则识别出具有独立意义的最小语单位-单词。并把它们转换成通常是等长的内部形式(属性字)。

语法分析(识别程序)

读入由词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。同时也检查了语法的正确性。若存在语法错误,则给出相应的出错信息。若无错,则生成另一种内部表示,如语法分析树或其他中间表示。

语义分析

语义分析工作由一些语义子程序完成,这些语义子程序对语法分析树或其他内部中间表示进行静态语义检查并生成目标代码。

四项功能:确定类型、类型检查、识别含义、相应的语义处理。

符号表
收集每个名字的各种属性用于语义分析及后续各阶段。

出错处理
检查错误 报告出错信息(error reporting)

排错 恢复编译工作(error recovery)

中间代码生成

生成抽象语法树、四元式或三元式

目标代码生成

目标代码可以在语义分析时生成,如果语义分析的结果是中间表示代码,就必须把中间表示代码变换成等价的目标程序,即目标语言代码。

编译阶段的组合


是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。

高级程序设计语言有哪两种执行方式?各有什么优缺点?两种执行方式的区别。

编译程序与解释程序。编译程序是一种语言处理程序,将高级语言翻译成低级语言程序。编译和运行时独立分开的阶段。而解释程序不需要再运行前翻译源程序,直接可以在机器上运行产生结果。编译程序速度执行效率高,而解释程序慢,但是易于编写修改,有很多库。

第二章 文法和语言

文法和语言的形式定义

文法G是一个四元组(VN,VT,P,S),其中:

  • VN——非终结符号集合;
  • VT——由终结符号组成的字母表;
  • P——有穷非空的重写规则集合;
  • S——识别符号,S∈VN。
    显然VN∩VT=Ø。

文法G的字汇表V=VN∪VT,即字汇表是出现于文法规则中的一切符号所组成的集合。

对于文法G,有规则 α::=β,x和y是V上的符号串(可以是空串),若V上有另外两个符号串v和w使 v=xαy,w=xβy,则称v直接推导或直接产生出w,或称w直接归约到v。

对于文法G,如果存在一直接推导序列v=u0 =>u1 =>u2=>… =>un=w,(n>0)则称v推导出w,或称w归约到v称n为推导长度。且称w是相对于v的一个字。

在这里插入图片描述

设G[Z]是字汇表V上的一个文法,如果Z推导x,x属于V*(字汇表),则称x是文法G的一个句型;如果Z推导出x, x属于VT*(终结字符),则称x是文法G的一个句子或一个字。

语言的形式定义

假定G[S]是一文法,S是文法的识别符号。由该文法描述的语言用L(G[S])表示,则L(G[S])={x|S 推导出 x,且x∈V T*}

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

文法和语言的关系
  1. 给定一个文法,就能从结构上唯一地确定其语言;
  2. 给定一种语言,能确定其文法,但这种文法不是唯一的。
文法和语言的分类

在这里插入图片描述

0型文法

对文法G,若P中规则都具有下列形式: α∷=β 其中α∈V*,且至少含有一个非终结符,β∈V*,则称该文法G为(Chomsky) 0型文法或短语结构文法,缩写为PSG。

0型文法相应的语言称为0型语言或短语结构语言,又称递归可枚举集。

1型文法

对文法G,若P中规则都具有下列形式: xUy∷=xuy 其中U∈VN,x、y∈V*,u∈V+,则称该文法G为 (Chomsky)1型文法或上下文有关文法,也称上下文敏感文法,缩写为CSG。

1型文法或上下文有关文法的相应语言称为1型语言或上下文有关语言。

2型文法

如果对于某文法G,P中的每个规则具有下列形式: α∷=β 其中 α∈VN,β∈V*,则称该文法G为2型文法或上下文无关文法,缩写为CFG。

2型文法或上下文无关文法的相应语言称为2型语言或上下文无关语言。 大多数程序设计语言的文法是上下文无关的。

3型文法

如果对于某文法G,P中的每个规则具有下列形式: A∷=a或 A∷=Ba(左线性)其中 a∈VT,A、B∈VN,则称该文法G为(Chomsky)3型文法或正则文法(或正规文法),有时又称有穷状态文法,缩写为RG。

3型文法或正则文法的相应语言称为3型语言或正则语言(或正规语言)。
若 A∷=a
或  A∷=aB, 右线性文法

语法树的概念
  1. 每个结点都是G的某一终结符或非终结符;
  2. 树根是文法的开始符S;
  3. 若某一结点至少有一个从它出来的分枝,则该结点一定是非终结符;
  4. 若某结点A有n个分枝,其分枝结点为B1、B2、…、Bn,则A::=B1B2…Bn一定是一个规则;
  5. 子树:语法树的某个结点连同它向下射出的部分;
  6. 简单子树:只含有单层分枝的子树。
句型分析

所谓句型分析,也就是识别一个符号串是否是某文法的句型。当给定某个符号串时,试图按照某文法的规则为该符号串构造推导或语法树,从而识别出它是该文法的一个句型;若符号串全由终结符号组成时识别的是句子。

句型分析的目的是讨论程序设计语言编译实现的问题,期望利用某种分析技术,为程序设计语言构造一个识别程序。

  1. 自顶向下分析技术
    基本思想是:从识别符号出发,由它推导出与输入符号串相同的终结符号串。自顶向下识别过程是一个不断建立直接推导的过程。
  2. 自底向上分析技术
    基本思想是:从输入符号串出发,试图把它归约成识别符号。

短语和句柄

设有文法G[Z],w=xuy是一个句型,Z推导出xUy,且U直接推导出u,则称u是句型w的相对于U的短语;若有Z推导出xUy,且U直接推导u出,则称u是句型w的相对于U的直接(简单)短语。其中U属于Vn,u 属于 V+

句型的最左简单短语称为该句型的句柄。

在这里插入图片描述

第三章 词法分析

词法分析:识别出源程序中具有独立含义的最小语法单位——单词,如标识符、无正负号常数与界限符等。

状态转换图
构造
  1. 引入新符号S为开始状态结点;
  2. 以每一个非终结符号为状态结点;
  3. 对于形如A∷=a的每个规则,引一条从开始状态S到状态A的弧,其标记为a;而对形如A∷=Ba的规则引一条从状态B到A的弧,其标记为 a。其中A,B为非终结符号,a为终结符号;
  4. 识别符号为终止状态。

在这里插入图片描述

用状态转换图为正则语言构造正则文法

(1)为正则语言画出状态转换图。基于其句子的一般形式和状态转换图运行思想。

(2)从该状态转换图构造相应的正则文法。
如果一个状态转换图中有从状态B到状态A的弧,弧上标记为a,显然必存在规则A∷=Ba;如果从开始状态S到状态A有一弧,弧上标记为a时,则存在规则A∷=a。

确定有穷自动机DFA

定义

一个确定的有穷自动机DFA是五元组(K,Σ,M,S,F)

其中,

  • K:有穷非空的状态集合;
  • Σ:有穷非空的输入字母表;
  • M:从K×Σ到K的映象。如果M(R,a)=Q,则输入字符为a时,当前状态R将转换到状态Q,Q成为下一当前状态;
  • S:是开始状态,S∈K;
  • F:是非空的终止状态集合,F 包含 K。

由有穷状态自动机接受的字符串集合称正则集, 对于(D)FA D,记为L(D)。

在这里插入图片描述

不确定有穷自动机NFA

定义

一个非确定的有穷自动机NFA是五元组(K,Σ,M,S,F)

其中,

  • K:有穷非空的状态集合;
  • Σ:有穷非空的输入字母表;
  • M:从K×Σ到K的映象。如果M(R,a)=Q,则输入字符为a时,当前状态R将转换到状态Q,Q成为下一当前状态;
  • S:是非空的开始状态集合,S包含于K;
  • F:是非空的终止状态集合,F 包含于 K。

显然,DFA是NFA的特例。

定理 设L是一个为某NFA所接受的字符串集合,则存在一个接受L的DFA。

在这里插入图片描述

NFA的确定化

NFA转换为等价的DFA的 一般步骤如下:

  1. 把一切开始状态S1,S2,…,Sm合并成一个新的开始状态[S1,S2,…,Sm];
  2. 从新开始状态出发,列表求出其它一切新状态;
  3. 以状态名中包含原有终止状态名的一切新状态作为新终止状态;
  4. 构造DFA N′。

在这里插入图片描述

第四章 自顶向上语法分析方法

基本思想

从推导角度看,自顶向下分析技术是从识别符号出发,试图构造一个推导,由它推导出与输入符号串相同的符号串。

从语法树角度看,自顶向下分析过程以识别符号为根结点,试图向下构造一个语法树,其末端结点符号串正好与输入符号串相同。

LL(1)文法的定义和判定

开始符号集(首符号集) First(α)的定义和构造

设G=(VN,VT,P,S)是上下文无关文法,First(α)={a|α=>*aβ ,a∈VT,α,β∈V*},特别地,如果α=>*ε,则ε∈First (α)。

在这里插入图片描述

后跟符号集合Follow(A)的定义和构造

设G=(VN,VT,P,S)是上下文无关文法,Follow(A)={a|S=>*μAβ,a∈VT,a∈First(β) β∈V+},若S=>*μAβ,且 β=>*Ɛ,则 #∈Follow(A)。这里,A∈VN,且S是识别符号。

构造方法:x,y∈V*, U,W∈VN

  1. #∈Follow (S),S是文法的识别符号;
  2. 如果存在规则 U → xWy,则First(y)中除ε外的一切符号都属于Follow (W) ;
  3. 如果存在规则U → xW或U → xWy,其中First(y)包含ε(即,y=> ε),则Follow (U)中的一切符号都属于Follow (W) 。

在这里插入图片描述

选择符号集合 Select(A →α)的定义

一个产生式的选择符号集Select。给定上下文无关文法的产生式 A→α, A∈VN , α∈V*,
若α无法推导ε,则 Select (A→α)= First (α)

若α可以推导出ε,则 Select (A→α)= (First(α)-{Ɛ})U Follow (A)。

在这里插入图片描述

LL(1)文法的定义

一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个产生式 A→α, A→β, 满足:

Select(A→α) ∩ Select (A→β)= Ø

这里,α=>*ε,和β=>*ε不能同时成立。

LL(1)文法的判定
  1. 求出能推出Ɛ的非终结符;
  2. 计算每一文法符号的 First(X);
  3. 计算每个非终结符的Follow(A);
  4. 计算每个产生式的Select(A→α) ;
  5. 判断相同左部产生式的Select交集。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

某些非LL(1)文法到LL(1)文法的等价变换
提取左公共因子

在这里插入图片描述

结论:

  1. 文法中不含左公共因子只是LL(1)文法的必要条件,不是充分条件;
  2. 不是每个文法的左公共因子都能在有限的步骤内替换成无左公共因子的文法。
消除左递归
  1. 消除直接左递归

在这里插入图片描述

  1. 消除间接左递归
    首先,对产生式非终结符进行置换,将间接左递归变为直接左递归,然后,再消除直接左递归。
LL(1)文法的实现

表驱动:基本思想:从左到右扫描输入串,同时从识别符号开始生成最左推导,向前看一个符号,以确定当前应选择哪一条规则。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第五章 自底向上语法分析-LR分析

自底向上分析技术的思路:

  1. 找出句柄u;
  2. 找出规则U∷=u;
  3. 把u直接归约成U。

基本概念

活前缀与可归前缀

如某文法有可归前缀xAy,A∈Vn,若有规则:A::=u,则xu也是文法的可归前缀。

LR(0)项,项集,项集的闭包
  1. LR(0)项
    如果U∷=uv是文法G的一个规则,其中u或v可为空串,则U→u.v称为G的一个LR(0)项,简称项。
  • 接受项:如果一个项呈Z→u.形,Z是识别符号。
  • 归约项:圆点在产生式右部最后的项称归约项 。
  • 移入项:圆点之后是终结符号
  • 待约项:圆点后跟非终结符号
  1. 初始项
    文法G[Z]的LR(0)项Z→.u称为G的初始LR(0)项,简称初始项。
  2. 后继项
    设U→u.Av是文法G的一个LR(0)项,其中A∈VN∪VT,则LR(0)项U→uA.v称为它的后继项。
  3. 项集
    由若干LR(0)项构成的集合。
  4. 项集的闭包
    设Sj是文法G的一个项集,项集Sj的闭包CLOSURE(Sj)是按下列步骤构造而得的项集。

步骤1 Sj中每个项在CLOSURE(Sj)中;
步骤2 如果U→u.Vv∈CLOSURE(Sj),且V∷=w是一个规则,则把V→.w添入CLOSURE(Sj)中;
步骤3 重复步骤2,直到CLOSURE(Sj)不再扩大。这时所得的便是项集Sj的闭包CLOSURE(Sj)。

项集规范族和特征有穷状态机

一个文法G[Z]的LR(0)项集规范族的构造步骤:

  1. 初始项集S0=CLOSURE({Z′→.Z})是G的LR(0)项集,这里Z′是包含有规则Z′∷=Z的增广文法之识别符号;
  2. 如果Si是G的项集,则Si的一切后继项集均是G的项集;
  3. 重复步骤2,直到再无新的项集可以添入。

注意
某一项集中,不同的项,其后继符号相同时,后继项集相同。
不同的项集中,若干个与前面对应相同的项,其后继项集与前面的相同。

规约项目的相应转态为规约状态;移进项目的相应状态为移进状态;接收项目的相应状态为接收状态。

定义:一个上下文无关文法是LR(0)文法,当且仅当该文法的项集规范族不存在移进-规约冲突或规约-规约冲突。

LR(0)分析表的构造

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

SLR(1)分析技术
简单向前看1集合

在这里插入图片描述

SLR(1)分析表的构造

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LR(1)分析技术
基本概念
  1. LR(1)项

在LR(0)项中放一个向前搜索符号a, 成为形式:
[A →α.β,a], 其中a ∈Follow(A),称为LR(1)项。

  1. 有效项
    设有文法G[S],LR(1)项[A → α. β,a]对活前缀Υ=δα有效,是指存在规范推导:S=>δAy=>δαβy,y∈Vt*,且满足下列条件:当y=ε, a=# ;当y≠ε, a=First(y)

  2. LR(1)项集的闭包

设Si是文法G的一个LR(1)项集,项集Si的闭包CLOSURE(Si )是按下列步骤构造而得的项集。
步骤1 Si 中每个项在CLOSURE(Si )中;
步骤2 如果[U→u.Vv,a]∈CLOSURE(Si ),且V∷=w是一个规则,则把[V→.w,b],添入CLOSURE(Si )中,这里b=First(va);
步骤3 重复步骤2,直到CLOSURE(Si)不再扩大。这时所得的便是LR(1)项集Si的闭包CLOSURE(Si )。

特别说明:每一个LR(1)项与其后继项有相同的向前搜索符号.

在这里插入图片描述

LR(1)分析表构造

在这里插入图片描述

在这里插入图片描述

第六章 语义分析与目标代码生成

语义分析的相关概念
  1. 程序的含义
    数据结构的含义 主要指与标识符相关联的数据对象,也即量的含义。量涉及类型与值,值在运行时刻确定,而类型则由程序中的说明部分来规定。

控制结构的含义 由语言定义的。
if(〈表达式〉) 〈语句〉 else 〈语句〉

  1. 静态语义和动态语义
    静态语义:刻画程序在静态一致性或完整性方面的特征。
    动态语义:刻画程序执行时的行为。

  2. 语义分析的功能
    1)确定类型:确定标识符所关联数据对象的数据类型。

2)类型检查:按照语言的类型规则,检查运算的合法性与运算分量类型的一致性(相容性)。

3)识别含义:根据程序设计语言的语义定义(形式或非形式的),确认程序中各构造成分组合到一起的含义,并作相应的语义处理。对可执行语句生成中间代码或目标代码。

4)其他一些静态语义检查:例如控制流检查。

  1. 语法制导翻译

语法制导翻译是在语法规则制导下,通过对语义规则的计算,完成对输入符号串的翻译。即,在使用语法规则进行推导或归约的同时又使用语义规则来指导翻译与最终产生目标代码。

语法制导的语义计算
基于属性文法的语义计算
属性

在文法基础上,为文法符号关联的有特定意义的任何内容,称为属性。
如类型、数值、字符串、存储地址与代码等。

属性的分类
  1. 综合属性:一个结点相应文法符号的属性之值通过语法分析树中它的子结点的属性之值来计算;
    规则左部符号的属性是综合属性。
  2. 继承属性:一个结点相应文法符号的属性之值通过语法分析树中它的兄弟结点与父结点的相应文法符号的属性之值来计算。出现在规则右部符号的属性。
  3. 内在属性: 不会出现在属性定义性出现集合中的属性,内在属性通常是终结符号的属性,如digit.lexval,是由词法分析程序提供的属性值。
属性文法

对于某个压缩了的上下文无关文法,把每个文法符号联系于一组属性,且让该文法的重写规则(产生式)附加以语义规则(语义动作或条件谓词)时,则称该上下文无关文法为属性文法。

属性文法的形式描述

在这里插入图片描述

在这里插入图片描述

遍历分析树进行语义计算
  1. 构造输入串的语法分析树
  2. 构造依赖图
  3. 若依赖图无圈,则任何一种拓扑排序对分析树进行遍历,计算所有的属性值。

依赖图:用来表达属性间相互依赖关系的有向图称为依赖图。

构造的前提:对语义函数组成的语义规则引进虚拟(综合)属性,从而使每个语义规则都形如b:=f(c1,c2,…,ck)。

基本思想:若属性b依赖属性ci,则相应于ci的结点到相应于b的结点有一弧。

在这里插入图片描述

在这里插入图片描述

S-属性文法和L-属性文法

S-属性文法:只包含综合属性的文法。

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

显然, S-属性文法是L-属性文法的一个特例。

在这里插入图片描述

基于S-属性文法的语义计算

在这里插入图片描述

基于L-属性文法的语义计算

在这里插入图片描述

基于翻译模式的语义计算
  1. S-翻译模式:只涉及综合属性。
  2. L-翻译模式:可以包含综合属性,也可以包含继承属性,但要满足一定的条件。

在这里插入图片描述

在这里插入图片描述

基于S-翻译模式的语义计算

基于S-翻译模式的语义计算一般基于自底向上的分析,通过增加存放属性值域的语义栈来实现。因为只涉及综合属性,因此,语义动作放在产生式右部的末尾。

在这里插入图片描述

基于L-翻译模式的自顶向下语义计算

基于L-翻译模式的自顶向下语义计算也采用自顶向下深度优先从左到右遍历分析树的方法。可以将L-翻译模式描述的语义计算过程融入到递归下降分析程序中,具体方法如下:

对每一个非终结符A构造的函数,以A的每个继承属性为形参,以A的综合属性为返回值。每个产生式对应的代码根据产生式右端的结构来构造,相应构造算法如下:

在这里插入图片描述

基于L-翻译模式的自顶向下语义计算也采用自顶向下深度优先从左到右遍历分析树的方法。因此,基础文法中不能包含左递归。左递归消除后,相应的翻译模式也要变换。一般情形如下:

在这里插入图片描述

在这里插入图片描述

源程序的内部中间表示
  1. 抽象语法树
  2. 逆波兰表达式
  3. 四元式
  4. P-code、Bytecode
  5. 静态单赋值形式
四元式

在这里插入图片描述

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于 U-Net 网络的遥感图像语义分割是一种用于识别遥感图像中不同类别区域的方法。U-Net 是一种用于图像分割任务的深度学习网络,通过将高分辨率的图像输入网络,并逐步降低分辨率再进行上采样,从而实现对图像的全局和局部特征的建模。 在遥感图像语义分割中,首先将训练样本标注为不同的类别,例如建筑物、道路、水体等。然后,利用 U-Net 网络进行训练,通过学习训练样本的特征来建立起不同类别之间的关联。此外,U-Net 网络还通过跳跃连接(skip connection)实现了底层和高层特征的融合,提高了图像分割的准确性。 在进行遥感图像语义分割时,首先将输入的遥感图像经过预处理,如归一化处理和裁剪等,然后输入 U-Net 网络中进行特征提取和分割。通过网络的卷积和池化操作,可以获取到图像的局部和全局特征。然后,通过上采样操作和跳跃连接的融合,获得高分辨率的分割结果。 基于 U-Net 网络的遥感图像语义分割具有以下优点:首先,U-Net 网络能够学习不同类别之间的关联和特征表示,从而能够准确地分割出遥感图像中的不同类别。其次,通过跳跃连接的融合,U-Net 网络能够捕捉到不同层次的特征,提高了分割结果的准确性和完整性。最后,U-Net 网络具有较好的扩展性和泛化能力,可以应用于不同尺度和不同类别的遥感图像分割任务。 总之,基于 U-Net 网络的遥感图像语义分割是一种高效准确的遥感图像处理方法,具有广阔的应用前景。 ### 回答2: 遥感图像语义分割是指对遥感图像中的每个像素进行分类,将其分为不同的语义类别。基于U-Net网络的遥感图像语义分割是一种常用的深度学习方法。 U-Net是由Ronneberger等人在2015年提出的一种图像分割网络。它的结构包含两个部分:下采样路径和上采样路径。下采样路径通过卷积层和池化层逐步减小图像的大小,提取图像的全局和局部特征。上采样路径使用反卷积层和跳跃连接将特征图恢复到原始输入图像的大小,并通过逐步合并特征图,进行语义分割的预测。 基于U-Net网络的遥感图像语义分割的步骤如下: 1. 数据准备:收集遥感图像数据集,并将其标注为不同的语义类别。 2. 数据预处理:对图像进行预处理,包括图像增强、归一化等操作,以提高网络的学习效果。 3. 搭建U-Net网络:根据U-Net的结构搭建网络模型,定义损失函数以及优化器。 4. 模型训练:使用训练集对网络进行训练,通过最小化损失函数来优化网络的参数。 5. 模型评估:使用验证集对网络进行评估,计算指标如准确率、召回率、F1值等,判断模型的性能。 6. 模型应用:使用训练好的模型对新的遥感图像进行语义分割,将每个像素分配到相应的语义类别中。 基于U-Net网络的遥感图像语义分割方法具有以下优点:能够利用图像的全局和局部特征进行分割,同时通过跳跃连接可以更好地保留图像中的细节信息,提高分割精度。但仍需根据实际情况选择合适的网络结构和参数,以获取更好的分割效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值