2. 程序设计语言及其文法
2.1 词法语法分析基本概念
2.1.1 字母表
定义 字母表(Alphabet)是一个有穷符号集合,表示为 Σ。符号可以是:字母、数字、标点……
例如,二进制字母表 {0,1}、ASCII 字符集、Unicode 字符集。
2.1.2 字母表上的运算
定义 字母表的 乘积(Product)定义为:
Σ1Σ2={ab∣a∈Σ1,b∈Σ2}
例如:
{0,1}{a,b}={0a,0b,1a,1b}
定义 字母表的 n 次幂(Power)定义为:
{Σ0Σ1={ε}=Σn−1Σ,n⩾1
其中 ε 为空串。
例如:
{0,1}3={0,1}{0,1}{0,1}={000,001,010,011,100,101,110,111}
即字母表的 n 次幂是长度为 n 的符号串构成的集合。
定义 字母表的 正闭包(Positive Closure)定义为:
Σ+=Σ∪Σ2∪Σ3∪Σ4∪⋯=i=1⋃∞Σi
定义 字母表的 克林闭包(Kleene Closure)定义为:
Σ∗=Σ0∪Σ∪Σ2∪Σ3∪⋯=i=0⋃∞Σi
定义 设 Σ 是一个字母表,∀x∈Σ∗,x 称为 Σ 上的一个 串(String)。
串是字母表中符号的一个有穷序列。串 s 的长度,通常记作 ∣s∣,指 s 中符号的个数。
例如:
∣aab∣=3
空串用 ε(Epsilon)表示,∣ε∣=0
2.1.3 串上的运算
定义 x 与 y 的 连接(Concatenation),记作 xy,例如:
x=dog,y=house,xy=doghouse
任意字符串 s,有
εs=sε=s
若 x,y,z 是三个字符串,且 x=yz,则 y 为 x 的前缀,
z 为 x 的后缀。
定义 串的 n 次幂(Power)定义为:
{s0sn=ε=sns
2.2 文法定义
2.2.1 文法的定义
简化的英文文法举例:
<句子>→<名词短语>→<名词短语>→<动词短语>→<形容词>→<名词>→<名词>→<动词>→<名词短语><动词短语><形容词><名词短语><名词><动词><名词短语>littleboyappleeat
文法的定义:
G=(VT,VN,P,S)
定义 VT:终结符(Terminal Symbol)是语言的基本符号,也被称为 token,例如:
VT={apple,boy,eat,little}
定义 VN:非终结符(Nonterminal)是语法成分,也被称为“语法变量”,例如:
VN={<句子>, <动词短语>, <名词短语>,⋯}
定义 注意 VT∩VN=∅,VT∪VN 是 文法符号集。
定义 P:产生式(Production)描述 VT 与 VN 产生串的方式,一般形式:
α→β
读作:α 定义为 β。
定义 α∈(VT∪VN)+ 至少包含 VN 中的一个元素,称为产生式的 头(Head)或 左部(Left Side)。
β∈(VT∪VN)∗ 产生式的 体(Body)或 右部(Right Side)。
例如:
P={<句子>→<名词短语><动词短语>,⋯}
定义 S:开始符号(Start Symbol)是该文法中最大的语法成分
S∈VN
例如:
S=<句子>
2.2.2 简化后的算数表达式的文法
G=({id,+,∗,(,)},{E},P,E)
P={}E→E+EE→E∗EE→(E)E→id
约定:不引起歧义的前提下,可以只写产生式。
G:E→E+EE→E∗EE→(E)E→id
2.2.3 产生式的简写
对于一组有 相同左部 的 α 产生式
α→β1,α→β2,α→β3
可以简记为
α→β1∣β2∣⋯∣βn
读作:α 定义为 β1,或者 β2,……,或者 βn。
定义 β1,β2,⋯βn 称为 α 的 侯选式(Candidate)。
例如,上面的产生式可以写为
E→E+E∣E∗E∣(E)∣id
2.2.4 符号约定
下述符号是终结符:
- 字母表排在前面的小写字母,如 a,b,c
- 运算符,如 +,∗ 等
- 标点符号,如 (),
- 数字 0,1,2⋯,9
- 粗体字符串,如 id,if 等
下述符号是非终结符
- 字母表排在前面的大写字母,如 A,B,C
- 字母 S,通常表示开始符号
- 小写,斜体名字,如 expr,stmt 等
- 代表程序构造的大写字母,如 E(表达式)、T(项)、F(因子)
定义 字母表中排在后面的大写字母,如 X,Y,Z 表示 文法符号,既可以表示终结符也可以表示非终结符。
定义 字母表中排在后面的小写字母,如 u,v,w,x,y,z 表示 终结符号串(可能是空串)。
定义 小写希腊字母,如 α,β,γ 表示 文法符号串(也包括空串)。
除非特别说明,第一个产生式的左部就是开始符号。
2.3 语言的定义
2.3.1 推导和归约
定义 给定文法 G=(VT,VN,P,S),如果 α→β∈P,那么可以将符号串 γαδ 中的 α 替换为 β,也就是说,将 γαδ 重写(Rewrite)为 γβδ,记作 γαδ⇒γβδ。
定义 此时文法中的符号串 γαδ 直接推导(Directly Derive)出 γβδ。
简而言之,推导就是利用尝试的右部替换产生式的左部。
定义 如果 α0⇒α1,α1⇒α2,α2⇒α3,⋯,αn−1⇒αn 则可以记作 α0⇒α1⇒α2⇒α3⇒⋯⇒αn,称符号串 α0 经过 n 部 推导(Derivations)出 αn,可简记为 α⇒nαn
- α⇒0α 没有推导
- ⇒+ 表示经过正数步骤的推导
- ⇒∗ 表示经过若干步骤推导
例如,一个英文句子的文法:
<句子>→<名词短语>→<名词短语>→<动词短语>→<形容词>→<名词>→<名词>→<动词>→<名词短语><动词短语><形容词><名词短语><名词><动词><名词短语>littleboyappleeat
定义 自顶向下的过程是推导,自底向上的过程是 归约(Reductions)。
有了文法,如何判定某一个词串是否是该语言的句子。
- 句子的推导,从生成语言的角度
- 句子的归约,从识别语言的角度
2.3.2 句型和句子
定义 如果 S⇒∗α,α∈(VT∪VN)∗,则称 α 是 G 的一个 句型(Sentential Form)。
一个句型既可以包含终结符,也可以包含非终结符,也可以是空串。
定义 如果 S⇒∗w,w∈VT∗,则称 w 是 G 的一个 句子(Sentential)。
句子是不包含非终结符的句型。
定义 由文法 G 的开始符号 S 推导出的所有句子构成的集合称为 G 生成的语言,记为 L(G),即
L(G)={w∣S⇒∗w,w∈VT∗}
例如:
G:S→L∣LTT→L∣D∣TL∣TDL→a∣b∣c∣⋯∣zD→0∣1∣2∣⋯∣9
定义 这个文法生成的语言是 标识符,即字母开头的字母数字串。
2.3.3 练习:写出无符号整数和浮点数的文法
使用 正则表达式 表示如下(后续将讨论正则表达式)
- 无符号整数:
[1-9][0-9]*|0
- 浮点数文法:
[1-9][0-9]*|0\.[0-9]*((E|e)(+|-)?[1-9][0-9]*)?
这里只写出无符号整数的文法
G:S→A∣0A→A∣AB∣CB→0∣1∣2∣⋯∣9C→1∣2∣3∣⋯∣9
2.3.4 语言上的运算
L∪MLML0LnL+L∗={s∣s∈Lors∈M}={st∣s∈L,t∈M}={ε}=Ln−1L,n⩾1=i=1⋃∞Li=i=0⋃∞Li
例如,令 L={A,B,C,⋯,a,b,c,⋯,z},D={0,1,2,⋯,9},则 L(L∪D)∗ 表示的语言是 标识符。
2.4 文法的分类
2.4.1 Chomsky 文法分类体系
Chomsky 文法分类体系的语言分类如下:
- 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,α 至少包含一个非终结符。
由 0 型文法 G 生成的语言被称为 0 型语言 L(G)。
定义 1 型文法(Type-1 Grammar)是 上下文有关文法(Context-Sensitive Grammar, CSG)。
是在 0 型文法的基础上要求
∀(α→β)∈P,∣α∣⩽∣β∣
产生式的一部形式为
α1Aα2→α1βα2(β=ε)
CSG 中不包含 ε 产生式。
由上下文有关文法产生的语言叫做 上下文有关语言(1 型语言)。
定义 2 型文法(Type-2 Grammar)又叫做 上下文无关文法(Context-Free Grammar, CFG)。
要求
∀(α→β)∈P,α∈VN
产生式的一般形式为
A→β
定义 3 型文法(Type-3 Grammar)又叫做 正则文法(Regular Grammar, RG)
3 型文法分为两种:
- 定义 右线性(Right Linear)文法:A→wB 或者 A→w
- 定义 左线性(Left Linear)文法:A→Bw 或者 A→w
左线性文法和右线性文法都称为正则文法。
右线性文法例子
G:S→a∣b∣c∣dS→aT∣bT∣cT∣dTT→a∣b∣c∣d∣0∣1∣2∣3∣4∣5T→aT∣bT∣cT∣dT∣0T∣1T∣2T∣3T∣4T∣5T
此文法与
G:S→L∣LTT→L∣D∣TL∣TDL→a∣b∣c∣dD→0∣1∣2∣3∣4∣5
等价(这是一个上下文无关文法),另外还存在与此文法等价的左线性文法。
定义 由正则文法 G 生成的语言称为 正则语言 L(G)。
正则文法能描述程序设计语言的多数单词。
2.4.2 四种文法的关系
逐级限制的关系:
- 0 型文法:α 至少包含一个非终结符
- 1 型文法(CSG):∣α∣⩽∣β∣
- 2 型文法(CFG):α∈VN
- 3 型文法(RG):A→wB 或 A→w 或反过来
2.5 CFG 的分析树
2.5.1 举例分析
G:E→E+EE→E∗EE→(E)E→id
CFG 的分析树:
- 根节点的标号为文法的开始符号
- 内部节点表示对一个产生式 A→β 的应用,该节点的标号是此产生式左部 A,该节点的子节点的标号从左到右构成了产生式的右部 β
- 定义 叶节点的标号既可以是非终结符,也可以是终结符从左到右排列叶节点得到的符号串称为是这棵树的 产出(Yield)或者 边缘(Frontier)
2.5.2 分析树推导的图形化表示
给定一个推导 S⇒α1⇒α2⇒⋯⇒αn,对于推导过程中得到的每一个句型 αi,都可以构造出一个边缘为 αi 的分析树。
例如:
G:E→E+EE→E∗EE→(E)E→id
分析树:
推导过程
E⇒−E⇒−(E)⇒−(E+E)⇒−(id+E)⇒−(id + id)
2.5.3 句型的短语
定义 给定一个句型,其分析树中的每一个子树的边缘称为该句型的一个 短语(Phrase)。
定义 如果子树只有父子两代节点,那么这棵子树的边缘称为该句型的一个 直接短语(Immediate Phrase)。
上述例子的短语为 −(E+E),(E+E),E+E 等,直接短语是 E+E,直接短语一定是某个产生式的右部,但产生式的右部不一定是给定句型的直接短语。
例如:
<句子>→<动词短语>→<名词短语>→<动词>→<名词>→<动词短语><动词><名词短语><名词><名词短语>∣<名词>提高高人∣人民∣民生∣生活∣活水∣水平
句子 "提高人民生活水平"
中,"提高"
、"人民"
是直接短语,"高人"
、"活水"
是产生式的右部,但不是这个句子的直接短语。
2.5.4 二义性文法
定义 如果一个文法可以为某个句子生成多颗分析树,则称这个文法是二义性的。此文法被称为 二义性文法(Ambiguous Grammar)。
例如条件语句:
S→if E then S ∣if E then S else S ∣other
句型:
if E1 then if E2 then S1 else S2
可以构造两个分析树:
else
匹配第一个 if
else
匹配第二个 if
加入消歧规则:每个 else
和最近的尚未匹配的 if
匹配。那么此时选择第二种分析树。
2.5.5 二义性文法的判定
对于任意一个上下文无关文法,不存在一个算法判定它是无二义性的;但是能够给出一组充分条件,满足这组条件的文法是无二义性的。