我们喜欢和需要使用是LL(1)文法,但是我们往往遇到的文法不是LL(1)文法这时候需要将它进行转换转换成LL(1)文法。

这里给出两种方法分别是提取左公因子消除左递归

1 提取左公因子

含有左公共因子的文法
若文法中含有形如: A→ α β| α r 的产生式,称 文法含有左公共因子
显然 , SELECT(A→αβ)∩SELECT(A→αr) ≠ф , 文法不是 LL(1) 文法
提取左公因子基本思想
通过改写产生式来推迟决定,读入足够多的输 入,获得足够的信息之后,再做出正确判断。
提取左公因子
有左因子的文法 A→αβ1 | αβ2     等价于 A →A’( β1 | β2)
提左因子 A →αA’   A→ β1 | β2
一般定义:
A→δβ1 |δβ 2 |…|δβ n 1 2 |…|γ m (每个 γ不 δ 开头)
可改写为 A→δA’|γ1 2 |…|γ m    A’→β1 2 |…|β n
这个左公因子有两种形式:显示和隐式的!!!接下来两个例子会讲述这个问题。
例子1:
文法G[S] S →   aSb | aS | ε
请判断该文法是否为LL(1)文法?
解:该文法不是LL(1)文法。
提左因子
S →   aS(b| ε)    S →   ε
引入S’转换成
S →   aSS’    S’→   b| ε    S →   ε  
注意:这里只是举例子讲述原理定义不去判断是否是LL(1)文法!!!具体判断可以参考 LL(1)文法定义及判别_用编程写诗的博客-CSDN博客
例子2:
文法 G[A]
A → ad | Bc
B aA | bB
请判断该文法是否为LL(1)文法?
解:含有隐含左公因子
第一次改写后
G[A] A →   ad | aAc | bBc
B →   aA | bB
我们发现还是有公因子的接着提公因子后
A → aA’| bBc   A’→ d| Ac   B → aA | bB
这个才是最终的结果!!!
消除左公因子小结
经过提取左公因子之后,有些文法从非 LL(1) 文法 变为 LL(1) 文法,有的仍不是 LL(1) 文法。因此,文 法不 含左公共因子只是 LL(1) 文法的必要条件
对于隐含的左公因子,可先等价变换为明确的左公 因子之后,再进行提取。
经过提取左公因子之后,有时会使某些规则变为多 余规则 ,故必须检查提取左公因子之后 的文法,去除多余规则。
个别文法不能在有限步之内提取完左公因子
2 消除左递归
含有左递归的文法
若文法中含有形如
a) A A β(A V N , β∈ (V)*) 的规则
b) A →Bβ B→ A α 的规则
那么
a) 中含有左递归的规则,称为 直接左递归
b) 中虽然没有含左递归的规则, A=> => β A => + A …, 称为 间接左递归
含有左递归的文法不是一个LL(1)文法证明:
以直接左递归为例,若有如下产生式
A→A α  | A→β
其中 , α 和β 为任意语法符号串。
不难证明有下面关系式:
First( β ) First( A α )Select( A→A α)
First( β  ) Select( A→ β  )
由于 A→A α A→ β   Select 集相交,故含有左递归的 文法不是 LL(1) 文法
对于产生式 P→   Pα|β ( 串的特点 βα . . . α)
α不 ε β不 P开头,则可改写规则为:

P βP’
P’αP’| ε

例:S  Sa|b 可改写为:
S→bS’
S’ →aS’| ε
消除直接左递归一般定义
P →   1 |Pα 2 |…|Pα m 1 2 |…|β n
其中每个 α 均不等于 ε ,每个 β不 P 开头,则:
P → β 1 P’|β 2 P’|…|β n P’
P’→ α 1 P’|α 2 P’|…|α m P’|ε
注意:
(1)利用这种方法可以把 直接左递归 都消去,即换成右递归。
(2)但是,这种方法并没有消除整个文法的左递归性。 间接左 递归 仍会存在
消除间接左递归
先将 间接 左递归等价 变换 为等价的 直接 左递归 后再消除左递归
eg:

G[A]
A →   aB | Bb
B →   Ac | d
将规则 1,2 代入 3
先变换成直接左递归
A →   aB | Bb
B →   aBc | Bbc | d
再消除 B 的直接左递归
A →   aB | Bb
B →   aBcB’ | dB’
B’  →   bcB’ |  ε
消除左递归
小结
消除左递归之后,有些文法从非 LL(1) 文法变为 LL(1) 文法,有的仍不是 LL(1) 文法。因此,文法不
含左公共因子只是 LL(1) 文法的必要条件。
消除左递归之后,有时会使某些规则变为多余规则, 故必须检查消除左递归之后的文法,去除多余规则 消除左递归的文法在形式上可能不同,但均等价。

非LL(1)文法到LL(1)文法的等价变换相关推荐

  1. 【编译原理笔记04】语法分析:自顶向下的分析概述、文法转换、LL1文法

    本次笔记内容: 4-1 自顶向下分析概述 4-2 文法转换 4-3 LL1文法 文章目录 自顶向下分析概述 最左推导(Left-most Derivation) 最右推导(Right-most Der ...

  2. 编译原理基本定义(文法、算符文法、算符优先文法、算符优先关系表、算符优先分析过程)

    文法 文法和语言分为4类. 0型文法:最大类,包含1.2.3型文法. 1型文法:对0型文法来说,所有的产生式的右边的字符长度都要大于左边的字符长度. 2型文法:所有的产生式左边都只有一个字符. 3型文 ...

  3. R语言Box-Cox变换实战(Box-Cox Transformation):将非正态分布数据转换为正态分布数据、计算最佳λ、变换后构建模型

    R语言Box-Cox变换实战(Box-Cox Transformation):将非正态分布数据转换为正态分布数据.计算最佳λ.变换后构建模型 目录

  4. LR文法整理【LR文法的概念、LR(0)、SLR、LR(1)、LALR】(下)

    LR(1)分析法 在Follow集合中的符号,只是进行归约的必要条件,而非充分条件. 出错原因:从下图的分析树中可以看到,R在不同的位置进行归约,后继符号是不一样的,简单的说,在特定位置中,A的后继符 ...

  5. 编译原理chatpter04 文法的形式和文法的类型

    一文法的形式一般有很多种,只要能正确的描述出终结符非终结符约定.以及开始符号就行 第一种 ②第二种: 二.句型和句子 只要是在整个推到过程的所有符号都是句型: 句子是只含有终结符. 三.四种文法 0型 ...

  6. LR文法整理【LR文法的概念、LR(0)、SLR、LR(1)、LALR】(上)

    概念和使用 为了准确识别句柄,因此需要向前擦好看k个输入符号的LR分析. LR(0)分析法 LR(0)项目 增广文法 引入这个新的开始产生式的目的是使得文法开始符号仅出现在一个产生式的左边,从而使得分 ...

  7. 【编译原理】关于文法形式化定义的探索

    文章目录 1 文法的概念 2 符号和符号串的定义 3 文法的形式化定义 3.1 终结符 3.2 非终结符 3.3 P&&S 1 文法的概念 每一种自然语言或者是编程语言都需要文法来描述 ...

  8. 上海科技大学ACL2018高分论文:混合高斯隐向量文法

    作者丨赵彦鹏.张力文.屠可伟 单位丨上海科技大学 研究方向丨NLP.机器学习 自然语言处理领域的传统方法着重于处理离散符号之间的复杂结构,但近几年随着深度学习的兴起,出现了很多将符号向量化结合神经网络 ...

  9. 编译原理笔记 - 文法知识

    文章转自:https://zh.wikipedia.org/wiki/乔姆斯基谱系 文章目录 乔姆斯基体系的四个层次 四种语言类的包含关系 主要特点 乔姆斯基体系的四个层次 乔姆斯基体系是计算机科学中 ...

最新文章

  1. Vue+Openlayers实现地图缩放图标等比例缩放
  2. Android骨架屏实现方案
  3. flex上传图片到java服务器
  4. java 通过反射得到命名空间_利用反射得到一个命名空间下的所有类,并调用?...
  5. linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...
  6. docker 安装 与 卸载 centos
  7. i7 3960x支持服务器内存吗,酷睿i7 3960X支持多大内存
  8. python list 的深浅拷贝探索
  9. bookstrap必备的基础知识
  10. Echarts 折线图最后一个点发光闪烁效果
  11. 什么叫预判_挖机事故发生之前,挖机司机做了什么?
  12. 《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的?
  13. php华文行楷,css设置中文字体
  14. Compiler Optimization on VLIW Instruction Scheduling for Low Power
  15. linux笔记本 亮度调节,Ubuntu Linux笔记本屏幕背光亮度调节
  16. 国内哪家公司做网站最好?
  17. Springboot 整合 kafka 实现消息的发布和订阅
  18. java mifare_java – NTAG212 Mifare Ultralight与身份验证
  19. 激活函数σ、tanh、relu、Leakyrelu、LR_BP反向传播推导
  20. k8s集群配置域名证书支持https与http

热门文章

  1. TabIndex 属性 Tabindex=-1 与Tabindex=0、任意数字
  2. Python之print打印
  3. 最常用的五个网页JS特效代码:收藏本站、设为首页、刷新本页
  4. 2017年卢松松博客视频方向该怎么做
  5. mysql temporary table
  6. SCORM 1.2與SCORM 2004規範之初步比較
  7. 时间序列分析 | Python实现Tsprial时间序列特征提取
  8. Content Delivery Networks CDN 内容分发网络
  9. 5分钟成为车联网专家|智慧高速如何破局实现车联网最先商用落地
  10. android 图片加载 软引用_android Listview 软引用SoftReference异步加载图片