引言

自底向上的语法分析相当于从叶子节点开始向上一直到根部构造一棵语法树。我们将使用移入-归约法完成这一过程。

归约

  • 定义:一个与某产生式体相匹配的特定子串被替换成该产生式头部的非终结符号。相当于反向的最右推导。

举例:

给定文法:S->aABe
A->Abc | b
B->d

串abbcde可以由推导S=>rmaABe=>rmaAde=>rmaAbcde=>rmabbcde得到。
那么逆置最后一步,把b替换成非终结符A就是归约,并且称这个b为句柄。

  • 句柄:如果有S->αAb->αβb,那么紧跟α的产生式A->β是αβb的一个句柄。非正式地讲,β就是句柄。这里要满足的重要条件就是从句柄继续逆推一定能得到开始符号。如果不能构成一个以开始符号为起点的推导,那么这样的产生式不能构成句柄。

仍按上例:abbcde的句柄为b,aAbcde的句柄为Abc,等等。

句柄右侧的串只含终结符号,因为如果含有非终结符号,那必然不是最右推导。在有二义性的文法中不是唯一的,这很好理解,因为产生式不是唯一的。

移入-归约分析法

四种动作:
• 移进 (shift):把下一个输入符号移进栈 (栈顶)
• 归约 (reduce):分析器知道句柄的右端已在栈顶,然后确定句柄的左端在栈中的位置,再决定用什么样的非终结符代替句柄
• 接受 (accept):分析器宣告分析成功
• 报错 (error):分析器发现语法错误,调用错误恢复例程

只要恰当地进行以上四种操作,就能完成语法树的构建。我们先看一个手工构建的例子。
已知以下文法:E->E + T | T
T->T * F | F
F->(E) | id
用移入-归约语法分析器构建语法树。

栈内加入结束符,然后逐个字符移入,在正确的时候归约,最后得到开始符。这里的问题是:
1、何时移入,何时归约?
2、选择哪个子串进行归约?
3、进行归约时,选择哪个产生式进行归约?
看起来,我们又需要一个像非递归的自顶向下分析法的预测分析表的东西。

编译原理 自底向上语法分析相关推荐

  1. 编译原理之语法分析(自底向上)(包含源码)

    编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...

  2. 编译原理2-Bison语法分析

    ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...

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

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

  4. 编译原理——自上而下语法分析

    自上而下分析面临的问题 回溯 (当候选有多个的时候,匹配失败会造成回溯) 文法左递归问题 那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中 LL1文法消除左递归 消除直 ...

  5. 编译原理词/语法分析

    效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...

  6. 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf

    // SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...

  7. 【编译原理】Python语法分析LL(1)、LR(1)

    目录 一.实验目的 二.实验任务 三.实验原理 1  LL(1)文法 2  LR文法 四.实验过程 1  LL(1)文法 2  LR文法 五.实验结果 1  LL(1)文法 2  LR(0)文法 3 ...

  8. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

  9. 读书笔记(II) 编译原理及实践

    编译原理及实践 作者:Kenneth C.Louden 机械工业出版社 出版年:2000-3-1 综合评分:7.0 _________________________ 果然如网上流传的那样,翻译的真是 ...

  10. 《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集

    <编译原理>-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集 上一篇:<编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,L ...

最新文章

  1. UCloud与NTT达成合作,提供可靠跨地域混合云服务
  2. pytorch | 深度学习分割网络U-net的pytorch模型实现
  3. EF--Code First配置问题
  4. HDU - 2732 Leapin' Lizards(最大流+思维建边)
  5. com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
  6. linux ssh服务,Linux配置SSH服务以便实现远程连接
  7. python的os库_os库(python)—总结
  8. 化工企业数据分析中心项目之采购模块分析
  9. 对web应用构成安全威胁的错误漏洞
  10. phpstrom自己定义和原本的常用快捷键
  11. matlab三边定位算法,利用matlab分别对三边测量定位算法和改进算法进行仿真和验证...
  12. python批量实现百度网盘链接有效性检测
  13. HDOJ 5773 The All-purpose Zero
  14. ab并发测试-Linux
  15. Karl Rove和Dick Cheney加入了REST争论
  16. ardupiolt AP_AHRS库类的分析(一)AP_AHRS_NavEKF
  17. adb shell appops(系统服务:appops)
  18. 微信小程序简单留言板
  19. 搭建redis的步骤
  20. 洪涝有源淹没算法及淹没结果分析【转】

热门文章

  1. 线控转向——Carsim与simulink联合仿真模型 包含转向电机模型,转向执行机构模型,齿轮齿条模型
  2. c语言仿宋gb2312字体,gb2312字体下载|仿宋gb2312字体 v2.0 官方版-520下载站
  3. 进制转换函数 Java
  4. matlab模拟晶粒生长,一个有monte caro 模拟晶粒生长的Matlab源程序
  5. 学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法
  6. 微信小程序 git代码管理使用的详细步骤
  7. C语言知识点总体梳理(知识点)
  8. 一线互联网公司的前端开发流程
  9. LNK2005 解决方法以及发生原因
  10. Visio绘图工具,“连接线”命令使用方法