编译原理--01 文法和语言、词法分析复习(清华大学出版社第3版)

前言

这篇博客系列是我为了应付期末编译原理的考试顺便做的复习总结,不适合用于直接学习,而是用于快速过一遍考点。不过现在考试已经结束了,做了不到半个钟就做完卷子了。到头来考的深度也只有里面的一半左右= =不过至少是考点全覆盖了23333

最后考了95分嘿嘿,甚至还有考100的

第2章 文法和语言

符号和符号串

空符号串ε表示,长度为0

Σ={0,1} ,则 Σ={ε,0,1,00,11,000,001,...},称 Σ 为集合 Σ闭包Σ+={0,1,00,11,000,001,...},称Σ+为集合Σ+正闭包

文法和语言的形式定义

规则产生式生成式,表示为 αβα::=β

文法 G 定义为四元组 (VN,VT,P,S)
VN为非终结符集合
VT为终结符集合
P为规则集
S为识别符或开始符

例如:
G[S]:S0S1
S01

直接推导,如 0S100S11
长度为n(n1)的推导+,如S+000S111
长度为n(n0)的推导,如S000S111000S111

句型:对Sx,称x是文法G[S]的句型。x可以包含非终结符
句子:若上述x仅由终结符构成,则x是文法G[S]的句子

文法描述的语言该文法一切句子的集合,如:
L(G[S])={0n1n|n1}

文法类型

文法类型 每个产生式αβ的特点
0型文法 α(VNVT)且至少含一个非终结符,且β(VNVT)
1型上下文有关文法 在0型文法的基础上,还满足β∣≥∣α,仅Sε除外
2型上下文无关文法 α是一个非终结符,β(VNVT)
3型正规文法 满足AaBAa(右线性文法)的形式,即β中只有1个非终结符,以及0或1个终结符。左线性文法为ABaAa

最左推导:在推导αβ中,对α中最左非终结符进行替换
最右推导:又称作规范推导,所推导得到的句型称为右句型,或规范句型

二义性:一个文法存在某个句子对应两棵不同的语法树

语法树

已知文法G[S]:
SaAS
ASbA
Sa
Aba

文法G的句型aabbaa的一颗推导树为:

短语:若SαAδA+β,则称 β 为句型 αAδ 相对于非终结符A短语
直接短语:特别的,若Aβ,则称 β 为句型 αAδ 相对于规则Aβ直接短语
句柄:规范句型(右句型)的直接短语。对于无二义文法,一个右句型的唯一句柄是其所有直接短语中最左边的那一个

短语即找出所有非终结符为根节点构成的子树的叶子节点,故有a,ba,abba,aabbaa

直接短语即找出所有非终结符为根节点构成的只有两层高度子树的叶子节点,故有a,ba

句柄要求使用最右推导,对上面的推导树来看有SaASaAaaSbAaaSbbaaaabbaa,我们需要看的是最后一次推导,这里使用的是Sa,因此其句柄为:a

可见,短语、直接短语、句柄的存在要求语法树至少含有2级的叶结点(或3层高度)。

文法限制

有害规则:如UU,只会引发二义性
多余规则:非终结符D不在任何规则的右部出现,即不可到达的

这一章的可能考点

  1. 已知文法求语言
  2. 已知语言求文法
  3. 列出句型的短语、直接短语、句柄
  4. 语法树、最左推导、规范推导

第3章 词法分析

正规式

----正规式---- 含义
a 仅a
ab 该字符可以为a或b
ab 字符a后面紧跟b
a n(n>=0)个连续的a
(ab)b ab或bb

正规文法与正规式的等价性

正规式转化为正规文法

Axy型正规产生式,重写为:
AxB
Ay
BxB
By

Axy型正规产生式,重写为:
Ax
Ay

正规文法转化为正规式

文法产生式 ----正规式----
规则1 AxBBy A=xy
规则2 AxAy A=xy
规则3 AxAy A=xy

有穷自动机

确定的有穷自动机(DFA)

确定的有穷自动机M是一个五元组:M=(K,Σ,f,S,Z)
K是一个有穷状态集
Σ是一个输入符号表
f是状态转换函数,例如f(ki,a)=kj(ki,kjK)
SK,是唯一的一个初态
ZK,是一个终态集

DFA的确定性表现在转换函数 f:K×ΣK 是一个单值函数

例如: DFA M=({S,U,V},{a,b},f,S,{V})
f(S,a)=U
f(S,b)=V
f(U,b)=V
f(V,a)=U

现验证bab是否为M所接受,因为:
f(S,bab)=f(f(S,b),ab)=f(V,ab)=f(f(V,a),b)=f(U,b)=V,而V属于终态,故bab可为M接受。

不确定的有穷自动机(NFA)

不确定的有穷自动机M是一个五元组:M=(K,Σ,f,S,Z)
K是一个有穷状态集
Σ是一个输入符号表
fK×Σ2K的多值映像,即允许函数值有多种结果
SK,是非空初态集
ZK,是一个终态集

NFA可以使用空转移,但DFA不可以。例如:f(0,ε)={0,3}

NFA转换为等价DFA

状态集合Iε闭包,表示为εclosure(I),是状态集I中的任何状态S经过任意条ε弧能到达的状态的集合。显然,状态集合I的任何状态S都属于εclosure(I)

状态集合Ia弧转换,表示为move(I,a),定义为状态集合J,其中J是所有那些可以从I中某一状态经过一条a弧而到达的状态全体

子集法

----------初始状态集---------- εclosure(I) ----a---- ----b----
{0} {0,1,2,4,7}
T0={0,1,2,4,7} {3,8} {5}
{3,8} {1,2,3,4,6,7,8}
{5} {1,2,4,5,6,7}
T1={1,2,3,4,6,7,8} {3,8} {5,9}
T2={1,2,4,5,6,7} {3,8} {5}
{5,9} {1,2,4,5,6,7,9}
T3={1,2,4,5,6,7,9} {3,8} {5,10}
{5,10} {1,2,4,5,6,7,10}
T4={1,2,4,5,6,7,10} {3,8} {5}
重命名状态集 a b
T0 T1 T2
T1 T1 T3
T2 T1 T2
T3 T1 T4
T4 T1 T2

DFA的最小化

  1. P划分为终态集非终态集,得P={N,T}
  2. 递归地分割P中的子集,使得被分割的子集中的所有状态都能够根据不同的输入符号转换到被分割的目标子集中的所有状态
  3. 直到不可再被分割后,将P中的每个子集合并为一个状态。含原初态的状态为初态,而含原终态的状态为终态。


P={1,2,3,4,5,6,7}被划分为P0={{1,2,3,4},{5,6,7}}

在非终态集中,在1和2构成集合时,通过a可以到达终态集,通过b可以到达3。而3,4通过b到达的是终态集,显然有区别,故划分为P1={{1,2},{3,4},{5,6,7}}

在6和7构成集合时,通过a可以到达4,通过b可以到达集合{1,2},而5通过a到达的是7,显然有区别,故划分为P2={{1,2},{3,4},{5},{6,7}}

由于3通过a到达集合{1,2},而4通过a到达4,有明显区分,故划分为P3={{1,2},{3},{4},{5},{6,7}}

最后不能再划分了,因此令1代表{1,2},消去2,令6代表{6,7},消去7.最终得到的为最小化的DFA M

正规式和有穷自动机的等价性

正规文法和有穷自动机的等价性

这一章的可能考点

  1. 根据文法构造DFA,或给定NFA转DFA
  2. DFA的最小化
  3. 正规文法、正规式、有穷自动机之间的转换
posted @   X_Jun  阅读(6031)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
levels of contents
点击右上角即可分享
微信分享提示