概念简述

回溯:分析工作部分地或全部地退回到之前的一个阶段,在当前阶段采取与之前不同的决策重新推进工作
FIRST(α):令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:

  • FIRST(α)={a | α=>*a…, a∈VT}
  • 若α=>*ε,则规定ε∈FIRST(α)
  • FIRST(α)是α的所有可能推导的开头终结符或可能的ε

消除回溯

  • 回溯的问题
    回溯带来的问题就是低效率
  • 回溯的条件
    文法中,对于某个非终结符的规则其右部有多个选择,并根据所面临的输入字符不能准确的判断所要的选择,那么就需要搜索,就会导致回溯。
  • 避免回溯的要求
    FIRST(αi)∩FIRST(αj)=ϕ

    令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:

    • FIRST(α)={a | α=>*a…, a∈VT}
      若α=>*ε,则规定ε∈FIRST(α)
      FIRST(α)是α的所有可能推导的开头终结符或可能的ε
    • 如果非终结符A的所有候选首符集两两不相交,即A的任何两个不同候选αi和αj
      FIRST(αi) ∩FIRST(αj)=Φ
    • 那么当要求A匹配输入串时,A就能根据它所面临的第一个输入符号a,准确的指派某一个候选前去执行任务。这个候选就是那个终结首符集含a的α。
  • 提取左因子法消除回溯
    • 假定A的规则是:
      A→δβ1 |δβ2 | … |δβn |γ1 |γ2 | … |γm(其中,每个γ不以δ开头)
      那么这些规则可以改写为:
      A→δA’ |γ1 |γ2 | … |γm
      A’→β1 |β2 | … |βn
    • 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集便成为两两不相交。我们为此要付出的代价是大量引进新的非终结符和ε产生式
    • 实现过于简单,故不再实现代码

编译原理(四) 消除回溯提取左因子法相关推荐

  1. java编程实现算符优先分析法,编译原理实验三-算符优先分析法

    编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...

  2. 北方工业大学编译原理——四、五章单元测试内容复习

    四.五章单元测试内容 T1 常识问题. 使用自上而下分析法需要先消除左递归,再消除回溯. T2 显然是错的,LL(1)文法是无二义文法,二义文法就无法在逻辑上与LL(1)文法等价. T3 显然是对的, ...

  3. 编译原理四种文法的理解补充

    如果你是学习,给定一个文法,判断是哪一个文法的话,那这篇不是讲这个,只是一点小小的理解补充. 四种文法如下: 补充: 1.0型文法,即递归可枚举文法相当于图灵机是指: 给定一个文法G,一个句子g,如果 ...

  4. 编译原理之语法分析(预测分析法)

    编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...

  5. 编译原理 | 语法分析(LL(1)分析法/算符优先分析法OPG)学习笔记及例子详解

    语法分析(自顶向下 / 自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析 ...

  6. 编译原理实验三 LR(1)分析法

    实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...

  7. 编译原理 实验三 LR(1)分析法 Java

    1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...

  8. 编译原理 实验二 LL(1)分析法程序实现

    源代码仓库:CompilePrincipleLearning/experiment_2 · yusixian/CompilePrincipleLearning (github.com) 一. 实验目的 ...

  9. 【C++实现】编译原理 免考小队 消除一切左递归

    背景 期末考试免考,冲! 实验名称 消除一切左递归 实验时间 2020年5月27日 到 2020年5月31日 院系 信息科学与工程学院 组员姓名 Chocolate.kry2025.钟先生.leo.小 ...

最新文章

  1. Spire.XLS试用手记
  2. MVC模式和文档/视图结构
  3. 【忘川风华录】可爱的大“装备”?名士猫交互设计复盘
  4. [c#菜鸟]lambda表达式
  5. Leveldb二三事
  6. 在 JQuery Mobile 中实现瀑布流图库布局
  7. Java 8星期五:Java 8的阴暗面
  8. php iis ajax 无效,IIS7中Ajax.AjaxMethod无效的原因及解决方法
  9. FPGA双沿采样之Verilog HDL实现
  10. QLabel 图片大小设定
  11. 使用Toolbar + DrawerLayout快速实现高大上菜单侧滑
  12. 一位19年的Mac用户:“我真的很讨厌库克”
  13. 系统故障模拟及修复实验
  14. mysql集群脑裂问题_redis集群怎么解决脑裂问题
  15. ESP-8266wifi模块获取网络实时时间
  16. HTML 网页自动刷新
  17. 腾讯魏巍:Eunomia云原生资源编排优化
  18. 泰克Tektronix示波器软件TDS210|TDS220|TDS224上位机软件NS-Scope
  19. 高通骁龙MSM8916核心板 ARM Cortex-A53 四核 中文资料
  20. java过滤器命名_Java命名目录接口(JNDI)教程

热门文章

  1. NOI 十连测 Round 5 T2 运河计划
  2. 【Cocos Creator实战教程(3)】——TiledMap(瓦片地图)组件
  3. 大学生 从0开始学Spring第2篇:控制反转(IoC)与依赖注入【从0到精通】
  4. input输入框只能输入11位数字
  5. cache tier 分级缓存
  6. 【无极低码】低代码平台开发日记,低代码平台之sql编程
  7. 36氪| 中国企服软件金榜-项目管理软件排名揭晓
  8. ansible-playbook批量部署Zabbix
  9. 六十六条经典禅语名句
  10. 关于互相尊重和直言有讳