编译原理复习(第一部分)

第一章 引论

1.概述

语言分类
在这里插入图片描述
强制式语言(imperative): C、C++、C#、Java
声明式语言(declarative): ML、Haskell(函数式语言)、Prolog(约束逻辑语言)
冯诺伊曼语言: 大部分语言都是,少部分例外(如Prolog)
面向对象语言: C++、C#、Java和Ruby
脚本语言: Awk、JavaScript、Perl、PHP、Python、Ruby和Tcl

编译:将高级语言(源语言)翻译成汇编语言或机器语言(目标语言)的过程
解释:把源程序代码一行一行的读懂,然后一行一行的执行,发生在运行时,产物是运行结果。

编译和解释的例子:

  • C是编译过程
  • Scheme是解释过程
  • JAVA结合; 编译与解释的过程

语言处理系统
在这里插入图片描述
起始位置+相对地址=绝对地址
在这里插入图片描述

2.词法分析概述

字符流转为单词流

在这里插入图片描述
词法分析的主要任务
从左向右逐行扫描源程序的字符,识别出各个单词,确定 单词的类型。将识别出的单词转换成统一的机内表示—— 词法单元 (token) 形式
token :< 种别码,属性值 >
在这里插入图片描述

2.语法分析概述

主要任务:从词法分析器输出的token序列中 识别出各类短语,并 构造语法分析树(parse tree)
在这里插入图片描述

3.语义分析概述

主要任务:收集标识符的属性信息
(种属kind:简单变量、符合变量、过程)
(类型type:整型、实型、字符型…)
(存储位置、长度)
(值)
(作用域)
(参数和返回值信息)
语义检查
在这里插入图片描述

在这里插入图片描述
类型检查在语义分析阶段
分析具体例子:
在这里插入图片描述
常用的中间表示形式:三地址码(四元式、三元式、间接三元式)、语法结构树/语法树(syntax trees)

注:syntax trees和parse tree不一样,参考语法分析树、语法树、二义性的消除

第二章 程序设计语义及其文法

1.基本概念

字母表
在这里插入图片描述
字母表的运算:

  1. 字母表∑ 1和∑ 2的乘积(product)
  2. 字母表∑ 的n次幂(power)
  3. 字母表∑ 的正闭包(positive closure)
  4. 字母表∑ 的克林闭包(Kleene closure)(正闭包+空)

2.文法的定义

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

符号约定
下述符号是 终结符
  ➢(a) 字母表中排在前面的小写字母 ,如 a、 b、 c
  ➢(b) 运算符,如 + 、* 等
  ➢© 标点符号,如 括号、逗号等
  ➢(d) 数字0、1、. . . 、9
  ➢(e) 粗体字符串,如id、if
下述符号是 非终结符
  ➢(a) 字母表中排在前面的大写字母,如A、B、C
  ➢(b) 字母S。通常表示开始符号
  ➢© 小写、斜体的名字,如expr、stmt等
  ➢(d) 代表程序构造的大写字母。如E( 表达式) 、T( 项)和F( 因子)
字母表中排在后面的大写字母 (如X 、Y 、Z )表示 文法符号 (即终结符或非终结符)
字母表中排在后面的小写字母 (主要是u、v 、. . . 、z )表示 终结符号串 (包括 空串 )
小写希腊字母,如α 、β 、γ ,表示 文法符号串 (包括 空串 )
除非特别说明,第一个产生式的左部就是开始符号

3.语言定义

推导和规约
给定文法G=(VT , VN , P , S ) ,如果 α→β ∈ P ,那么可以将符号串γαδ 中的α 替换为β,也就是说,将γαδ重写 ( (rewrite) ) 为γβδ , 记作 γαδ =>γβδ 。此时,称文法中的符号串 γαδ 直接推导 ( (directly derive) ) 出 γβδ
➢ 简而言之,就是 用产生式的右部替换产生式的左部

在这里插入图片描述
句型和句子
如果 S -> * α ,α ∈(VT ∪VN ) * ,则称α 是G 的一个句型(sentential form)
➢ 一个句型中既可以包含终结符 ,又可以包含非终结符 ,也可能是空串
➢ 如果 S ->* w ,w ∈V T * ,则称w 是G的一个 句子(sentence)
➢ 句子是 不包含非终结符的
在这里插入图片描述

4.文法的分类

➢0型文法 ( (Type-0 Grammar) )
α → β
无限制文法 (Unrestricted Grammar) / 短语结构文法(Phrase Structure Grammar, PSG )
∀α → β∈P,α中至少包含1个非终结符
0 型语言
由0型文法G 生成的语言L(G )

➢1型文法 ( (Type-1 Grammar) )
α → β
上下文有关文法 (Context-Sensitive Grammar ,CSG )
∀α → β∈P,|α| ≤ |β|(产生式左部符号的个数不能多于右部)
产生式的一般形式:α1Aα2 → α1βα2( β≠ε )
上下文有关语言(1 型语言)
由上下文有关文法 (1型文法)G生成的语言L(G )

CSG中不包含ε-产生式

➢2型文法 ( (Type-2 Grammar) )
α → β
上下文无关文法 (Context-Free Grammar,CFG )
➢∀α → β∈P,α ∈VN
产生式的一般形式:A→β
上下文无关语言(2 型语言)
➢由上下文无关文法 (2型文法)G生成的语言L(G )

➢3型文法 ( (Type-3 Grammar) )
α → β
正则文法(Regular Grammar,RG)
右线性(Right Linear)文法:A->wB或A->w
左线性(Left Linear)文法:A->Bw或A->w
左线性文法和右线性文法都称为正则文法
➢正则语言(3型语言)
由正则文法(3型文法)G生成的语言L(G)

四种文法之间的关系
在这里插入图片描述

5.CFG的语法分析树

在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
BNF表示语法规则的方式为:

  • 非终结符用尖括号括起。
  • 每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以::=分开。
  • 具有相同左部的规则可以共用一个左部,各右部之间以直竖“|”隔开。

语法分析树特点:

  • 树根用Start Symbol(开始符号)来标记
  • 叶结点是Token或ε(空串)
  • 内结点(非叶)是Non-Teminal(非终结符)
  • 如果A->x1x2…xn,那么A是个内结点;x1,x2…xn是A的儿子和可以是Terminals或Tokens

文法可能会有二义性(如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的
例子:
在这里插入图片描述

语法制导翻译: 把属性与文法规则&构造相结合,随着分析的进展进行语义翻译

  • 左递归产生死循环
  • 消除左递归的方法:
    在这里插入图片描述

第三章 词法分析

1.词法单元、模式、词素

词法单元: 由一个词法单元名和一个可选的属性值组成。
模式: 描述了一个词法单元的词素可能具有的形式。
词素: 是源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。

2.正则表达式

语言L={a}{a,b}*({ε} ∪({.,_}{a,b}{a,b} * ))
正则表达式(Regular Expression ,RE) 是一种用来描述正则语言的更紧凑的表示方法
➢正则表达式可以由 较小的正则表达式按照特定规则 递归 地构建。每个正则表达式 r 定义( 表示 )一个语言,记为L(r )。这个语言也是根据r的子表达式所表示的语言递归定义。
在这里插入图片描述
例子:
在这里插入图片描述
RE的代数定律
在这里插入图片描述
正则定义
在这里插入图片描述

3.有穷自动机

1)有穷自动机是识别器,它们只能对每个可能的输入串简单地回答“是”或“否”

2)有穷自动机分为两类:

  • 不确定的有穷自动机(NFA) 对其边上的标号没有任何限制。一个符号标记离开同一状态的多条边,并且空串ε也可以作为标号
  • 对于每个状态及自动机输入字母表中的每个符号,确定的有穷自动机(DFA) 有且只有一条离开该状态、以该符号为标号的边。

状态图的表示
在这里插入图片描述

确定的有穷自动机(DFA)
M=(S ,Σ ,δ ,s0,F)
➢S:有穷状态集
➢Σ:输入字母表,即输入符号集合。假设ε不是Σ中的元素
➢δ:将S×Σ映射到S的转换函数 。∀s∈S,a∈Σ,δ(s,a) 表示从状态s出发,沿着标记为a的边所能到达的状态。
➢s0:开始状态(或初始状态),s0∈S
➢F:接收状态(或终止状态)集合,F⊆S

在这里插入图片描述

非确定的有穷自动机(NFA)
M=(S ,Σ ,δ ,s0,F)
➢S:有穷状态集
➢Σ:输入符号集合,即输入字母表。假设ε不是Σ中的元素
➢δ : 将S ×(Σ ∪{ε}) 映射到2S的转换函数。∀s ∈S, a∈Σ, δ(s,a) 表示从状态s出发,沿着标记为a的边所能到达的状态 集合
➢s0:开始状态(或初始状态),s0∈S
➢F:接收状态(或终止状态)集合,F⊆S
在这里插入图片描述
DFA和NFA的等价性
在这里插入图片描述

4.正则表达式到有穷自动机

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

5.NFA到DFA的转换

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

在这里插入图片描述
总结:通过不断计算闭包,最后得出转换表,再根据转换表画DFA

DFA的最小化
1.先将DFA的状态分为两组,一部分为非接受状态,另一部分为接受状态(即状态集里有最后一个标号的)
2.对两组的其中一组,根据不同的符号输入,转移到不同的状态进行分组,然后重复操作,再对另一组也进行同样的操作。
(纯属个人理解,描述可能有问题,仅供参考)
参考龙书p115

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值