1 Introduction to Compiling

Lexical&Syntax Analysis
Syntax-directed Translation
Optimization
Target Code Generation
Assembler
Linking
Source Code
Syntax Tree
Intermediated Code
Optimized Code
Assembling Code
Binary Code
Executable Code
OS
DLL

1.1 The Phases of a Compiler

在这里插入图片描述

2 语言与语法

2.1 基本术语与概念

2.1.1 字母表和符号

  • 符号:语言中***不可再分***的单位;
  • 字母表:符号的非空有穷集合;

∑ , V \sum,V ,V或其他大写字母;

V 1 = { a , b , c } V_1=\{a,b,c\} V1={a,b,c}

V 2 = { + , − , 0 , 1 , . . . , 9 } V_2= \{+,-,0,1,...,9\} V2={+,,0,1,...,9}

∑ = { x ∣ x ∈ A S C I I 字 符 } \sum = \{x|x\in ASCII字符\} ={xxASCII}

2.1.2 符号串

  • 字母表上的符号的有穷集合

a, b, c, abc, bc,…:V1上的符号串

1250, +2, -1835,…:V2上的符号串

空串(ε):不含任何符号的串

2.1.3 语句

  • 字符表上符合某种***构成规则***的符号串序列
  • a , b , c , . . . a,b,c,... a,b,c,...表示符号;用 α , β , γ , . . . \alpha,\beta,\gamma,... α,β,γ,...表示符号串;用 A , B , C , . . . A,B,C,... A,B,C,...表示符号或符号串的集合

2.1.4 语言

  • 某字母表上的句子集合

2.1.5 符号串集合的积

  • 设串集 A = { α 1 , α 2 , . . . } , B = { β 1 , β 2 , . . . } , A=\{\alpha_1,\alpha_2,...\},B=\{\beta_1,\beta_2,...\}, A={α1,α2,...},B={β1,β2,...},二者的笛卡尔积 A B = { α β ∣ α ∈ A , β ∈ B } AB=\{\alpha\beta|\alpha\in A, \beta\in B\} AB={αβαA,βB}

A = { a , b } , B = { c , e , d } , A=\{a,b\},B=\{c,e,d\}, A={a,b},B={c,e,d},那么 A B = { a c , a e , a d , b c , b e , b d } AB=\{ac,ae,ad,bc,be,bd\} AB={ac,ae,ad,bc,be,bd}

2.1.6 字符串集合的幂

  • A 0 = { ϵ } , A^0=\{\epsilon\}, A0={ϵ},
  • A n = A A n − 1 A^n=AA^{n-1} An=AAn1

∣ A ∣ = m , |A| = m, A=m,那么, ∣ A 0 ∣ = 1 , ∣ A 1 ∣ = m , ∣ A n ∣ = m n |A^0|=1,|A^1|=m,|A^n|=m^n A0=1,A1=m,An=mn

2.1.7 Kleene闭包和正闭包

  • Kleene闭包: A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ . . . A^*=A^0\cup A^1\cup A^2\cup... A=A0A1A2...
  • 正闭包: A + = A ∗ − { ϵ } A^+=A^*-\{\epsilon\} A+=A{ϵ}
  • 一个语言是其字母表上闭包的子集

2.1.8 文法Grammar

  • 表达语言构成规则的形式化方法 G = ( V N , V T , S , P ) G=(V_N,V_T,S,P) G=(VN,VT,S,P)

V N V_N VN:非终结符集

V T V_T VT:终结符集

S S S:文法开始符号

P P P:产生式 A → α A→\alpha Aα

< 句 子 > → < 主 语 > < 谓 语 > < 宾 语 > <句子> → <主语><谓语><宾语> <><><><>

2.1.9 推导与规约

  • 推导:使用产生式的右部取代左部的过程;
  • 归约:推导的逆过程,用产生式的左部取代右部的过程;

在这里插入图片描述

  • 最左推导和最右推导称为规范推导;
  • 最左归约和最右归约称为规范归约。

2.1.10 句型、句子与语言

  • 句型:从文法开始符号S开始,每步推导(包括0步推导)所得到的字符串 α \alpha α, S → α , 其中 α ∈ ( V N , V T ) ∗ S→\alpha,\text{其中}\alpha\in(V_N,V_T)^* Sα,其中α(VN,VT)
  • 句子:***仅含终结符***的句型;
  • 语言:由S推导所得的句子的集合

L ( G ) = { α ∣ S → α , 且 α ∈ V T ∗ } L(G)=\{\alpha|S→\alpha,且\alpha\in V_T^*\} L(G)={αSα,αVT},G为文法

2.1.11文法规则的递归定义

  • 非终结符的定义中包含了非终结符自身

设 ∑ = { 0 , 1 } 设\sum = \{0,1\} ={0,1}

< S > → < D > < S > < D > <S>\rightarrow<D><S><D> <S><D><S><D>

< D > → 0 ∣ 1 <D>\rightarrow0|1 <D>01

  • 使用递归定义时要谨慎,要有递归出口,否则,可能永远产生不出句子

2.1.12 扩充的BNF表示

  • ( ) () ()——提因子

U → a x ∣ a y ∣ a z 改 写 成 U → a ( x ∣ y ∣ z ) U\rightarrow ax|ay|az改写成U\rightarrow a(x|y|z) UaxayazUa(xyz)

  • { } \{\} {}——重复次数指定

< 标 识 符 > → < 字 母 > { < 字 母 > ∣ < 数 字 > } ( 0 ) ( 5 ) <标识符>\rightarrow<字母>\{<字母>|<数字>\}_{(0)}^{(5)} <><>{<><>}(0)(5)

  • [    ] [\ \ ] [  ]——任选符号

< 整 数 > → [ + ∣ − ] < 数 字 > { < 数 字 > } <整数>\rightarrow[+|-]<数字>\{<数字>\} <>[+]<>{<>}

2.2 文法与语言的形式定义

  • 表达语言构成规则的形式化方法 G = ( V N , V T , S , P ) G=(V_N,V_T,S,P) G=(VN,VT,S,P)

V N V_N VN:非终结符集

V T V_T VT:终结符集

S S S:文法开始符号

P P P:产生式 A → α A→\alpha Aα

V = ( V N ∪ V T ) V=(V_N\cup V_T) V=(VNVT),称作文法符号集合

2.2.1 Chomsky 0型文法

  • P 中 产 生 式 α → β , 其 中 α ∈ V + 并 且 至 少 含 有 一 个 非 终 结 符 , β ∈ V ∗ P中产生式\alpha\rightarrow\beta,其中\alpha\in V^+并且至少含有一个非终结符,\beta\in V^* Pαβ,αV+,βV

是对产生式限制最少的文法;识别0型语言的自动机称为图灵机™;对0型文法的产生式作某些限制,可以得到其他类型的文法;

2.2.2 Chomsky 1型文法

  • 1.   α → β , 除 可 能 有 S → ϵ 外 均 有 ∣ β ∣ ≥ ∣ α ∣ , 若 有 S → ϵ , 规 定 S 不 得 出 现 在 产 生 式 右 部 1.\ \alpha\rightarrow\beta,除可能有S\rightarrow\epsilon外均有|\beta|\ge|\alpha|,若有S\rightarrow\epsilon,规定S不得出现在产生式右部 1. αβ,Sϵβα,Sϵ,S;
  • $1^`.\ \alpha\rightarrow\beta,除可能有S\rightarrow\epsilon外均有\alpha A\beta \rightarrow\alpha\gamma\beta, 其中\alpha,\beta\in V^*,A\in V_N,\gamma\in V^+ $;

长度增加文法(上下文有关文法)

1型文法对非终结符进行替换时必须考虑上下文;

除文法开始符号外不允许将其它的非终结符替换成 ϵ \epsilon ϵ;识别1型语言的自动机称为线性界限自动机(LBA);

2.2.3 Chomsky 2型文法

  • P 中 产 生 式 具 有 形 式 A → β , 其 中 A ∈ V N , β ∈ V ∗ P中产生式具有形式A\rightarrow\beta,其中A\in V_N,\beta\in V^* PAβ,AVN,βV

产生式左部一定是非终结符,产生式右部可以是 V N 、 V T 或 ϵ V_N 、V_T或\epsilon VNVTϵ

非终结符的替换不必考虑上下文,故也称作上下文无关文法;识别2型语言的自动机称为下推自动机(PDA)。

2.2.4 Chomsky 3型文法

  • P 中 产 生 式 具 体 形 式 A → α B , A → α . 或 者 A → B α , A → α , 其 中 A , B ∈ V N , α ∈ V + P中产生式具体形式A\rightarrow\alpha B,A\rightarrow\alpha.或者A\rightarrow B\alpha,A\rightarrow \alpha,其中A,B\in V_N,\alpha\in V^+ PAαB,Aα.ABα,Aα,A,BVN,αV+

也称为正规文法RG、线性文法:若所有产生式均是左线性,则称为左线性文法;若所有产生式均是右线性,则称为右线性文法。

产生式要么均是右线性产生式,要么是左线性产生式,不能既有左线性产生式,又有右线性产生式;识别3型语言的自动机称为有限状态自动机。

2.2.5 文法产生语言

例1- 3型

设 G 1 = ( { S } , { a , b } , S , P ) , 其 中 P 为 : ( 0 ) S → a S ( 1 ) S → a ( 2 ) S → b 设G_1=(\{S\},\{a,b\},S,P),其中P为:\\ (0)S\rightarrow aS\\ (1)S\rightarrow a\\ (2)S\rightarrow b G1=({S},{a,b},S,P),P(0)SaS(1)Sa(2)Sb

  • L ( G 1 ) = { a i ( a ∣ b ) ∣ i ≥ 0 } L(G_1)=\{a^i(a|b)|i\ge0\} L(G1)={ai(ab)i0}\

例2 - 2型

设 G 1 = ( { S } , { a , b } , S , P ) , 其 中 P 为 : ( 0 ) S → a S b ( 1 ) S → a b 设G_1=(\{S\},\{a,b\},S,P),其中P为:\\ (0)S\rightarrow aSb\\ (1)S\rightarrow ab G1=({S},{a,b},S,P),P(0)SaSb(1)Sab

  • L ( G 2 ) = { a n b n ∣ n ≥ 1 } L(G_2)=\{a^nb^n|n\ge1\} L(G2)={anbnn1}

例3 - 1型

设 G 1 = ( { S , A , B } , { a , b , c } , S , P ) , 其 中 P 为 : ( 0 ) S → a S A B ( 1 ) S → a b B ( 2 ) B A → A B ( 3 ) b A → b b ( 4 ) b B → b c ( 5 ) c B → c c 设G_1=(\{S,A,B\},\{a,b,c\},S,P),其中P为:\\ (0)S\rightarrow aSAB\\ (1)S\rightarrow abB\\ (2)BA\rightarrow AB\\ (3)bA\rightarrow bb\\ (4)bB\rightarrow bc\\ (5)cB\rightarrow cc G1=({S,A,B},{a,b,c},S,P),P(0)SaSAB(1)SabB(2)BAAB(3)bAbb(4)bBbc(5)cBcc

  • L ( G 3 ) = { a n b n c n ∣ n ≥ 1 } L(G_3)=\{a^nb^nc^n|n\ge 1\} L(G3)={anbncnn1}

2.3 文法构造与文法简化

2.3.1 文法构造例子

  • 构造形如 a m i b n i a^{mi}b^{ni} amibni的语言的文法

S → a . . . a S b . . . b ∣ ϵ S\rightarrow a...aSb...b | \epsilon Sa...aSb...bϵ

  • a i b j , ( i ≥ 2 j , j ≥ 1 ) a^ib^j,(i\ge 2j,j\ge 1) aibj,(i2j,j1)

→ a i − 2 j a 2 j b j \rightarrow a^{i-2j}a^{2j}b^j ai2ja2jbj

  • S ∈ { a , b } ∗ , 限 制 a , b 个 数 S\in\{a,b\}^*,限制a,b个数 S{a,b},a,b

利用状态机方法解决

2.3.2 文法的简化

简化步骤:

  1. 删除形如P→P的产生式;
  2. 删除永不被使用的产生式,即由文法的开始符号无法推导出其左部;
  3. 删除不能从中导出终结符串的产生式;
  4. 整理产生式;

简化示例

(0)S → Be(5)B →Ce
(1)S → Ec(6)B → Af
(2)A → Ae(7)C → Cf
(3)A → e(8)D → f
(4)A → A
  • 简化后:
(0) S → Be(2)A → e
(1)A → Ae(3)B → Af

2.3.3 构造无 ϵ \epsilon ϵ产生式的上下文无关文法

满足条件:

  • 若P中含 S → ϵ S \rightarrow \epsilon Sϵ ,则S不出现在任何产生式右部,其中S为文法的开始符号;
  • P中不再含有其它任何e产生式。

变换算法:

G = ( V N , V T , P , S ) ⇒ G ‘ = ( V N ‘ , V T ‘ , P ‘ , S ‘ ) G = (V_N, V_T, P, S)\Rightarrow G^`=(V_N^`, V_T^`,P^`,S^`) G=(VN,VT,P,S)G=(VN,VT,P,S)

  1. G满足如下定义的非终结符集合

V 0 = { A ∣ A ∈ V N , A → + ϵ } V_0=\{A|A\in V_N,A\rightarrow^+\epsilon\} V0={AAVN,A+ϵ}

  1. 构造产生式集合 P ‘ P^` P
    1. 若产生式 B → a 0 B 1 a 1 B 2 … B k a k B\rightarrow a_0B_1a_1B_2…B_ka_k Ba0B1a1B2Bkak属于P,其中 a j ∈ V ∗ ( 0 ≤ j ≤ k ) , B i ∈ V 0 a_j \in V^* (0 \le j \le k),B_i \in V_0 ajV(0jk)BiV0,那么将这些 B i B_i Bi分别以 ϵ \epsilon ϵ B i B_i Bi本身这两种形式替代,然后将有关B的所有产生式扣除 ϵ \epsilon ϵ产生式后加入到P’中
    2. 其它产生式扣除 ϵ \epsilon ϵ产生式后(原来就有,或者由步骤1产生)也投入到P’中
    3. n如果P中有产生式 S → ϵ S\rightarrow\epsilon Sϵ(原来就有,或者由步骤1产生),且S出现在产生式的右部,则将它扣除并增加如下产生式: S ’ → ϵ ∣ S S’ \rightarrow \epsilon|S SϵS,将S’加入VN’,文法开始符号变为S’

例题

设 G 1 = ( { S } , { a , b } , P , S ) , 其 中 P : ( 0 ) S → ϵ ( 1 ) S → a S b S ( 2 ) S → b S a S 设G_1=(\{S\},\{a,b\},P,S),其中\\ P:\\ (0)S\rightarrow \epsilon\\ (1)S\rightarrow aSbS\\ (2)S\rightarrow bSaS G1=({S},{a,b},P,S),P:(0)Sϵ(1)SaSbS(2)SbSaS

  • V 0 = S V_0={S} V0=S
  • P ′ : S → a b S ∣ a S b S ∣ a S b ∣ a b S → b a S ∣ b S a S ∣ b S a ∣ b a S ′ → ϵ ∣ S P':S\rightarrow abS|aSbS|aSb|ab\\S\rightarrow baS|bSaS|bSa|ba\\S'\rightarrow\epsilon|S P:SabSaSbSaSbabSbaSbSaSbSabaSϵS
  • G 1 ′ = ( { S ′ , S } , { a , b } , P ′ , S ′ ) G'_1=(\{S',S\},\{a,b\},P',S') G1=({S,S},{a,b},P,S)

2.4 语法树与文法的二义性

2.4.1 语法树

(0) S→aB

(1)S→bA

(2)A → a

(3)A → aS

(4)A → bAA

(5)B → aBB

(6)B → bS

(7)B →b

在这里插入图片描述

2.4.2 基本术语

  • 子树:除叶子结点之外的任意结点连同它的所有子孙结点构成子树;
  • 修剪子树:剪去子树树根的所有子孙节点,对应于归约(一步或多步);
  • 句型:由树的末端符(叶结点)从左至右连成的串是文法的一个句型;
  • 短语:子树的末端符号自左到右连成串,相对于子树树根而言称为短语;
  • 简单短语(直接短语):若短语是某子树根经过1步推导得到的,则称之为该子树根的简单短语;
  • 句型的短语:某句型中的短语(属于某子树);
  • 句柄:句型中的最左简单短语。是最左归约时要寻找的简单短语;

2.4.3 文法的二义性

  • 如果文法的一个句子存在对应的两棵或两棵以上的语法树,则该句子是二义的;
  • 包含二义性句子的文法是二义文法;

评论:

  • 二义性会给语法分析带来不确定性;
  • 文法的二义性是不可判定的,即不存在算法,能够在有限步数内确切判定一个文法是否为二义文法;
  • 若要证明是二义性,只要举出一例;
  • 二义文法并非绝对必需去除的;
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐