编译原理总结

来源:互联网 发布:python 读取zip文件 编辑:程序博客网 时间:2024/05/21 10:36

程序语言的基本知识


符号串集合的运算
A+B(AB)={w|wA,or wB}
AB(AB)={xy|xA and yB}
A0={ε},An=An1A
:,
+={ε}
,+Kleene

文法和语言
语言的描述
  1. 如果语言是有穷的(只包含有穷个句子),可以将 所有的句子列出来
  2. 如果语言是无穷的,则要找出语言的有穷表示 (生成方式(文法),识别方式(自动机))$
文法的概念
GG={VT,VN,S,P}
  1. VT
  2. VN
  3. VTVN=V=VNVT
  4. S
  5. P
  6. P=αβ|α
句型和句子

1.Sαα
2.ααVTα

特殊形式的推导

1.:()
2.:()



句型分析
  1. 短语:分析树中以非终结符号为子树根节 点的所有叶子节点序列
  2. 直接短语:直接短语是句型的分析树中 非终结符号的直接子节点构成的符号串(只有两代父子的子树)
  3. 句柄: 最左边的直接短语
  4. 素短语:短语,并且至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。
  5. 最左素短语:句型最左边的素短语。

素短语:

  1. β是句型αβδ相对于A的一个短语
  2. 至少含有一个终结符
  3. β除自身外不含更小的带终结符的短语
  4. 称β是句型αβδ相对于 A 的一个素短语
分析树和二义性
  1. 如果一个文法的句子有两棵或两棵以上的分析树, 称此句子是二义的
  2. 最左(右)推导与分析树一一对应,句子二义说明 它有两个或以上最左(右)推导
  3. 如果一个文法包含二义性的句子,则称这个文法是 二义性的; 否则,该文法是无二义性的。
  4. 产生某上下文无关语言的每一个文法都是二义的, 则称此语言是先天二义的。
  5. 如果产生式集中一个非终结符号既存 在左递归(A +Aα)又存在右递归(A+βA)现 象,那么该文法是二义的。
四种类型的文法
  1. 0型,短语结构文法(PSG)
  2. 1型,上下文有关文法(CSG)
  3. 2型,上下文无关文法(CFG)
  4. 3型,正规文法(RG)
乔姆斯基语言体系

GG={VT,VN,S,P},αβP

  1. 0 型文法: |α|≠0,L(G)是0型语言——其识别系统是图灵机
  2. 1型文法: |α|≤|β|,L(G)是1型语言(上下文有关语言)——其识 别系统是线性有界自动机
  3. 2型文法: α∈VN,|α|=1,L(G)是2型语言(上下文无关语 言)——其识别系统是下推自动机
  4. 3型文法,A→a 或 A→aB: G是右线性文法,L(G)是3型语言(正规语言),A→a 或 A→Ba: G是左线性文法, L(G)是3型语言(正规语言),正规语言的识别系统是有限自动机

词法分析


有限自动机

有限自动机是具有离散输入与离散输出的一种 数学模型,用于识别输入的符号串是否属于某 个语言的合法句子。
1. 输入:字符串
2. 输出:yes or no

NFA的识别

给定输入串x,它能被一个NFA识别,当且仅 当在该NFA的状态转移图中存在一条从开始 状态出发到某个接受状态的转移路径。

确定性有限自动机(DFA)
  1. 没有 ε 边转移
  2. 一个状态面临一个输入符号时最多只转移到一个状态
NFA和DFA

如果一个语言可以被一个DFA识别, 则一定存在一个NFA,可以识别同一个语言, 反之亦然!

#####DFA的最小化
基本思想: 寻找等价状态,合并之
等价状态必须满足两个条件:
1. 一致性条件 — 状态 s 和 t 必须同时为接受状态 或非接受状态
2. 蔓延性条件 — 对于所有的输入符号,状态 s 和 t 必须转移到等价的状态中

语法分析

  1. 自顶向下分析
  2. 自底向上分析

不确定的自顶向下分析(递归下降方法)
  • 分析树从上到下,从左到右的构建过程
  • 从开始符号作为根节点出发,按顺序尝试该非终结符号的所有规则

消除文法的左递归
  1. 直接左递归 N→Nα
  2. 间接左递归 N→Aα,A→Bβ,B→Nγ
  3. 潜在的左递归 N→αN

直接左递归的消除

若: A→Aα1|…| Aαn |β1|…| βm ,其中βj不以Ai开头
则修改规则为: A → β1A’|…|βm A’
A’→ α1A’|…|αn A’|ε


间接和潜在左递归的消除

代入法: 将一个产生式规则右部的α中的非终结符N替换为N的候选式。如果N有 n个候选式,右边的α重复n次,而且每一次重复都由N的不同候选式来代替N。
间接和潜在左递归通常能通过代入转换为直接左递归


克服回溯问题

提取左公共因子


LL(1)文法
  • FIRST集(首符集):对于文法符号串α, FIRST(α)是由α推导出的所有
    的文法符号串的第一个终结符号组成的集合。
  • FOLLOW集(后跟集):FOLLOW(A)是由所有句型中紧跟在A后面的终结
    符a组成的集合。

#FOLLOW集的构造算法

如果X→AB,则FIRST(B)⊆FOLLOW(A),且 FOLLOW(X) ⊆FOLLOW(B) • 如果B经过推导可以变为ε,则FOLLOW(X) ⊆FOLLOW(A)

  1. 把输入结束符$放入开始符号S的FOLLOW集
  2. 对于形如A→αBβ的产生式,将FIRST(β)-{ε}放 入FOLLOW(B)中
  3. .如果存在产生式A→αB或A→αBβ且β经过推导可以变为ε,将 FOLLOW(A)放入FOLLOW(B)中

SELECT集

含义:当输入是哪些符号时,选择该条产 生式来推导

给定文法产生式A→α,A∈VN,α∈V*

  • 如果α不能推导出ε,则 SELECT(A→α) = FIRST(α)
  • 否则,SELECT(A→α)=(FIRST(α)-{ε})∪FOLLOW(A)

LL(1)文法
一个上下文无关文法G是LL(1)文法,当且仅 当对于G的每一个非终结符A的任何两个不同 产生式A→α|β,下面的条件成立:
SELECT(A→α)∩SELECT(A→β)=∅,其中α 和β不能同时推导出ε

LL(1)文法不是二义的(每步推导选择的产生式 是唯一的),无左递归,不含有公共左因子产生式


自底向上分析方法

归约 :利用栈,输入符号移进栈,当栈顶形成某个非终结符号P的候选式时,就将其归约为非终结符号P。

最右推导的逆过程是最左规约。
最左推导的逆过程是最右规约。
最左规约称为规范规约。

移进-归约方法需要解决的关键问题

  • 如何在右句型中找出可归约串(句柄)?
  • 在相同的右部有不止一个产生式时, 选哪一个

LR分析法
LR(k)分析技术

  • L—是指从左至右扫描输入符号串
  • R—是指构造一个最右推导的逆过程
  • k—是指为了作出分析决定前(构造分析表时)而向 前看的输入符号的个数,通常是0或1。

分析表由action表和goto表两部分组成:

  • action[sm, ai]: 表示当状态sm面临输入ai时的动作动作主要包括四种:
    1.Shift s(移进): 将ai和s=action[sm, ai]压入栈中
    2.Reduce A→β(归约): 用产生式A→β归约
    3.Accept(接受): 停机,接受,成功
    4.Error(报错): 调用出错处理
  • goto[sm, Xi]: 表示当状态sm面对文法符号Xi时需要跳转到的下一状态

活前缀
栈中的文法符号串是当前(右)句型的前缀, 该前缀不包含句型句柄后面的符号,称之 为活前缀。

若S->*αAw->αβw是文法G的拓广文法G′中的 一个规范推导,符号γ是αβ的前缀,则称γ是G的 一个活前缀。也就是说γ是规范句型αβw的前缀, 但它的右端不超过该句型的句柄的末端


LR(0)项目
文法G每一个产生式的右部添加一个圆点,称为G 的一个LR(0)项目。

构造识别所有活前缀的NFA

  1. 文法开始符号形如S′→×S的项目是NFA的唯一初态
  2. 若项目i和j出自同一个产生式,且j的圆点只落后i 的圆点一个位置,就从i画一条边标志为Xi的弧到j
  3. 若项目i的圆点之后的符号是个非终结符号,如i为 X→α.Aβ,其中,A是非终结符号,就从项目i画ε弧 到所有A→.γ的项目。

识别文法G的某个活前缀γ的所有有效项目组 成的集合称为γ的有效项目集。

项目集的闭包(closure)
设I是文法G的一个LR(0)项目集合,closure(I)是指从I 出发,用以下三条规则构造的项目集:

  1. 每个I中的项目都属于closure(I)
  2. 若项目A→α·Bβ在closure(I)中,且B→γ是G的一 个产生式,如果B→·γ不在closure(I)中,则将B→·γ 加入closure(I)
  3. 重复执行规则(2),直到closure(I)不再增大为止

转移函数go(I, X)
若I是G的一个LR(0)项目集,X是一个文法符号, 定义: go(I, X)= closure(J) 其中,J={A→αX·β| 当A→α·Xβ属于I时}
go(I, X)称为转移函数, A→αX·β是A→α·Xβ的后继项目

定义
LR(0)文法: 假设一个识别文法G活前缀的DFA中的 每个状态不存在下述情况:

  • 既含移进项目又含归约项目(移进-归约冲突)
    项目集合中同时含有形如A→α.aβ和B→γ.的项目

  • 含有多个归约项目(归约-归约冲突)
    项目集合中同时含有形如A→α.和B→β.的项目

则称文法G是LR(0)文法

LR(0)分析表的构造

语法制导定义

语法制导定义是对上下文无关文法的推广

  • 每个文法符号和一个属性集合相关联
  • 每一个产生式和一个语义规则集合相关联。

属性可以是任何对象: 符号串、数字、类型、内存单元或其他对象

  • 综合属性:通过分析树中其子节点的属性 值计算出来
  • 继承属性:由该节点的兄弟节点及父节点 的属性值计算出来

综合属性用于“自下而上”传递信息。
继承属性用于“自上而下”传递信息。


在一个语法制导定义中,产生式集合P中的任意产生 式A→α,都有与之相关联的一套语义规则,规则可 表示为b:=f(c1, c2, …, ck),其中f是一个函数,且满足 以下两种情况之一:

  • b是A的属性, 且c1, c2, …, ck是α中的文法符号的 属性,则称b是文法符号A的综合属性
  • b是α中某个文法符号的属性,且c1, c2, …, ck是A或 α中任何文法符号的属性,则称b是α中该符号的继承属性

两种情况下,都可以说属性b依赖于属性c1, c2, …, ck


  • 非终结符(开始符号除外)既可有综合属性也可有继承属性
  • 文法开始符号没有继承属性
  • 终结符号只有综合属性
0 0
原创粉丝点击