发布于 

「编译原理」文法

文法

\(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) 语法表示。增加前瞻符号导致的语法集合增加仅限于形式上的增加,语法的表达能力并没有提高