SLR(1)语法分析(Java实现)

本文介绍了如何实现一个SLR(1)语法分析器,首先概述了SLR(1)与LR(0)的关系,然后详细解释了LR(0)分析过程,包括增广文法、项目集、闭包和GOTO函数。接着,文章讨论了SLR(1)分析过程和构造分析表的方法,并分析了SLR分析器的局限性,涉及移进/归约冲突问题。
摘要由CSDN通过智能技术生成

实现一个SLR(1)语法分析器,近期忙于他事,项目集和语法分析表暂时采用手动输入,有空再填坑,后附源码。

SLR是基于LR(0)实现的,故先进行LR(0)分析。

Tips:
龙书给的4.36算法伪代码写得过于简略,容易造成误导,本文给出具体算法和分析过程。

代码在https://github.com/monimm/LLandLR


SLR(1)分析流程

  • 输入文法
  • 求first集
  • 求follow集
  • 构造LR(0)项目集
  • 构造DFA

先上结果截图
这里写图片描述

这里写图片描述


自底向上分析

  • 自底向上分析法,又称为移进-归约法。
    目前流行的自底向上的语法分析器都基于LR(k)语法分析: L表示从左至右,R表示向左推导,k表示决定时向前看的符号个数
  • LR分析是表格驱动的

对输入符号串自左向右进行扫描,并将输入符逐个移入一个先进后出栈中,边移进边分析,一旦栈顶符号串形成某个句型的可归约串时,就用相应产生式的左部非终结符代替此可归约串。重复这一过程,直到归约到栈中只剩下文法的开始符号时分析成功。


冲突

移进-归约冲突

即使知道了栈的所有内容以及接下来的k个输入符号,仍然无法判断应该进行移进还是归约操作

归约-归约冲突

无法在可能的多个归约方法中选择正确的归约动作。


LR(0)分析

增广文法

如果G是一个以S开始符号的文法,那么G的增广文法G’就是在G中加上新开始符号S’和产生式S’ → S而

  • 1
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值