编译原理二:编译的基础知识

1,236 阅读11分钟

高级语言

高级语言:程序语言是一个记号系统,包括语法和语义两部分组成

语法

语法任何语言程序都可以看成是一定字符集(字母表) 上的字符串,语法使得这串字符形成一个形式上正确的程序

语法=词法规则+语法规则语法=词法规则+语法规则

例如:0.5*x1+c

  • 0.5、x1、c、*、+是语言的单词符号
  • 0.5*x1+c是语言的语法单位 单词符号 :语言中具有独立意义的最基本结构

语法单位:表达式、子句、语句、函数、过程、程序

词法规则规定了字母表中那些字符串是单词符号,单词符号一般包括:关键字、标示符、常量、运算符、界限符。我们用正规式和有限自动机理论来描述词法结构 和进行词法分析

语法规则规定了如何从单词符号来形成语法单位。现在多数程序语言使用上下文无关文法来描述语法规则。

语言的词法规则和语法规则定义了程序的形 式结构,是判断输入字符串是否构成一个形 式上正确的程序的依据*

语义

语义对于一个语言来说,不仅要给出它的词法、语法 规则,而且要定义它的单词符号和语法单位的意义

  • 离开语义,语言只是一堆符号的集合。
  • 各种语言中有形式上完全相同的语法单位,含义却不尽相同
  • 对某种语言,可以定义一个程序的意义的一组规 则称为语义规则
  • 目前,大多数编译程序使用基于属性文法的语法,制导翻译方法来分析语义

字母表与符号串

相关概念

  • 字母表是符号的非空有穷集合,用Σ、V表示。例:二进制字母表:{ 0,1 } 、ASCII字符集 、Unicode字符集。
  • 符合是语言中最基本的不可再分的单位,例如 字母、数字、标点符号等。
  • 符号串是字母表中符号组成的有穷序列
    • 串s的长度,通常记作|s|,是指s中符号的个数,例: |aab|=3
    • 空串,不含有任何符号的串称作空串,串长度为0,用 ε(epsilon)表示,|ε|= 0
  • 句子:字母表上符合某种规则构成的串。
  • 语言:是字母表上符合某种规则的语句组成的。字母表上语言:是字母表上正闭包的子集

约定用a,b,c...表示符号;用α,β,γ...表示符号串; 用A,B,C...表示其集合

字母表上的运算

字母表∑1和∑2的乘积( product)

12=aba1,b2∑1∑2 ={ab|a ∈ ∑1, b ∈ ∑2}

例: {0, 1} {a, b} ={0a, 0b, 1a, 1b}

∈ 表示元素和集合之间的关系。若a∈A,则a属于集合A,a是集合A中的元素。

字母表∑的n次幂( power)

字母表∑的n次幂:长度为n的符号串构成的集合

0=ε∑0 ={ ε }
n=n1,n1∑n =∑n-1 ∑ , n ≥ 1

例: {0, 1}3 ={0, 1} {0, 1} {0, 1} ={000, 001, 010, 011, 100, 101, 110, 111}

字母表∑的正闭包( positive closure)

字母表∑的正闭包:长度正数的符号串构成的集合

+=23...∑+ = ∑∪∑2∪∑3∪...

例:{a, b, c, d }+ = {a, b, c, d, aa, ab, ac, ad, ba, bb,bc, bd, ..., aaa, aab, aac, aad, aba, abb, abc, ...}

字母表∑的克林闭包(Kleene closure)

字母表∑的闭包(克林闭包):任意符号串(长度可以为零)构成的集合

=0+=023...∑* = ∑0∪∑+ = ∑0∪∑∪∑2∪∑3∪...

{a, b, c, d }* = {ε, a, b, c, d,aa, ab, ac, ad, ba, bb, bc, bd, ..., aaa, aab, aac, aad, aba, abb, abc, ...}

串上的运算

连接

  • 如果 x和y是串,那么x和y的连接(concatenation)是把y附加到x后面而形成的串,记作xy。 例如,如果 x=dog且 y=house,那么xy=doghouse
  • 空串是连接运算的单位元( identity),即,对于任何串s都有,εs=sε=sεs = sε = s

设x,y,z是三个字符串,如果 x=yz, 则称y是x的前缀,z是x的后缀

串s的幂运算:将n个s连接起来

s0=εs0= ε
sn=sn1s,n1sn = sn-1s , n ≥1
s1=s0s=εs=ss2=sss3=sss...s1 = s0 s = εs = s,s2 = ss,s3 = sss,...

例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,...

文法与语言的关系

文法是描述语言的语法结构的形式规则。

例如下图为自然语言句子的构成规则 截屏2021-03-14 下午3.57.22.png

文法的形式化定义

G=(VT,VN,P,S)G=(VT ,VN ,P,S)
  • VT :终结符集合 终结符是文法所定义的语言的基本符号,有时也称为token。语言中不可再分割的字符串(包括单个字符 组成的串)。注:终结符是组成句子的基本单位

例: VT = { apple, boy, eat, little }

  • VN:非终结符集合 非终结符(nonterminal) 是用来表示语法成分的符号, 有时也称为“语法变量”。出现在规则的左部、用<>括起来、表示一定语法概念的词

例: VN = { <句子>, <名词短语>, <动词短语>, <名词>, ... }

  • P :产生式集合 产生式( production)描述了将终结符和非终结符组合成串的方法 产生式的一般形式。αβα→β,读作:α定义为β
  1. α∈(VT∪VN)+,且α中至少包含VN中的一个元素:称为产生式的头 (head ) 或左部(left side)
  2. β∈(VT∪VN)* :称为产生式的体(body)或右部(right side)
VTVN=ΦVT ∩VN=Φ
VTVN:文法符号集VT∪VN :文法符号集

例:

P =<句子> -><名词短语> <动词短>;<名词短语>=><形容词><名词短语>

产生式的简写:

对一组有相同左部的α产生式

αβ1,αβ2,...,αβnα→β1 , α→β2 , ... , α→βn

可以简记为:

αβ1β2...βnα→β1 | β2 | ... | βn

读作: α定义为β1,或者β2,...,或者βn 。

β1,β2,...,βn称为α的候选式(Candidate) WeChat141438e035e66bee1eb46b3306d69ca1.png

  • S :开始符号 表示所定义的语法范畴的非终结符,开始符号又称为识别符号 WeChatda5d2612f52f8fe7094dde207677790e.png

符号约定

  • 下述符号是终结符

    1. 字母表中排在前面的小写字母,如a、b、c
    2. 运算符,如+、*等
    3. 标点符号,如括号、逗号等
    4. 数字0、1、. . . 、9
    5. 粗体字符串,如id、if等
  • 下述符号是非终结符

    1. 字母表中排在前面的大写字母,如A、B、C
    2. 字母S。通常表示开始符号
    3. 小写、斜体的名字,如expr、stmt等
    4. 代表程序构造的大写字母。如E(表达式)、T(项) 和F(因子)
  • 字母表中排在后面的大写字母(如X、Y、Z) 表示文法符号(即终结符或非终结符)

  • 字母表中排在后面的小写字母(主要是u、v、. . . 、z) 表示终结符号串(包括空串)

  • 小写希腊字母,如α、β、γ,表示文法符号串(包括空串)

  • 除非特别说明,第一个产生式的左部就是开始符号

有了文法(语言规 则),如何判定一 个词串是否是满足 文法的句子?这就用到了推导和归约

  • 句子的推导(派生)-从生成语言的角度
  • 句子的归约 -从识别语言的角度

推导 (Derivations)和归约(Reductions)

推导是从开始符号开始,通过使用产生式的右部取代左部,最终能产生语言的一个句子的过程。

最左(右)推导:每次使用一个规则,以其右部 取代符号串最左(右)非终结符,最左推导和最右推导称为规范推导。

归约是推导的逆过程,即,从给定的源语言的句子 开始,通过规则的左部取代右部,最终达到开始符 号的过程。

最左(右)归约是最右(左)推导的逆过程,最左归约和最右归约称为规范归约。

给定文法G=(VT , VN , P , S ),如果 α→β∈P,那么 可以将符号串γαδ中的α替换为β,也就是说,将γαδ 重写(rewrite)为γβδ,记作 γαδ =>γβδ。此时,称文法 中的符号串 γαδ 直接推导(directly derive)出 γβδ

如果α0=>α1,α1=>α2,α2=>α3,...,αn-1=>αn,则 可以记作α0=>α1=>α2=>α3=> ...=>αn-1=>αn,称符 号串 α0经过n步推导出αn,可简记为α0=>n αn

  • α =>0 α
  • =>+表示“经过正数步推导”
  • =>*表示“经过若干(可以是0)步推导” 例子: 截屏2021-03-15 下午7.24.29.png 用图示化方式表示: 截屏2021-03-15 下午7.24.38.png 可能会有多种形式,这就用到了语义分析: 截屏2021-03-15 下午7.24.50.png

句型、句子和语言

句型:从文法的开始符号S开始,每步推导(包括0步推导)所得到的字符串α。记作:S =>* α,α∈(VT∪VN)*,α是G的一个句型

一个句型中既可以包含终结符,又可以包含非终结符,也可能是空串

句子:是仅含终结符的句型。

例如: WeChata72f292b90ebd61f495a0c04c37d9463.png 语言:由文法G的开始符号S推导出的所有句子构成 的集合称为文法G生成的语言,记为L(G )。 WeChat390832c0a923f4ad9a086e0347e5f07c.png

WeChatec8d6dede41a523d4ad24e27d13ba38d.png

文法规则的扩充表示:

  • 提因子:例:把U→ax|ay|az 改写为U→a(x|y|z)
  • 重复次数的指定:例:<标识符>→<字母>{<字母>|<数字>}50
  • 任选符号:例:<整数>→[+|-]<数字>{<数字>}

元语言符号:

用来说明文法符号之间关系的符号,如,“→”和 “|”称为元语言符号。

文法的分类

  • 0型文法 (Type-0 Grammar)
  • 1型文法 (Type-1 Grammar)
  • 2型文法 (Type-2 Grammar)
  • 3型文法 (Type-3 Grammar)

备注:∀:全称量词。表示任意的、所有的等

αβα →β

0型文法(Type-0 Grammar)

无限制文法(Unrestricted Grammar) /短语结构文法 (Phrase Structure Grammar, PSG ) P中产生式α→β其中α∈V+并至少含有一个非终结 符, β∈V* V=VT∪VN

αβPα中至少包含1个非终结符∀α → β∈P, α中至少包含1个非终结符

0型语言:由0型文法G生成的语言L(G )

  • 识别0型语言的自动机称为图灵机(TM)
  • 型文法是对产生式限制最少的文法
  • 任何0型语言都是递归可枚举的
  • 对0型文法产生式的形式作某些限制,可得到其 他类型文法的定义

1型文法 (Type-1 Grammar)

上下文有关文法(Context-Sensitive Grammar , CSG ),CSG中不包含ε-产生式

αβPαβ∀α → β∈P,|α|≤|β|

产生式的一般形式: α1Aα2 → α1βα2 ( β≠ε )

上下文有关语言(1型语言):由上下文有关文法 (1型文法) G生成的语言L(G )

注: a)1型文法又称为长度增加文法、上下文有关文 法; b)识别1型语言的自动机称为线性界限自动机 (LBA) ; c)1型文法意味着,对非终结符进行替换时 务必考虑上下文,并且,一般不允许替换成ε ,除 非是开始符号产生ε

2型文法 (Type-2 Grammar)

上下文无关文法(Context-Free Grammar, CFG)

αβPαVN∀α → β∈P,α∈VN

产生式的一般形式:A→β

上下文无关语言(2型语言):由上下文无关文法 (2型文法) G生成的语言L(G )

:a)2型文法对产生式的要求是:产生式左部一定是非终结符,产生式右部可以是VN、VT或ε ;非终结符的替换不必考虑上下文;b)识别2型语言的自动机称为下推自动机(PDA);c)2型文法也称为上下文无关文法。

例:

  • S → L | LT
  • T → L | D | TL | TD
  • L → a | b | c | d |...| z
  • D → 0 | 1 | 2 | 3 |...| 9

3型文法 (Type-3 Grammar)

正则文法((Regular Grammar, RG),正则文法能描述程序设计语言的多数单词

右线性(RightLinear)文法:AwBAw右线性(Right Linear)文法: A→wB 或 A→w
左线性(LeftLinear)文法:ABwAw左线性(LeftLinear) 文法:A→Bw或A→w

正则语言(3型语言):由正则文法 (3型文法) G生成的语言L(G )

: a)3型文法也称为正规文法RG、右线性文法或左线性文法;b) 3型文法中的产生式要么均是右线性产生式,要么是左线性产生式,不能既有左线性产生式,又有右线性产生式;若所有产生式均是左线性,则称为 左线性文法;若所有产生式均是右线性,则称为右线性文法;c)识别3型语言的自动机称为有限状态自动机

例 (右线性文法)

  • 1S→a|b|c|d
  • 2 S → aT | bT | cT | dT
  • 3 T → a | b | c | d | 0 |1 | 2 |3 |4 |5
  • 4 T → aT | bT | cT | dT | 0T | 1T | 2T | 3T | 4T | 5T

3型文法是判断单词是否正确的文法,2型文法是判断句子是否正确的文法。

注意:在词法分析和语法分析中对产生式有限制:

  • 不存在P →P产生式
  • 产生式中出现的任何非终结符P必须有用。
    • 从开始符号S出发,存在推导S →αPβ(0步或者多步骤)
    • P必须能推导出终结符串。

四种文法之间的关系

  • 逐级限制:
    • 0型文法:α中至少包含1个非终结符
    • 1型文法(CSG) :|α|≤|β|
    • 2型文法(CFG) :α ∈ VN
    • 3型文法(RG):A→wB 或 A→w (A→Bw 或A→w)
  • 逐级包含 WeChatd6f7af3f031a55a8560801b90bcf6b90.png

CFG(上下文无关文法) 的分析树

截屏2021-03-15 上午10.02.20.png

  • 根节点的标号为文法开始符号
  • 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β
  • 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶 节点得到的符号串称为是这棵树的产出( yield )或边缘(f rontier)

分析树是推导的图形化表示

给定一个推导 S =>α1=> α2=>...=> αn ,对于推导 过程中得到的每一个句型αi,都可以构造出一个 边缘为αi的分析树 截屏2021-03-15 上午10.07.05.png

(句型的)短语

给定一个句型,其分析树中的每一棵子树的边缘称为该句 型的一个短语(phrase)

如果子树只有父子两代结点,那么这棵子树的边缘称为该句 型的一个直接短语(immediate phrase) 截屏2021-03-15 上午10.08.50.png 例: 截屏2021-03-15 上午10.09.17.png

二义性文法 (Ambiguous Grammar)

如果一个文法可以为某个句子生成多棵分析树, 则称这个文法是二义性

例1 截屏2021-03-15 上午10.10.11.png 例2 截屏2021-03-15 上午10.10.29.png 二义性文法的判定: 对于任意一个上下文无关文法,不存在一个算法, 判定它是无二义性的;但能给出一组充分条件, 满足这组充分条件的文法是无二义性的

  • 满足,肯定无二义性
  • 不满足,也未必就是有二义性的