[编译原理初探(一)]语法分析[1]
语法分析是编译过程的核心部分。
语法分析的基本任务是在词法分析识别出单词符号串的基础上,分析判断程序的语法结构是否符合语法规则。
语言的语法结构用上下文无关文法来描述,因此,语法分析器的任务本质上是按上下文无关文法的产生式,确定整个单词串是否构成语法上正确的程序。
语法分析的方法通常分为两类:
自上而下分析法和自下而上分析法
本节导航
1 文法和语言
1.1 文法和语言的概念
1.2 形式语言分类
1.3 正规式与上下文无关文法
2 推导与语法树
2.1 推导与短语
2.2 语法树与二义性
1 文法和语言
文法是程序语言的生成系统。
文法可精确定义一个语言,并依据文法构造出识别该语言的自动机(自动机是程序语言的识别系统)。因此,文法对程序语言和编译程序的构造具有重要意义,如程序语言的词法可用正规文法描述,语法可用上下文无关文法来描述,而语义可借助于上下文有关文法描述。
1.1 文法和语言的概念
1.语言
通常用Σ表示字母表。
由字母表Σ中字符组成的有穷序列称为Σ上的字符串或字。字母表Σ上的所有字符串(包括空串)组成的集合用Σ*表示。对于字母表Σ, Σ*上的任一子集称为Σ上的一个语言, 记为L, LÌΣ*。语言L的每 个字符串称为语言L的一个语句或句子。
2. 文法
终结符是语言不可再分的基本符号,通常为一个语言的字母表。终结符代表了语法的最小元素,是一种个体记号。
非终结符也称语法变量, 它代表语法实体或语法范畴。一个非终结符是一个类、一个集合。
例如, 变量、常量、+、* 等为终结符,而 “算术表达式”为非终结符, 它代表一定算术式组成的类,如i*(i+i)、i+i+i等,即非终结符代表由终结符组成且满足一定规则的符号串的集合。
文法可表示为四元组G=(VT,VN,S,ξ), 其中
(1) VT为非空终结符集;
(2) VN为非空非终结符集,且VT∩VN=Φ;
(3) S为文法开始符, S∈VN;
(4)ξ是产生式(注1)的非空有限集, 其中每个产生式(规则)记作 a→b 或 a::= b
左部a∈(VT∪VN)+至少含一非终结符,
右部b∈(VT∪VN)*。
(注1:产生式 (也称产生式规则或规则) 是定义语法实体的一种书写规则。一个语法实体的相关规则可能不止一个, 如:
P→a1, P→a2 , P→an
相同左部的产生式可合并为一个:P→ a 1| a 2|…| a n,其中, a i(i=1,2,…,n)称为P的候选式。
)
3. 文法产生的语言
设G=(VT,VN,S,ξ)且a,b ∈(VT∪VN)*,若存在产生式A→δ, δ∈(VT∪VN)*,则称aAb可直接推出aδb, 记为:aAb => aδb
注意=>与→的不同:
→是产生式中的定义记号,=>表示直接推导,是对文法符号串aAb中A用产生式A→δ的右部δ替换。
关于推导的两点说明:
(1)若a1可直接推出a2, a2可直接推出a3,…, 即存在一个自a1至an的推导序列:
a1=a2=>a3=>…=>an (n>0) 则称a1可推导出an,记为a1=+>an,表示从a1出发经1步或若干步可推导出an
(2)若记a1=+>a1, 则a1=+>an表示从a1出发,经过 0步或若干步可推导出an,即a1=*>an意味着或a1=an, 或a1=+>an。
1.2 形式语言分类
Chomsky于1956年定义了四类文法及相应的四类形式语言, 它对程序语言的设计、编译方法、计算复杂性等方面都产生了重大影响。
1> 0型文法与0型语言 (短语文法)若文法G的每个产生式具有下列形式:
α→β
其中α至少含一个非终结符,则称文法G为0型文法或短语文法,记为PSG。
0型文法相应的语言称为0型语言,它的识别系统是图灵机。
2>1型文法与1型语言 (对应自然语言) 若文法G的每个产生式a→b均满足
|a| ≤ |b|
则称文法G为1型文法或上下文有关文法, 记为CSG。
1型文法相应的语言称为1型语言。
3> 2型文法与2型语言 (对应程序设计语言) 若文法G的每个产生式具有下列形式:
A→α
其中, A∈VN, α∈V*称文法G为2型文法或上下文无关文法,记为CFG。
2型文法相应的语言称为2型语言或上下文无关语言。它的识别系统是下推自动机。
4> 3型文法与3型语言 (对应有限自动机)若文法G的每个产生式具有下列形式:
A→a 或 A→aB
其中,A,B∈VN,a∈VT*,则文法G称为3型文法或正规文法或右线性文法,记为RG。
3型文法相应语言为3型语言或正规语言。它的识别系统是有限自动机。
(注)3型文法还可呈左线性形式:A→a 或 A→Ba
1.3 正规式与上下文无关文法
1. 正规式到上下文无关文法的转换由正规式构造CFG的一种方法:
(1)构造正规式的NFA;
(2)若0为初始状态, 则A0为开始符;
(3)若存在映射关系f(i,a)=j,则定义产生式Ai →aAj;
(4)若存在映射关系f(i,ε)=j,则定义产生式Ai →Aj;
(5) 若i为终态, 则定义产生式Ai →ε。
2 推导与语法树
2.1 推导与短语
1. 规范推导
最右推导: 在推导过程中,若每一步推导都是对句型中的最右非终结符用相应产生式的右部进行替换, 则称这种推导为最右推导。
最左推导: 在推导过程中,若每一步推导都是对句型中的最左非终结符用相应产生式的右部进行替换, 则称这种推导为最左推导。
例如, 考虑句子 i+i*i 按文法G[E]的推导
最左推导: E=>E+E=>i+E=>i+E*E=>i+i*E=>i+i*i
最右推导: E=>E+E=>E+E*E=>E+E*i=>E+i*i=>i+i*i
注意: 推导过程不唯一, 通常只考虑最左推导或最右推导。最右推导又称为规范推导。规范推导的逆过程称为规范归约。
2. 短语
如果S=*>aAδ且A=+>b,则称b是句型abδ关于非终结符A的一个短语,简称b是abδ的一个短语。如果S=*>aAδ且A=>b,则称b为句型abδ的一个直接短语或简单短语。
注意: 短语的两个条件缺一不可。考虑i+i*i, E=+>i+i, 但i+i不是短语
3. 句柄
句型的最左直接短语称为句柄。
注意, 一个句型的直接短语不唯一, 但最左直接短语唯一。
4. 素短语
含有终结符的短语,如果它不存在具有同样性质的真子串,则该短语为素短语。
例如,在E=+>E+E*i中,i、E*i、E+E*i是句型E+E*i的短语,其中, i为素短语, E*i虽含终结符, 但其真子串i含终结符, 故E*i不是素短语,同样E+E*i也不是素短语。
2.2 语法树与二义性
1. 语法树
对于程序语言, 有两个问题需要解决:
(1)判别程序在语法上是否正确;
(2)句子的识别或分析。
为便于分析句子而引入语法树。
语法树:以图示化形式把句子分解成各个组成部分,以分析句子的语法结构。语法树表示法与文法规则完全一致,但更为直观和完整。
满足下列条件的树称为文法G的语法树:
(1)每个结点用G的一个终结符或非终结符标记;
(2)根结点用文法开始符S标记;
(3)内部结点一定是非终结符,若某内部结点A有n个分支, 且其所有子结点从左至右依次标记为x1, x2, …,xn,则A→x1x2…xn一定是G的一条产生式;
(4)若某结点标记为ε,则它必为叶结点且是其父结点的唯一子结点。
2. 子树和短语
语法树的某个结点连同它的所有后代组成了一棵子树。
只含有单层分枝的子树称为简单子树。
子树与短语的关系:
(1)短语: 子树的所有叶结点组成的符号串是相对于子树根的短语;
(2)直接短语: 简单子树的所有叶结点组成的符号串是直接短语;
(3)句柄: 最左简单子树的所有叶结点组 成的符号串为句柄;
(4)素短语: 子树的所有叶结点组成的含终结符的符号串, 且在该子树中没有有包含终结符的更小子树。
显然, 从语法树出发寻找短语、直接短语、句柄和素短语直观得多。但要注意, 子树叶结点组成的符号串是指由该子树根开始向下生长的所有叶结点,该子树的部分叶结点并不是该子树的短语。
3. 文法的二义性
若文法G的一个句子能找到两种不同的最左推导(最右推导), 即存在两棵不同的语法树, 则称这个句子是二义性的。若一个文法包含二义性句子,则这个文法是二义文法,否则是无二义文法。
4. 文法二义性的消除
一个文法是二义性的, 并不说明文法所描述的语言是二义性的。即对于一个二义文法G[S], 若能找到一个非二义文法G‘[S], 使得L(G’)=L(G), 则该二义文法的二义性可以消除。若找不到这 样的G'[S],则二义文法描述的语言为先天二义性的。
文法二义性的消除方法:
(1)不改变文法中原有的语法规则, 仅加进 一些语法的非形式规定。
(2)构造一个等价的无二义文法。即把排除 二义性的规则合并到原文法中, 改写原文法。
下个博客将介绍"自上而下分析方法",敬请期待!