定义
- 终结符的有穷集合 :有限符号集,相当于字母表。
- 非终结符的有穷集合 :非终结符也被称为变元,每个变元代表一个语言。
- 初始符号:其中一个变元,代表语言开始被定义的地方。
- 产生式的有穷集合 ,每个产生式包括:
- 一个变元
- 一个产生式符号
- 一个包含零个或多个终结符或变元的串
归约
将产生式右部替换为左部的符号
推导
从产生式的头到体使用规则,得到一个串。
最左推导和最右推导
每一步推导中只将最左边(最右边)的变元替换成该变元的某个产生式的体,称为最左推导(最右推导)。
Example
设一个简单表达式的文法为 , 其中 , 为
怎么推导 ?
最左推导:
最右推导:
句型
若 ,则称 为 的一个句型,
- 若 ,称 为左句型
- 若 ,称 为右句型
- 若 ,称 为一个句子
设计
例 1
例 2(有序两字符数量相等)
例 3
例 4
例 5(有序两字符数量不等)
Attention
不能写成
这样写只会接受 比 多一个或 比 多一个的情况。
例 6
考虑先实现边界情况,
发现文法恰好实现了区间关系。
- 扫描法:从左向右进行扫描,找到第一个满足 xx 条件的 xx 字符,将串分为若干容易表示的部分,然后再进行组合。
- 有分治的思想
例 7(无序两字符数量相等)
三种情况:
- 空串
- 以 开头,在剩下的串中找第一个使 的数量比 多的 ,它将剩下的串分为两部分 和 数量相等的两个串。
- 类似地,以 开头,……
- ~ 两字符数量相同的文法,经常使用
例 8(无序两字符数量差固定)
- 若 比 多 2 个:找第一个使 的数量比 多的 ,再类似的找第二个 ,可以把串分为 个部分。
- 若 比 多 2 个:……
例 9(无序两字符数量不等)
习题
习题 5.1.1. (b)
二义性
,可以找到两颗不同的语法分析树,它们的根都是 ,产物都是 。
- 有多个不同的推导不代表文法是二义的
- 不存在判断文法是否有歧义的算法
Theorem
具有两颗不同的分析树 存在两个不同的最左/最右推导
Example
文法
对于串 ,存在两颗不同的语法分析树。
消除二义性
例 1
考虑优先匹配最外层或最内层的 对 优先匹配最外层:
优先匹配最内层:
例:表达式
有两个问题导致了文法的二义性。 算符优先级:引入多个变元
例 2
可以使 存在唯一的语法分析树。 此时 仍有两个可能的语法分析树。
相同的运算符的结合顺序
例 3
此时文法是一个无二义文法。
例:悬挂 else
对于 iie,有两种语法分析树:

例 4
采用最近嵌套匹配,不让 ie 中间出现单 i 分支
