title: 编译原理(0)
date: 2018-09-07 16:33:18
tags: 编译原理
categories: 编译原理
引论、文法和语言
引论
- 编译程序:把一种语言翻译成另一种语言的等价的程序,使得程序员不必考虑机器的细节,独立于机器。
- 编译过程:源程序 → \rightarrow →词法分析 → \rightarrow →语法分析 → \rightarrow →语义分析 → \rightarrow →中间代码生成 → \rightarrow →代码优化 → \rightarrow →目标代码生成 → \rightarrow →目标程序
- 解释程序的解释方式:
- 编译方式:先翻译后执行,将整个源程序翻译完毕再执行,只需要保留完整的目标程序而不需要保存源程序,一次翻译后可以多次执行,无需再次翻译。
- 解释方式:边翻译边执行,翻译一句执行一句,只需保留源程序,每执行一次就需要翻译一次。
文法和语言
文法:文法是阐述语法的一个工具,语句是语法的实例。
符号和符号串:
- 字母表:字母表是元素的非空有穷集合,其元素称为符号。
- 符号串:由字母表中的符号组成的任何有穷序列称为符号串。不含任何符号的符号串称为空串,记做
ε
ε
ε。
- 符号串长度: ∣ a ∣ |a| ∣a∣指符号串中符号的个数。
- 符号串集合:如果集合A的元素都是字母表∑上的符号串,则称集合A为∑上的符号串集合,简称串集。
- 符号串连接:设x和y是字母表∑上的符号串,在符号串x的最后一个符号之后顺序接上符号串y的符号得到的新符号串z,则称符号串z是由符号串x和符号串y经过连接运算的结果,记为 z = x ⋅ y z=x·y z=x⋅y,其中,·是连接运算符。
- 符号串方幂运算:设x是字母表∑上的符号串,z是由n(≥0)个x自身连接得到的符号串,则称符号串z是由符号串x的n次方幂运算的结果,记为 z = x n z = x^n z=xn 。特别约定, x 0 = ε x_0 =ε x0=ε, x 1 = x x_1=x x1=x 。
- 符号串集连接运算:设A,B为字母表∑上的符号串集合, ⋅ · ⋅是符号串集连接运算符,则 C = { x ⋅ y ∣ x ∈ A , y ∈ B } C = \{x·y |x∈A,y∈B\} C={x⋅y∣x∈A,y∈B} 因为对任意符号串,空串与其相连接均为该串本身,故空串集与任意串集相连接均为该串集自身。
- 符号串集方幂运算:设A是字母表∑上的符号串集,则C是由n(≥0)个A自身连接得到的符号串集,则称符号串集C是由符号串A的n次方幂运算的结果,记为C = An 。特别约定,A0 ={ε},A1=A 。
- 符号串集正闭包运算:设A是字母表∑上的符号串集, A + A^+ A+是 A A A的正闭包,则: A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ A 3 ∪ ⋅ ⋅ ⋅ ∪ A n ⋅ ⋅ ⋅ A^* =A^0∪A^1∪A^2∪A^3∪···∪A^n··· A∗=A0∪A1∪A2∪A3∪⋅⋅⋅∪An⋅⋅⋅。
规则:
字母表V上形如 α ∷ = β α∷=β α∷=β的式子,可以简写成 α → β α→β α→β。其中,符号串 α ∈ V + α∈V+ α∈V+称为规则的左部,符号串 β ∈ V ∗ β∈V* β∈V∗ 称为规则的右部。规则也称为重写规则、产生式或生成式。
对于相同左部的多个规则,可以使用符号 ∣ ∣ ∣简写。如,规则 α ∷ = β α∷=β α∷=β和 α ∷ = δ α∷=δ α∷=δ,简写成 α ∷ = β ∣ δ α∷=β∣δ α∷=β∣δ或者 α → β ∣ δ α → β∣δ α→β∣δ。
文法:
文法G定义为四元组(Vn,VT,P,S)。
-
其中:
- VN是非空有穷集合,称为非终结符集,其元素称为非终结符;
- VT是有穷集合,称为终结符集,其元素称为终结符;
- P是非空有穷集合,称为规则集,其元素是字母表VN∪VT上的规则,规则左部至少包含一个非终结符,VN∪VT称为文法的字母表V,且VN∩VT=Φ(不含公共的元素);
- S∈VN,称为开始符。
-
定义方式:
-
G1=(VN,VT,P,S),其中,VN ={S},VT ={a,b},P ={S→aSb,S→ab}
-
G1=({S},{a,b},P,S),其中,P={S→aSb,S→ab}
-
G1=({S},{a,b},{S→aSb,S→ab},S)
-
G1[S]: S→aSb,S→ab
-
推导与归约
直接推导与直接归约
- 直接推导:设文法G=(VN,VT,P,S),如果α→β∈P,则称γαδ推导出γβδ,记为γαδ⇒γβδ,其中,γ,δ∈V*。
- 直接归约:如果γαδ⇒γβδ,则也称为γβδ归约到γαδ。
多步推导与多步归约
- 多步推导:设文法G=(VN,VT,P,S),α,β∈(VN∪VT)*, 如果α,β之间存在推导序列:α= W0 ⇒ W1 ⇒ W2 ··· ⇒ Wn =β(n≥1),则称α经过n步推导出β,记为α⇒β。其中,Wi∈(VN∪VT)* (1≤i≤n)。α⇒β也称n步推导或多步推导。
- 多步归约:如果α⇒β,也称为β归约到α,也称为n步归约或多步归约。
零步或零步以上推导与归约
设文法 G = ( V N , V T , P , S ) , α , β ∈ ( V N ∪ V T ) ∗ G=(VN,VT,P,S),α,β∈(VN∪VT)^* G=(VN,VT,P,S),α,β∈(VN∪VT)∗,如果有α=β或α⇒β,则称α经过0步或0步以上推导出β,记为 α ⇒ ∗ β α⇒^*β α⇒∗β。亦称β经过0步或0步以上归约到α。
句型、句子和语言
- 句型:设G[S]是一个文法,如果符号串x是从识别符号推导出来的,即有 S ⇒ ∗ x S⇒^*x S⇒∗x,则称x是文法G[S]的句型。
- 若x仅由终结符号组成,即 S ⇒ ∗ x , x ∈ V T ∗ S⇒^*x,x∈V_T^* S⇒∗x,x∈VT∗,则称x是G[S]的句子。
- 语言:文法 G = ( V N , V T , P , S ) G=(VN,VT,P,S) G=(VN,VT,P,S)的产生语言定义为文法G的句子集合,记为L(G)。即: L ( G ) = { β ∗ ∗ ︱ ∗ ∗ S ⇒ β , β ∈ V T ∗ } L(G)={β**︱**S⇒β,β∈VT* } L(G)={β∗∗︱∗∗S⇒β,β∈VT∗}。
文法的类型
- 0型文法:设文法G=(VN,VT,P,S),如果任意α→β∈P,α中至少含有一个非终结符,则称文法G属于0型文法。0型文法,也称为短语文法。
- 1型文法:设文法G=(VN,VT,P,S),如果任意α→β∈P,α中至少含有一个非终结符,且除空规则之外,α的长度不大于β的长度,即**︱α︱≤︱β︱**,则称文法G属于1型文法。 1型文法,也称为上下文有关文法。
- 2型文法:设文法G=(VN,VT,P,S),如果任意α→β∈ P,α∈VN ,则称文法G属于2型文法。2型文法,也称为上下文无关文法。
- 3型文法:设文法G=(VN,VT,P,S),如果任意α→β∈ P,α∈ VN ,且β只能是aB或a(除空规则之外),则称文法G属于右线性3型文法。
从0型文法到3型文法,规则越来越严格了。
0型文法:可由图灵机识别(关于图灵机,百度百科描述很详细了。)
1型文法:上下文有关文法。(任何产生规则的左手端和右手端都可以被终结符和非终结符的上下文所围绕,乔姆斯基描述自然语言的一种方式介入的,在自然语言中一个单词是否可以出现在特定的位置要依赖于上下文。)
2型文法:上下文无关文法。之所以称为上下文无关文法,是因为在推导式中a->b ,字符a总可以被字符串b自由替换,而无需考虑字符a出现的上下文。
3型文法:正规语言,之所人称作正规语言(正则语言),可能是因为3型文法只有两种形式 A->aB A->a ,比较固定,规则明显,所以称为正规语言。(小菜这么想的)
文法的类型是对规则形式逐步加以限制而得,从0型文法到3型文法其规则形式逐步简单,表达力也逐渐变弱。
最左推导与最右推导:
在推导的每一步总是选择当前句型的最左(或最右)非终结符进行推导,这种过程称之为最左(最右)推导。其中最右推导也称之为规范推导,由规范推导得来的句型称为规范句型。规范推导的逆过程称之为规范归约。
语法树:
假设文法G=(VN,VT,P,S),则文法G的语法树是一个满足下列条件的多叉树:
-
以文法开始符S做为树根;
-
以终结符号或非终结符号做为树的其它结点,且子树根和其孩子结点分别是某规则的左部和右部。
-
推论:
- 非叶子结点一定是非终结符。
- 全部叶子结点组成的符号串是文法的句子。
语法二义性:
如果一个文法G,某个句子存在对应的至少两颗不同的语法树,则称文法G是二义性的。
- 推论:
- 如果文法是无二义性的,一个句子的语法树反映了该句子的全部推导过程。
- 如果文法是无二义性的,一个句子的最左(最右)推导是唯一的。
先天二义性:
二义性文法G可能存在与之等价的无二义性的文法G‘,如果一个语言不存在无二义性的文法,则称该语言为先天二义性的。
- 定理:文法的二义性判定问题是递归不可解的。
句型分析:
推导法(自上而下的分析方法):
从文法开始符号出发,反复使用规则,寻找匹配符号串(推导)的句型,直到推导出句子或规则用遍。
归约法(自下而上的分析方法):
从输入符号串a开始,逐步进行“归约”,直至归约出文法的开始符号S,则输入串a是文法G定义的语言的句子。
短语、直接短语、句柄:
-
短语:对文法G[S]的一个句型αβδ,如果有S=>*aAδ且A=>+β,则称β是句型αβδ相对于非终结符A的短语。
-
直接短语:特别的,如果有A=>β,则称β是句型αβδ相对于规则A->β的直接短语。
-
一个右句型的直接短语称为该句型的句柄。
-
推导树判别法:设A是句型αβδ的某一子树的的根,其中β是形成此子树的末端结点的符号串,则β是句型αβδ的相对于A的短语。若这个子树只有一层分支,则β是句型αβδ的直接短语。(补充:对于右句型,最左直接短语即是其句柄。)
限制规则:
- 有害规则 形如U→U的规则,称为有害规则。
- 不可达规则 不在任何规则右部出现的非终结符对应的规则,称为不可达规则。
- 不可终止规则 如果从某非终结符开始,不可能推导出任意终结串来,则该非终结符对应的规则称为不可终止规则。
不含有多余规则的文法,称为压缩过的文法。在后面讨论的文法时,都假设是压缩过的的文法。
ε规则:
ε规则:上下文无关文法中某些规则可具有形式A=>ε,其中A属于非终结符集。
-
在文法设计中,使用ε规则有时会带来方便,但会导致文法讨论和证明的复杂。
-
一个上下文无关文法G是否必须使用ε规则,完全取决于文法G产生的语言L(G[S])中是否含有ε语句。
可以证明:
- 如果ε∉L(G[S]),则存在一个等价的文法G’[S’] ,且G’ 不含ε规则。
- 如果ε∈ L(G[S]),则存在一个等价的文法G’[S’] ,且G’ 仅含S’ →ε的一个空规则。