程序语言的语法描述
文法
描述语言的语法结构的形式规则
(箭头表示定义)
语法描述的几个概念
字母表:一个有情字符集,记为∑
字母表中每个元素称为字符
∑上的字(也叫字符串)是指由∑中的字符所构成的一个有穷序列
不包含任何字符的序列称为空字,记为ε
用∑*表示∑上的所有字的全体,包含空字ε
例如:设∑={a , b},则∑*={ε,a,b,aa,ab,ba,bb,aaa……}
∑*的子集U和V的连接(积)定义为
UV={αβ|α∈U & β∈V}
示例:设U={a,aa} V={b,bb}
UV={ab,abb,aab,aabb}
V自身的n次积为Vn=VV……V(n个)
V0={ε}
V*是V的闭包:V*=V0∪V1∪V2∪V3……
V+是V的正规闭包:V+=VV*
上下文无关文法
上下文无关文法G是一个四元组G=(VT,VN,S,P),其中
◆VT︰终结符(Terminal)集合(非空)
◆V∶非终结符(Nonterminal)集合(非空),且V∩VN=Ø
◆S∶文法的开始符号,S∈VN
◆P∶产生式集合(有限),每个产生式形式为
P→α , P∈VN , α∈(VT∪VN)*
◆开始符S至少必须在某个产生式的左部出现一次
文法生成语言
推导
定义∶称αAβ直接推出αγβ,即 αAβ⇨αγβ 仅当A→γ是一个产生式,且α , β (V∪VN)*。
如果α1⇨α2⇨...⇨αn,则我们称这个序列是从α1到αn,的一个推导。若存在一个从α到αn的推导,则称α1可以推导出αn。
句型、句子和语言
假定G是一个文法,S是它的开始符号。如果S⇨*α则称*α是一个句型。
仅含终结符号的句型是一个句子。
文法G所产生的句子的全体是一个语言,记为L(G)。
L(G)={α|S⇨+α,α∈V*T}
推导与语法树
最左推导和最右推导
从一个句型到另一个句型的推导往往不唯一
E+E⇨i+E⇨i+i
E+E⇨E+i⇨i+i
最左推导∶任何一步α ⇨β都是对α中的最左非终结符进行替换
最右推导∶任何一步α ⇨β都是对α中的最右非终结符进行替换
语法树
用一张图表示一个句型的推导,称为语法树
—棵语法树是不同推导过程的共性抽象
语法树与二义性(ambiguity)
文法的二义性∶如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的
语言的二义性:一个语言是二义的,如果对它不存在无二义的文法
对于语言L,可能存在G和G',使得L(G)=L(G')=L,有可能其中一个文法为二义的,另一个为无二义的
自然语言的二义性:John saw Mary in a boat
John在船上看到Mary John看到Mary在船上
表达式→项│表达式+项
项→因子│项*因子
因子→(表达式)| i
二义性问题是不可判定问题,即不存在一个算套杏熊传有限步骤内,确切地判定一个文法
可以找到一组无二义文法的充分条件
形式语言鸟瞰
乔姆斯基于1956年建立形式语言体系,他把文法分成四种类型∶0,1,2,3型
与上下文无关文法一样,它们都由四部分组成但对产生式的限制有所不同
G=(VT,VN,S,P)
◆VT︰终结符(Terminal)集合(非空)
◆V∶非终结符(Nonterminal)集合(非空),且V∩VN=Ø
◆S∶文法的开始符号,S∈VN
◆P∶产生式集合(有限)
0型(短语文法,图灵机)
产生式形如∶α→β
其中 : α∈ (VT∪VN)*且至少含有一个非终结符;
β∈ (V∪VN)*
1型(上下文有关文法,线性界限自动机)
产生式形如︰α→β
其中:|α|≤|β|,仅S→ε例外
2型(上下文无关文法,非确定下推自动机)
产生式形如:α→β
其中:A∈ VN ; β∈(VT ∪VN)*
3型(正规文法,有限自动机)
产生式形如∶A→αB或A→α
其中: α∈VT* ; A,B∈VN
(右线性文法)
产生式形如∶A→Bα或A→α
其中:α∈VT* ; A,B∈VN~
(左线性文法)
四种类型文法描述能力比较
上下文无关文法与上下文有关文法
L={anbn|n>1}不能由正规文法产生,但可由上下文无关文法产生
G(S):S>aSb] ab
L={anbncn|n>1}不能由上下文无关文法产生,但可由上下文有关文法产生
G(S):
S→ aSBC| aBC
CB → BC
aB → ab
bB → bb
bC → bc
cC →> cc
程序设计语言不是上下文无关语言,甚至不是上下文有关语言
L={ α⊂α|α∈{a,b}*}不能由上下无关文法产生,甚至连上下有关文法也不能产生,只能由0型文法产生
◆标识符引用
◆过程调用过程中,“形-实参数的对应性"(如个数,顺序和类型二致性)
对于现今程序设计语言,在编译程序中,仍然采用上下文无关文法来描述其语言结构