高级语言及其语法描述
文法: 描述语言的语法结构的形式规则
语法描述的几个基本概念(1)
- 字母表:一个有穷字符集,记为∑
- 字母表中每个元素称为字符
- ∑上的字(也叫字符串) 是指由∑中的字符所构成的一个有穷序列
- 不包含任何字符的序列称为空字,记为ε
- 用∑*表示∑上的所有字的全体,包含空字ε Ps:即可能组合成的所有字的全体集合
- 例如: 设 ∑={a, b},则
语法描述的几个基本概念(2)
- ∑*的子集U和V的连接(积)定义为
UV={ ab | aU & bV }
- 示例:设
U={ a, aa }
V= { b, bb }
UV={ ab, abb, aab, aabb}
ps:左乘和右乘不一定相同
- V自身的 n次积记为
- V*是V的闭包:
- 是V的正规闭包:=V V*
Ps:所谓闭包就是集合中元素之间组合出所有可能的集合
例如:集合C={1,2}
C的闭包就是{,1,2,12,11,22,112,122,111,...........}
这是一个无限集,其中包括所有和1,2有关的字串
Ps:闭包和正规闭包的区别
V*包含 ,不包含 ()
设 V={a,aa}
V*={ , a, aa, aaa, aaaa, …}
={ a, aa, aaa, aaaa, …}
下文无关文法
- 上下文无关文法G是一个四元组
G=(,,S,P),其中
- :终结符(Terminal)集合(非空)
- :非终结符(Noterminal)集合(非空),且
- S:文法的开始符号,
- P:产生式集合(有限),每个产生式形式为
- Pa, ,
- 开始符S至少必须在某个产生式的左部出现一次
Ps: 终结符即最小的不可拆分的基本单元元素,而非终结符可再分(即非终结符需要解释)
(一般大写都是非终结符,小写都是终结符)
eg:定义只含+,*的算术表达式的文法
G=< {i,+,*,(,)},{E},E, P >, 其中,P由下列产生式组成:
E i
E E+E
E E*E
E (E)
{i,+,*,(,)}代表终结符,{E}代表非终结符,E代表开始符号, P代表产生式
约定
P
P →→→→→ 可缩写为 P || ...|
...
P
- 其中,“|”读成“或”,称为P的一个候选式
- 表示一个文法时,通常只给出开始符号和产生式
推导
- 定义:称aAb直接推出agb,即
aAbagb
仅当A g是一个产生式,且
- 如果 ... ,则我们称这个序列是从到的一个推导。若存在一个从到的推导,则称可以推导出
Ps:“”仅指一步推导
eg: 对文法G(E): E i | E+E | E*E | (E)
有 E (E) (E+E) (i+E) (i+i) 等若干步推导可缩写为E (i+i)或 E (i+i)
此处应该注意和的不同 a b 表示ab或者ab 即 大于或等于零步, 大于等于一步
句型、句子和语言
句型、句子
- 假定G是一个文法,S 是它的开始符号。
- 如果Sa,则称a是一个句型。
- 仅含终结符号的句型是一个句子。
- 文法G所产生的句子的全体是一个语言,记为 L(G):
eg:请证明 (i*i+i)是文法
G(E): E i | E+E | E*E | (E) 的一个句子。
证明:
E (E)
(E+E) PS:其中 (i*i+i) 是文法G的句子 ,
(E*E+E) E,(E),(E*E+E),…,(i*i+i)都是句型。
(i*E+E)
(i*i+E)
(i*i+i)
语言
设文法 (A):
A c | Ab
则(A)产生的语言为
①当选择第一种候选式时 A c 此时产生式右侧不含有非终结符,产生语言结束
②当选择第二种候选式时 A Ab 此时右侧仍含有非终结符A,将表达式进行递归选择候选式
此时选择第一种候选式 A cb 此时产生式右侧不含有非终结符,产生语言结束
③同理可得 A Ab
Abb
Abbb
...
Ab...b
cb...b
即可得:
Ps : L(X)指X文法产生的语言,G(R)指以R为开始符号的文法
上下文无关文法示例
请给出产生语言为{|}的文法
解 (S):
S aSb
S ab
Ps :使用递归思维解决,找出最基本的核,即n=1时最简单的情况,再思考以何种方式递归可以得到标准的解
请给出产生语言为{ | }的文法
PS:同样的找出满足的两种最简单情况:分别为ab或aab
(S):
S ab | aab
S aSb | aaSb
最左推导和最右推导
- 从一个句型到另一个句型的推导往往不唯一
E+E i+E i+i
E+E E+i i+i
- 最左推导:任何一步a Þ b都是对a中的最左非终结符进行替换
- 最右推导:任何一步a Þ b都是对a中的最右非终结符进行替换
语法树
- 用一张图表示一个句型的推导,称为语法树
- 一棵语法树是不同推导过程的共性抽象
eg: G(E): E i | E+E | E*E | (E)(i*i+i)
最左推导 最右推导
E (E) E (E)
(E+E) (E+E)
(E*E+E) (E+i)
(i*E+E) (E*E+i)
(i*i+E) (E*i+i)
(i*i+i) (i*i+i)
语法树与二义性(ambiguity)
- 文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的
G(E): E i | E+E | E*E | (E) 是二义文法
- 语言的二义性:一个语言是二义的,如果对它不存在无二义的文法
Ps:即某语言只要有一个二义文法则该语言为二义性语言
- 对于语言L,可能存在G和G’,使得L(G)=L(G’)=L,有可能其中一个文法为二义的,另一个为无二义的
- 二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的,但可以找到一组无二义文法的充分条件
eg:
二义文法G(E): E i | E+E | E*E | (E)
无二义文法G’(E):
E T | E + T (表达式 项 | 表达式 + 项)
T F | T * F (项 因子 | 项 * 因子)
F (E) | i (因子 ( 表达式 ) | i )
对于句子i(*i+i)来说,它的推导为
E T F (E) (E+T) (T+T) (T*F+T) (F*F+T) (i*F+T) (i*i+T) (i*i+F) (i*i+i)
此时并不存在二义性,即G’(E)为无二义文法
形式语言鸟瞰
乔姆斯基于1956年建立形式语言体系,他把文法分成四种类型:0,1,2,3型,与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同
G=(,,S,P)
- :终结符(Terminal)集合(非空)
- :非终结符(Noterminal)集合(非空),且
- S:文法的开始符号,
- P:产生式集合(有限)
四类文法
- 0型(短语文法,图灵机)
产生式形如:
其中:且至少含有一个非终结符;
Ps:左边至少含有一个需要解释的非终结符
eg: aAa (√) AaAa (√) aaAa (X)
- 1型(上下文有关文法,线性界限自动机)
产生式形如:
其中:,仅 例外
Ps: 在0型文法的基础上限制了,这里的|β|表示的是β的长度。 即只能从产生式产生不小于本身的产生式,不能说越产生越少的情况 ,即非终极符不能没有意义被删除
eg: aAa (X) AaAa (√) AAa (√)
- 2型(上下文无关文法,非确定下推自动机)
产生式形如:
其中:;
Ps:1.左边必须只有一个字符,且是非终结符
2.2型文法所有产生式的右边可以含有若干个终结符和非终结符(只要是有限的就行,没有个数限制)
eg: AaAa (X) AAa (√) AAaaaaa (√)
- 3型(正规文法,有限自动机)
产生式形如: 或 即右线性文法
其中: ;
产生式形如:或 即左线性文法
其中: ;
Ps:1.左边必须只有一个字符,且是非终结符(同2型)
2.其右边最多只能有两个字符,要么是一个非终结符+终结符(终结符+非终结符),要么是一个终结符。
3.如果是右线性文法,则所有的产生式必须是|的形式无论几次递归都必须满足此形式,左线性文法亦然
eg: AAaaaaa (X) AAa (√) Aa(√)
四种文法总结:
0型:这种文法限制最少,范围最广,最为灵活。一般文法都是0型文法无需判断。
1型:在0型基础上限制
2型:在1型基础上限制左边必须是一个非终结符
3型: 在2型基础上限制右边只能是终结符+非终结符的组合
以图像表示则为:(都是真包含)