首页 > 编程语言 >SLR算法

SLR算法

时间:2024-02-24 19:46:13浏览次数:16  
标签:移进 归约 SLR 算法 LR FOLLOW

目录


SLR算法

编译原理中的SLR(Simple LR)算法是一种用于解决文法分析冲突的策略,它基于LR(0)算法,但进行了一些简化和改进。SLR算法通过引入FOLLOW集来解决冲突,使得在特定状态下,可以根据下一个输入符号是属于移进集合还是某个FOLLOW集来决定动作。

在SLR算法中,对于每个状态,都存在一个移进集合和一个或多个FOLLOW集。移进集合包含了在该状态下可以移进的符号,而FOLLOW集则包含了可以使得某个非终结符归约的所有符号的集合。当遇到冲突时,SLR算法会查看当前输入符号属于哪个集合,从而决定是移进还是归约。

需要注意的是,虽然b∈FOLLOW(A)是归约α的一个必要条件,但它不是充分条件。也就是说,即使b属于与规约项目A->α相关联的FOLLOW(A),也不能保证α一定被归约。因此,在解决冲突时,还需要考虑其他因素,如输入符号的序列和当前状态等。

此外,SLR算法还需要维护两个栈:状态栈和符号栈。在分析输入字串时,根据ACTION表进行移进或归约操作,并将相应的状态或符号压入相应的栈中。这样,在遍历完整个输入字串后,就可以得到最终的语法分析结果。


算法步骤

SLR(Simple LR)算法是编译原理中的一种文法分析算法,用于处理具有冲突的文法。SLR算法是LR(0)算法的一个简化版本,它通过引入FOLLOW集来解决移进-归约冲突。以下是SLR算法的实现步骤:

  1. 增广文法:首先,对给定的上下文无关文法进行增广。增广文法是在原文法中增加一个新的开始符号S'和产生式S' → S。这一步是为了方便构建分析表。
  2. 构建LR(0)项目集:对于增广文法的每个产生式,根据其右部不同位置上的点(·)来构建LR(0)项目。产生式A → α·β表示当前分析到α时,接下来需要分析β。
  3. 计算FIRST集和FOLLOW集:对于每个项目,计算其FIRST集和FOLLOW集。FIRST集表示某项目可能推导出的符号串的首个符号的集合,而FOLLOW集表示某非终结符后面可能跟随的终结符的集合。
  4. 构建项目集规范族:根据LR(0)项目集、FIRST集和FOLLOW集,构建项目集规范族。项目集规范族是一组项目集,每个项目集代表一个分析状态。
  5. 构建ACTION表和GOTO表:ACTION表用于指导分析过程中的移进和归约操作,而GOTO表用于在归约后跳转到新的状态。
  6. 分析输入字串:从初始状态开始,根据ACTION表和GOTO表,对输入字串进行逐符号的分析。若ACTION表指示移进,则将当前符号压入符号栈,并将对应的状态压入状态栈。若ACTION表指示归约,则根据归约的项目从符号栈中弹出相应的符号,并更新状态栈。
  7. 处理冲突:当遇到冲突时,根据FOLLOW集和当前输入符号来决定是移进还是归约。如果输入符号属于某个非终结符的FOLLOW集,则选择归约;否则选择移进。
  8. 接受或报错:当分析完整个输入字串后,如果状态栈的栈顶状态是接受状态,则接受该字串;否则报错。

通过以上步骤,SLR算法可以完成对整个输入字串的语法分析,并判断其是否符合给定的文法规则。需要注意的是,SLR算法只能处理某些类型的冲突,对于更复杂的冲突情况(如GLR算法所能处理的),可能需要使用更高级的文法分析算法。


与LR0算法的区别

SLR(Simple LR)算法和LR(0)算法都是用于编译原理中文法分析的算法,但它们在处理冲突和构造分析表方面存在显著的区别。

  1. 冲突解决
  • LR(0)算法:它仅基于“历史”资料(即已分析的字符序列)来做出决策,而不考虑未来的输入。因此,LR(0)算法不能解决移进-归约冲突归约-归约冲突
  • SLR算法:它引入了FOLLOW集的概念来解决移进-归约冲突。当遇到冲突时,SLR会检查当前输入符号是否属于某个非终结符的FOLLOW集,如果是,则选择归约;否则选择移进。这使得SLR能够处理某些类型的冲突,而LR(0)不能。
  1. 分析表构造
  • LR(0)算法:它构造的分析表仅基于LR(0)项目集族,而不考虑搜索符或向前看的信息。
  • SLR算法:虽然它也基于LR(0)项目集族,但它会在需要时增加向前看的信息(即FOLLOW集)来解决冲突。这使得SLR的分析表可能更复杂,但功能也更强大。
  1. 文法覆盖范围
  • LR(0)算法:由于其简单性和局限性,LR(0)算法只能处理那些没有移进-归约冲突和归约-归约冲突的文法。
  • SLR算法:通过引入FOLLOW集和向前看的概念,SLR算法能够处理具有移进-归约冲突的文法,但仍然受到归约-归约冲突的限制。

总结:LR(0)算法是一种较简单但功能较弱的文法分析算法,而SLR算法通过引入FOLLOW集和向前看的概念来增强其功能,能够处理某些类型的冲突。因此,在选择文法分析算法时,需要根据具体的应用场景和需求来权衡其复杂性和功能。

标签:移进,归约,SLR,算法,LR,FOLLOW
From: https://www.cnblogs.com/yubo-guan/p/18031471

相关文章

  • 算法的评估指标 转载自知乎https://zhuanlan.zhihu.com/p/400644465
    什么是评估指标?评估指标是针对模型性能优劣的一个定量指标。一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。针对不同类型的学习任务,我们有不同的评估指标,这里我们来介绍最常见的分类......
  • 2024牛客寒假算法基础集训营3
    2024牛客寒假算法基础集训营3A 智乃与瞩目狸猫、幸运水母、月宫龙虾题意给出若干组字符串,判断无视大小写,判断首字母是否相同思路如果首字母相同,则直接用\(==\)比较即可,如果首字母只有大小写的区别,则ASCII码值相差\(32\)代码/*******************************|Author:......
  • 基于Harris角点的多视角图像全景拼接算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述       基于Harris角点的多视角图像全景拼接算法是一种在计算机视觉和图像处理领域中广泛应用的算法,用于将来自不同视角的多个图像拼接成一个全景图像。该算法主要依赖于特征点检测和图像......
  • 洛谷【算法1-3】暴力枚举
    P2241统计方形(数据加强版)-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintINF=0x3f3f3f3f;lln,m,z,c;signedmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin......
  • 代码随想录算法训练营第二十七天 | 90.子集II , 78.子集, 93.复原IP地址
    93.复原IP地址 已解答中等 相关标签相关企业 有效IP地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和"192.168.1.1" 是 有效 IP地址,但是 "0.011.255.245"、"1......
  • 算法-字符串
    1.反转字符串(LeetCode344)题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。思路:双指针,左边和右边对应位置的依次交换classSolution{......
  • KMP 字符串搜索算法
    KMP字符串搜索算法是Knuth、Morris、Pratt三位在类似的时间段内一起发明的一种字符串搜索算法,该算法的主要原理是利用待查找子串中的某些信息,在匹配失败时能够减少回退的步数算法原理假设现在有一个待搜索的字符串ABABAC,如何利用现有的字符串实现在字符不匹配时尽可能向后调......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 2024牛客寒假算法基础集训营6
    2024牛客寒假算法基础集训营6比赛链接打一半就收拾行李了,不想开学呜呜呜(应该是lzgg出的题)A.宇宙的终结思路数据不大才100,所以模拟完全可以过去Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()std::vector<......
  • 代码随想录算法训练营第二十六天| 39. 组合总和 40.组合总和II 131.分割回文串
    组合总和题目链接:39.组合总和-力扣(LeetCode)思路:依然一是套用回溯模板,但是我们这里用回溯的是i而不是i+1,因为元素可以重复使用,注意for循环里if(sum(path)<=target)的等号不能少。classSolution{public:vector<int>path;vector<vector<int>>result;intsu......