程序语言的基本知识
符号串集合的运算
A+B(A∪B)={w|w∈A,or w∈B}
A∗B(AB)={xy|x∈A and y∈B}
A0={ε},An=An−1A
∑∗:表示由字母表∑中的符号组成的符号串集合,是一个无穷集
∑+=∑∗−{ε}
∑∗,∑+分别成为Kleene闭包和正闭包
文法和语言
语言的描述
- 如果语言是有穷的(只包含有穷个句子),可以将 所有的句子列出来
- 如果语言是无穷的,则要找出语言的有穷表示 (生成方式(文法),识别方式(自动机))$
文法的概念
文法G是一个四元组G={VT,VN,S,P}
- VT是终结符号集
- VN是非终结符号集
- 其中VT∩VN=⊘,V=VN∪VT是词汇表
- S是开始符号
- P是产生式规则集合
- P=α→β|α至少包含一个非终结符号
句型和句子
1.如果存在推导S⇒∗α,则称α是一个句型
2.如果α是一个句型,并且α∈V∗T,则称α是一个句子,即只包含终结符号的句型
特殊形式的推导
1.最左推导:每一步的推导都施加在句型的最左边的非终结符号上(左句型)
2.最右推导:每一步的推导都施加在句型的最右边的非终结符号上(右句型)
文法到字符称为推导
字符到文法称为归约
一棵分析树可能对应若干个推导,但是一棵分析树对应一个最左推导,也只能对应一个最右推导
句型分析
- 短语:分析树中以非终结符号为子树根节 点的所有叶子节点序列
- 直接短语:直接短语是句型的分析树中 非终结符号的直接子节点构成的符号串(只有两代父子的子树)
- 句柄: 最左边的直接短语
- 素短语:短语,并且至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。
- 最左素短语:句型最左边的素短语。
素短语:
- β是句型αβδ相对于A的一个短语
- 至少含有一个终结符
- β除自身外不含更小的带终结符的短语
- 称β是句型αβδ相对于 A 的一个素短语
分析树和二义性
- 如果一个文法的句子有两棵或两棵以上的分析树, 称此句子是二义的
- 最左(右)推导与分析树一一对应,句子二义说明 它有两个或以上最左(右)推导
- 如果一个文法包含二义性的句子,则称这个文法是 二义性的; 否则,该文法是无二义性的。
- 产生某上下文无关语言的每一个文法都是二义的, 则称此语言是先天二义的。
- 如果产生式集中一个非终结符号既存 在左递归(A ⇒+ Aα)又存在右递归(A ⇒+ βA)现 象,那么该文法是二义的。
四种类型的文法
- 0型,短语结构文法(PSG)
- 1型,上下文有关文法(CSG)
- 2型,上下文无关文法(CFG)
- 3型,正规文法(RG)
乔姆斯基语言体系
对于文法G是一个四元组G={VT,VN,S,P},α→β∈P
- 0 型文法: |α|≠0,L(G)是0型语言——其识别系统是图灵机
- 1型文法: |α|≤|β|,L(G)是1型语言(上下文有关语言)——其识 别系统是线性有界自动机
- 2型文法: α∈ VN ,|α|=1,L(G)是2型语言(上下文无关语 言)——其识别系统是下推自动机
- 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)
- 没有 ε 边转移
- 一个状态面临一个输入符号时最多只转移到一个状态
NFA和DFA
如果一个语言可以被一个DFA识别, 则一定存在一个NFA,可以识别同一个语言, 反之亦然!
#####DFA的最小化
基本思想: 寻找等价状态,合并之
等价状态必须满足两个条件:
1. 一致性条件 — 状态 s 和 t 必须同时为接受状态 或非接受状态
2. 蔓延性条件 — 对于所有的输入符号,状态 s 和 t 必须转移到等价的状态中
语法分析
- 自顶向下分析
- 自底向上分析
不确定的自顶向下分析(递归下降方法)
- 分析树从上到下,从左到右的构建过程
- 从开始符号作为根节点出发,按顺序尝试该非终结符号的所有规则
消除文法的左递归
- 直接左递归 N→Nα
- 间接左递归 N→Aα,A→Bβ,B→Nγ
- 潜在的左递归 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)
- 把输入结束符$放入开始符号S的FOLLOW集
- 对于形如A→αBβ的产生式,将FIRST(β)-{ε}放 入FOLLOW(B)中
- .如果存在产生式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
- 文法开始符号形如S′→×S的项目是NFA的唯一初态
- 若项目i和j出自同一个产生式,且j的圆点只落后i 的圆点一个位置,就从i画一条边标志为Xi的弧到j
- 若项目i的圆点之后的符号是个非终结符号,如i为 X→α.Aβ,其中,A是非终结符号,就从项目i画ε弧 到所有A→.γ的项目。
识别文法G的某个活前缀γ的所有有效项目组 成的集合称为γ的有效项目集。
项目集的闭包(closure)
设I是文法G的一个LR(0)项目集合,closure(I)是指从I 出发,用以下三条规则构造的项目集:
- 每个I中的项目都属于closure(I)
- 若项目A→α·Bβ在closure(I)中,且B→γ是G的一 个产生式,如果B→·γ不在closure(I)中,则将B→·γ 加入closure(I)
- 重复执行规则(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中的 每个状态不存在下述情况:
则称文法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
- 非终结符(开始符号除外)既可有综合属性也可有继承属性
- 文法开始符号没有继承属性
- 终结符号只有综合属性