美文网首页
编译器笔记14-语法分析-SLR分析

编译器笔记14-语法分析-SLR分析

作者: 衣忌破 | 来源:发表于2019-11-23 22:55 被阅读0次
LR(0) 分析过程中的冲突
LR(0) 分析过程中的冲突.png

当在状态2时输入符号为 * 时候,可以采取移入操作也可以采取归约操作。那到底选用哪一个操作呢?归根结底还是一个如何识别句柄的问题。如果栈顶的T为句柄的话就使用归约操作,否则的话就不能使用归约操作。由此可见LR(0)的信息已经不能帮助我们确定是否进行归约。

事实上LR(0)分析在构造时,向前查看了零个符号,也就是没有向前查看符号,即没有考虑文法符号的上下环境。

上图例子中状态2在下一个符号是*时,如果把栈顶的T归约成E。由上图可知 * 不在FOLLOW(E)中,所以即便归约成E,E后也不可能跟 * ,所以不应该归约,T不是句柄。由此可见FOLLOW集可以帮助判断在哪些情况下不能进行归约,这也是SLR分析法的基本思想。

SLR分析
SLR分析法的基本思想.png

解决LR(0)文法的移入归约冲突,其实就是加强对文法的约束以避免冲突,其实分析方法中并没因此做出任何改变。

表达式文法的SLR分析表
SLR分析表.png 分析.png
SLR 分析表构造算法
SLR 分析表构造算法.png

如果给定文法的SLR分析表中不存在有冲突的动作,那么该文法成为SLR文法。

SLR分析中的冲突
移入归约冲突.png

由上图可知当状态2遇到等号时遇到了移入归约冲突。某些情况下仅利用FOLLOW集的信息去化解冲突是不够的。为了消解这种冲突需要使用更强大的LR(1)分析法

相关文章

  • 编译器笔记14-语法分析-SLR分析

    LR(0) 分析过程中的冲突 当在状态2时输入符号为 * 时候,可以采取移入操作也可以采取归约操作。那到底选用哪一...

  • iOS 编译过程

    iOS 编译采用 Clang 作为编译器前端,LLVM 作为编译器后端,编译器前端负责语法分析,语义分析,生成生成...

  • JavaScript运行机制

    传统代码编译过程(编译器): 1、词法分析 将变量,运算符等直接翻译 2、语法分析 对翻译结果进行语法分析,构造语...

  • 编译原理-语法分析学习笔记

    语法分析的目的 词法分析与语法分析处于编译器的前端,对输入的源程序进行分析。词法分析,类似于将语句切分为关键字...

  • 第四章第4节 SLR分析

    SLR 分析 表达式文法的 SLR 分析表 SLR分析表构造算法 冲突依然存在

  • 精读《手写 SQL 编译器 - 回溯》

    1 引言 上回 精读《手写 SQL 编译器 - 语法分析》 说到了如何利用 Js 函数实现语法分析时,留下了一个回...

  • LR技术——SLR语法分析表

    我们之前意见写好了自动机,接下来用自动机来构建语法分析表。语法分析表由两部分组成,一个语法分析动作函数ACTION...

  • 精读《手写 SQL 编译器 - 回溯》

    1 引言 上回精读《手写 SQL 编译器 - 语法分析》说到了如何利用 Js 函数实现语法分析时,留下了一个回溯问...

  • 浏览器中的编译器和解释器

    编译器和解释器的执行过程 相同点:都会进行【词法分析】【语法分析】==> 生成AST(抽象语法树) 不同点:编译器...

  • 【MOOC:编译原理】第一章 编译概述

    第一讲 编译器概述 第二讲 编译器结构 编译器具有非常模块化的高层结构 前端:词法分析, 语法分析 后端:指令生成...

网友评论

      本文标题:编译器笔记14-语法分析-SLR分析

      本文链接:https://www.haomeiwen.com/subject/pdtxictx.html