文法

$G=(V_n, V_t, P, Z)$

  • $G$ 文法
  • $V_n$ 非终结符号集
  • $V_t$ 终结符号集
  • $P$ 产生式或规则的集合
  • $Z$ 开始符号(识别符号)
  • $V$ 词汇表,$V=V_n\cup V_t$

规则是一个有序对,通常写为 $U\rightarrow x$,其中 $U\in V_n,x\in V^{*}$

类别 定义 分析器 特点
0 型文法 $P:u\rightarrow v$ 其中 $u\in V^{+},v\in V^{*}$ 图灵机 短语结构文法。规则的左部和右部都可以是符号串,一个短语可以产生另一个短语。需要能够随意访问上下文
1 型文法 $P:xUy\rightarrow xuy$ 其中 $U\in V_n,x,y,u\in V^{*}$ 线性界限自动机 上下文敏感或上下文有关。只有在 $x, y$ 这样的上下文中才能把 $U$ 改写为$u$
2 型文法 $P:U\rightarrow u$ 其中 $u\in V_n,u\in V^{*}$ 下推自动机 上下文无关文法。即把 $U$ 改写为 $u$ 时,不必考虑上下文
3 型文法 $P:U\rightarrow t$ 或者 $U\rightarrow Wt$ 其中 $U,W\in V_n,t\in V_t$ 有限自动机 正则文法。它是对 2 型文法进行进一步限制,左线性或者右线性
  • 图灵机:随便看随便存
  • 线性界限自动机:能看到的位置是当前位置的线性函数
  • 下推自动机:使用了包含数据的栈的有限自动机
  • 有限自动机:略

文法之间有包含关系,即 $3\subset 2\subset 1\subset 0$,判断的时候反向操作

一般使用 2 型以上文法

一个有穷语言,一定是正则语言

短语,简单短语和句柄

刚开始接触到这些概念的时候极其懵逼,形式化表示很难在脑海里留下印象。
事实上学完语法树再回来感性理解还是挺简单的

  • 短语:对文法 $G[Z]$,句型 $w=xuy$,若有 $Z\stackrel{*}{\rightarrow}xUy$(推导),并且有 $U \stackrel{+}{\rightarrow}u$(至少一步推导),那么 $u$ 是(相对于非终结符号 $U$ 的句型 $w$ 的)短语
    • 体现在语法树上,任意一棵非叶子树的根节点就是 $U$,叶子节点从左到右的组合就是 $u$,短语实则是某个非终结符号(事实上是句型中的“伪终结符”)的推导结果
  • 简单短语(直接短语):在短语的基础上,若 $U{\rightarrow}u$(直接推导),则 $u$ 是(相对于非终结符号 $U$ 的句型 $w$ 的)简单短语
    • 语法树上除了短语的要求之外,还要保证子树的深度是 $2$(只有根和叶子节点),从而满足直接推导的要求
  • 句柄:任一句型的最左简单短语称之为句柄
    • 按照定义在语法树上找

Q&A

增加的一个前瞻符号,使 LR(2) 语法分析器比 LR(1) 语法分析系统所能识别的语法集合更大。但几近于矛盾的是,增加的前瞻符号并不能增大这种语法分析器可以识别的语言集合。对 k>1, LR(1)语法分析器与 LR(k) 语法分析器接受的语言集合是相同的。同一种语言的 LR(1) 语法可能比 LR(k) 语法更复杂(《编译器设计》P94)

  • 意味着能被 LR(k) 语法分析器接受的语言必定能被 LR(1) 语法分析器接受?
  • 根据老师的意思,若一种语言可以用 LR(k) 语法表示,那么也必定可以用 LR(1) 语法表示。增加前瞻符号导致的语法集合增加仅限于形式上的增加,语法的表达能力并没有提高