编译原理基础
在计算机编程中,我们需要将人们写的高级语言源程序翻译成处理机可运行的目标程序,这个过程成为编译程序.
狭义的理解,当这个目标程序为低级语言,即汇编或者机器吗的时候,我们把这种由高级语言到机器相关的语言之间的转换过程成为编译.
编译程序: 完成编译过程的汇编或二进制程序.
编译型语言 vs 解释型语言
高级语言源程序若可以直接进行执行,我们将这种语言称为解释型语言,这种语言不可能直接在机器上运行,通常需要解释器的支持,这种执行过程成为解释执行.
编译型语言最终生成机器码,可执行的二进制文件.
- | 编译型语言 | 解释型语言 | 半编译半解释型语言 |
---|---|---|---|
代表语言 | C/C++ | shell, python | java |
执行效率 | 快 | 慢 | 中 |
编译过程
- 词法分析: 对源程序内的字符串进行扫描和分解,根据词法规则,识别出有意义的单词与符号.
- 语言分析: 根据语言的语法规则从单词符号串中识别出语法单位(表达式,声明,语句等)并进行语法检查.
- 语义分析,中间代码生成: 定义语言除语法外还要求一定的语义,对语言的语法单位赋予具体语义(内存,寄存器变量等),并用另一种语言(DAG,IR等)形式来描述.
- 代码优化: 对前阶段产生的代码进行等价代换或改造,为代码执行提高时间,空间效率.
- 目标代码生成: 对特定机器的目标代码生成,以及绝对指令代码的重定位等.
文法和语言
基本概念
- 字母表:元素的非空有穷集, Σ = { a , b , c } \Sigma=\{a, b, c\} Σ={a,b,c}
- 符号:字母表内的元素, 也称为字符.
- 符号串:符号的又穷序列, 符号的连接,长度有穷.
- 符号串的连接:符号串x与符号串y的连接,即为这两个符号串的拼接, 等于 xy.
- 集合的乘积: A B = { x y ∣ x ∈ A , y ∈ B } AB=\{xy | x\in A, y\in B \} AB={xy∣x∈A,y∈B}, 若 A = { a , b } , B = { c , d } A=\{a, b\}, B=\{c, d\} A={a,b},B={c,d}, 则 A B = { a c , a d , b c , b d } AB=\{ac, ad, bc, bd\} AB={ac,ad,bc,bd}.
- 符号串的幂运算: x n x^{n} xn = x x ⋯ x ⎵ n \underbrace{xx\cdots x}_n n xx⋯x, if n = 0, x 0 x^{0} x0 = ϵ \epsilon ϵ
- 集合的幂: A 0 A^{0} A0 = { ϵ } \{\epsilon\} {ϵ}, A n A^{n} An = A A ⋯ A ⎵ n \underbrace{AA \cdots A}_n n AA⋯A
- 集合的正闭包
A
+
A^{+}
A+与闭包
A
∗
A^{*}
A∗:
A + A^{+} A+ = A 1 A^1 A1 ∪ \cup ∪ A 2 A^2 A2 ∪ \cup ∪ ⋯ \cdots ⋯ ∪ \cup ∪ A n A^n An ⋯ \cdots ⋯
A ∗ A^* A∗ = A 0 A^0 A0 ∪ \cup ∪ A 1 A^1 A1 ∪ \cup ∪ A 2 A^2 A2 ∪ \cup ∪ ⋯ \cdots ⋯ ∪ \cup ∪ A n A^n An ⋯ \cdots ⋯ = { ϵ \epsilon ϵ} ∪ \cup ∪ A + A^+ A+ - 形式语言:符号串的集合称为形式语言,不考虑语义.每个形式语言都是字母表上的字符按照某种规则构成的所有符号串的集合.形式语言的描述方法为穷举法和描述法.
- 规则:也称产生式,是一个符号与一个符号串的有序对 (
A
,
A,
A,
β
\beta
β), 通常写作
A → β ( 或 A : : = β ) {A \to \beta} (或 A ::= \beta) A→β(或A::=β)
其中, A是规则左部, β \beta β为规则右部. 读作左部符号用右部的符号串定义或左部符号生成右部符号串.
规则指导了我们如何用规则中的符号串生成语言中的序列,即是说,规则规定了语言的语法结构. - 终结符: 不属于非终结符的符号,是一个语言的不可在分的基本符号.
- 非终结符:出现在规则左部,能派生出符号或符号串的符号,表示一定符号串的集合.
- 文法:规则的非空有穷集,表示为四元组
G
=
(
V
N
,
V
T
,
P
,
S
)
G = (V_N, V_T, P, S)
G=(VN,VT,P,S)
V N V_N VN: 规则中非终结符的集合;
V T V_T VT: 规则中终结符号的集合;
P P P: 文法规则的集合;
S S S: 一个非终结符,表示文法的开始符号;
文法的形式定义
四元组表示法:
G
=
(
V
N
,
V
T
,
P
,
S
)
G = (V_N, V_T, P, S)
G=(VN,VT,P,S)
规则集合表示法:
A
→
a
1
A
→
a
2
⋯
A
→
a
n
A \to a_1 \\ A \to a_2 \\ \cdots \\ A \to a_n
A→a1A→a2⋯A→an
四大要素中,其他三个都可以在规则集合中体现,因此文法的表示只使用规则的集合.
约定:第一条规则的左部为识别符号.
对于给定的语言,描述语言的文法不唯一.若不同文法,表述的符号串集合相同,也就是语言相同,称这中文法之间的关系为等价文法.
形式语言2文法
为给定的形式语言求解文法时,先枚举出一些符号串,再找规律,写出规则集合.
文法 是规则的集合 (非空有穷)
语言 是符号串的集合 (非空)
语言的形式定义
- 根据规则,由符号串到符号串的映射, 符号为 ⇒ \Rightarrow ⇒,根据使用规则的次数不同,将这种行为分别称为
- | 直接推导 | 推导 | 广义推导 |
---|---|---|---|
次数 | 1 | >=1 | >=0 |
符号 | ⇒ \Rightarrow ⇒ | ⇒ + \overset{+}\Rightarrow ⇒+ | ⇒ ∗ \overset{*}\Rightarrow ⇒∗ |
当使用规则的次数为零,既不使用规则时, S ⇒ \Rightarrow ⇒ S.
- 句型和句子:
设有文法 G [ S ] G[S] G[S](S是G的开始符号), 如果 S ⇒ ∗ x , x ∈ ( V N ∪ V T ) ∗ S \overset{*}\Rightarrow x, x \in (V_N \cup V_T)^* S⇒∗x,x∈(VN∪VT)∗, 则称符号串 x x x为文法 G [ S ] G[S] G[S] 的句型. S ⇒ ∗ x , x ∈ V T ∗ S \overset{*}\Rightarrow x, x \in {V_T}^* S⇒∗x,x∈VT∗, 则称 x x x是文法 G [ S ] G[S] G[S]的句子.
因此,
同一文法中,同一句型的推导未必唯一,是由于推导过程中,选择非终结符的次序不唯一导致.
- 规范推导:最右推导,在对某个句型的推导过程中,优先选择右边的非终结符使用规则推导,最左推导同理.
- 规范规约:规约是推导的逆过程,规范推导也成最左规约,规范规约.
- 递归规则:
规则名 | 规则形式 |
---|---|
左递归 | A → A ⋯ A \to A \cdots A→A⋯ |
右递归 | A → ⋯ A A \to \cdots A A→⋯A |
规则递归 | A → ⋯ A ⋯ A \to \cdots A \cdots A→⋯A⋯ |
- 文法递归性:
文法递归性 | 推导形式 |
---|---|
文法左递归 | A ⇒ + A ⋯ A \overset+\Rightarrow A \cdots A⇒+A⋯ |
文法右递归 | A ⇒ + ⋯ A A \overset+\Rightarrow \cdots A A⇒+⋯A |
文法递归 | A ⇒ + ⋯ A ⋯ A \overset+\Rightarrow \cdots A \cdots A⇒+⋯A⋯ |
- 短语:在某一文法中,对某个句型 α β δ \alpha \beta \delta αβδ而言,若可通过某个非终结符 A A A推导出该句型的子串 β \beta β,则称子串 β \beta β是该句型 α β δ \alpha \beta \delta αβδ的短语,相对于非终结符 A A A的.
- 直接短语: 在短语的推导过程中,若 β \beta β是被 A A A直接推导出的,即 A ⇒ β A\Rightarrow \beta A⇒β,则称 β \beta β为句型 α β δ \alpha \beta \delta αβδ 的直接短语,相对于非终结符 A A A.
- 句柄: 最左直接短语,此最左并非最左推导的最左,而是位置在语法树的最左端之意.
文法2语言
与语言2文法的过程类似,从文法开始符号出发,反复使用规则,对非终结符展开,找出规律,描述语言.
同一语言,文法未必唯一;
同一文法,语法树未必唯一;
语法树
设文法 G = ( V N , V T , P , S ) G = (V_N, V_T, P, S) G=(VN,VT,P,S), 对 G G G的任何句型都能构造与之关联的满足下列条件的一颗语法树:
- 每个结点都有一个标记,次标记是 V = V N ∪ V T ∪ { ϵ } V = V_N \cup V_T \cup \{\epsilon\} V=VN∪VT∪{ϵ}中的一个符号
- 树根的标记是文法的开始符号 S S S
- 若某一结点至少还有一个分支结点,则该结点上的标记一定是非终结符
- 若 A A A的结点有 k k k个分之结点,其分之结点标记为 A 1 , A 2 , ⋯   , A k A_1, A_2, \cdots ,A_k A1,A2,⋯,Ak, 则 A → A 1 A 2 ⋯ A k A \to A_1A_2 \cdots A_k A→A1A2⋯Ak 一定是 G G G的一条规则.
文法二义性的消除
文法二义性的消除,是对某句型产生的多个语法树进行规范的过程.
- 不改变现有语法规则,仅加入非形式化规定
- 构造等价的无二义性文法
- 对与地柜定义的语法,我们只能通过反例来证明一个文法有二义性,却无法证明一个文法完全无二义性.
文法的分类
通过对文法限制条件的增加来分类:
名称 | 限制条件 |
---|---|
0型文法(无限制文法) | 对于每条规则 α → β \alpha \to \beta α→β ,其中 α ∈ ( V N ∪ V T ) ∗ \alpha \in (V_N \cup V_T)^* α∈(VN∪VT)∗ 且至少含一个非终结符, β ∈ ( V N ∪ V T ) ∗ \beta \in (V_N \cup V_T)^* β∈(VN∪VT)∗ |
1型文法(上下文相关文法) | 对于每条规则 α A β → α u β \alpha A \beta \to \alpha u \beta αAβ→αuβ, 其中 A ∈ V N , α , β ∈ ( V N ∪ V T ) ∗ , u ∈ ( V N ∪ V T ) + A \in V_N, \alpha, \beta \in (V_N \cup V_T)^*, u \in (V_N \cup V_T)^+ A∈VN,α,β∈(VN∪VT)∗,u∈(VN∪VT)+ |
2型文法(上下文无关文法) | 规则形式为 A → β A \to \beta A→β, 其中 A ∈ V N , β ∈ ( V N ∪ V T ) ∗ A \in V_N, \beta \in (V_N \cup V_T)^* A∈VN,β∈(VN∪VT)∗ |
3型文法(正规文法) | 当规则为 A → α B A \to \alpha B A→αB 或 A → α A \to \alpha A→α,其中 A , B ∈ V N , α ∈ V T ∗ A, B \in V_N, \alpha \in V_T^* A,B∈VN,α∈VT∗ 时称右线性文法,左线性文法同理 |