2.2 文法的形式化描述
- 一个文法包括若干产生式,产生式耶称重写规则或规则。
- (上下文无关文法)的产生式写作:
U : : = u 或者 U → u
其中:
U是一个文法符号,称为左部或头
u是有穷文法符号串,称为右部或体
文法的形式化描述
巴科斯-瑙尔范式(Backus-Naur Form, BNF)
用尖括号包围非终结符来标记非终结符
终结符带有下划线
符号::=表示“推导出”
符号|表示“还能推导出”
上下文无关文法
- 是四元组,包括:
终结符(terminal)集
文法所定义语言的基本符号的集合
仅仅出现在产生式右部(体)
非终结符(non-terminal)集
在某个产生式的左部出现过的文法符号
产生式(production)集
开始符(start symbol)
两种说明方式:
(1) 明确指出,如G[A] ;
(2) 第1条产生式规则左部的文法符号
例子
推导
- 从开始符出发,不断将某个非终结符替换为该非终结符的某个产生式的右部。
- 推导的符号:
- 语言:从开始符出发,利用推导能得到的所有终结符号串的集合。
- 上下文无关文法生成的语言称为上下文无关语言
串
- 符号的有穷序列
- 串的表示:
- a2 表示 aa
- a2b2 表示 aabb
- 闭包:a*表示{ε, a, aa, aaa, aaaa, …}
- 正闭包:a+表示{a, aa, aaa, aaaa, …}
- 设A={a,b,c},则A*表示{ε,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,…}
- 串的长度:串中含有的符号个数
句型和句子
文法和语言
- 文法和语言的关系
- 给定文法,就唯一地确定语言
- 给定语言,能给出文法,但文法不唯一
- 等价文法
- 设G1和G2是两个文法,若L(G1)=L(G2),则称G1与G2为等价文法。
例子1
(1)文法A→ aAb | ab对应的语言为:
L(G[A])={anbn|n≥1}
(2) 文法S:S→xSx| xS|y所识别的语言为:
L(G[S])={xmyxn|m≥n≥0}
(3) 文法G:S → xxS | y 所识别的语言为:
L(G[S])={x2ny|n≥0}
也可以写成 *L(G[S])=(xx)y
例子2
(1) 语言L={abna|n≥1}对应的文法可以为:
A → aBa B → b|bB 或
A → aB B → ba|bB 或……
(2) 语言L={a2nb|n≥1}对应的文法可以为:
A →Bb B → aa|aaB 或
A → aab | aaA 或……
(3) 语言L={ambnck|m=n或n=k}对应的文法可以为:
S → AB | DE A → aAb | ε B → cB | ε
D → aD | ε E → bEc | ε
语法分析树
- 以图形方式描述推导过程
- 语法分析树的构成:
- 根节点是开始符
- 叶节点是终结符( token)和 ε
- 内部节点(非叶结点)是非终结符
- 如果应用了规则A → x1x2…xn, 则A是内部结点; **x1 , x2 , … ,xn**是子结点
综合例
考虑文法:S → SS+ | SS* | a
1)试推导出串aa+a*
(先推出SS*)
2)试为这个串构造一棵语法分析树
3)该文法生成的语言是什么?
后缀表达式
二义性
基于一个文法,若有多棵分析树生成同一个终结符号串,则此文法具有二义性。
本课程只讨论文法二义,不涉及语义二义。
语义二义例:Jack said Tom left his assignment at home.
可能基于优先级和结合性来构建无二义的文法
- 四则运算存在两个优先级,所以可引入两个非终结符expr和term来对应不同的抽象层级
- 四则运算均为左结合,因此每条规则中,更为抽象的非终结符应位于左边。