定义

  • 终结符的有穷集合 :有限符号集,相当于字母表。
  • 非终结符的有穷集合 非终结符也被称为变元,每个变元代表一个语言。
  • 初始符号:其中一个变元,代表语言开始被定义的地方。
  • 产生式的有穷集合 ,每个产生式包括:
    • 一个变元
    • 一个产生式符号
    • 一个包含零个或多个终结符或变元的串

归约

将产生式右部替换为左部的符号

推导

从产生式的头到体使用规则,得到一个串。

最左推导和最右推导

每一步推导中只将最左边(最右边)的变元替换成该变元的某个产生式的体,称为最左推导(最右推导)

Example

设一个简单表达式的文法为 , 其中

怎么推导


最左推导:

最右推导:

句型

,则称 的一个句型,

  • ,称 为左句型
  • ,称 为右句型
  • ,称 为一个句子

设计

例 1


例 2(有序两字符数量相等)


例 3


例 4


例 5(有序两字符数量不等)


Attention

不能写成

这样写只会接受 多一个或 多一个的情况。

例 6


考虑先实现边界情况,

发现文法恰好实现了区间关系。

  • 扫描法:从左向右进行扫描,找到第一个满足 xx 条件的 xx 字符,将串分为若干容易表示的部分,然后再进行组合。
  • 分治的思想

例 7(无序两字符数量相等)


三种情况:

  1. 空串
  2. 开头,在剩下的串中找第一个使 的数量比 多的 ,它将剩下的串分为两部分 数量相等的两个串。
  3. 类似地,以 开头,……
  • ~ 两字符数量相同的文法,经常使用

例 8(无序两字符数量差固定)


  • 多 2 个:找第一个使 的数量比 多的 ,再类似的找第二个 ,可以把串分为 个部分。
  • 多 2 个:……

例 9(无序两字符数量不等)


习题

习题 5.1.1. (b)


二义性

,可以找到两颗不同的语法分析树,它们的根都是 ,产物都是

  • 有多个不同的推导不代表文法是二义的
  • 不存在判断文法是否有歧义的算法

Theorem

具有两颗不同的分析树 存在两个不同的最左/最右推导

Example

文法

对于串 ,存在两颗不同的语法分析树。

消除二义性

例 1


考虑优先匹配最外层或最内层的 对 优先匹配最外层:

优先匹配最内层:

例:表达式

有两个问题导致了文法的二义性。 算符优先级:引入多个变元

例 2

可以使 存在唯一的语法分析树。 此时 仍有两个可能的语法分析树。

相同的运算符的结合顺序

例 3

此时文法是一个无二义文法。

例:悬挂 else

对于 iie,有两种语法分析树:

例 4

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