Parse算法学习笔记

Parse算法是一种自底向上的语法分析算法,其主要应用于编译器中的语法分析阶段。相比于其他语法分析算法,Parse算法具有简单、高效的特点。本篇文章将详细介绍Parse算法的原理、构造和应用等内容。

原理

Parse算法的主要思想是“先找到一部分右侧句子,再通过规则逐步扩展成完整的句子”。这个过程不断重复,直到匹配整个输入字符串为止。因此Parse算法是自底向上的语法分析算法。

具体来说,Parse算法通过建立一个栈来记录推导过程,栈中初始只有一个起始符号 S S S,然后不断读入输入字符串中的字符,并根据文法规则进行推导和归约。当栈顶符号与当前输入字符不能匹配时,就将栈顶符号作为右侧句子的一部分,继续进行推导;当栈顶符号与当前输入字符能够匹配时,则将栈顶符号和当前输入字符同时弹出,继续进行推导。

Parse算法的主要过程如下所示:

  1. 读入输入字符串。
  2. 将起始符号 S S S 入栈。
  3. 读入输入符号。
  4. 如果栈顶符号与当前输入符号匹配,则将栈顶符号和当前输入符号都弹出,继续读入下一个输入符号。
  5. 如果栈顶符号与当前输入符号不匹配,则将栈顶符号归约为右侧句子的一部分,继续进行推导。
  6. 如果所有输入符号已经被读入且栈顶符号为 S S S,则语法分析成功,否则为语法错误。

构造

Parse算法的构造涉及到文法的转换和状态机的构建。

文法转换

对于一个给定的上下文无关文法,需要先将其转换为增广文法。增广文法是指在原有文法的基础上,添加一个新的起始符号和一个新的产生式,使得增广文法的任何一条产生式都不含有旧的起始符号。

具体地,假设给定的原始文法为 G = ( V , T , P , S ) G=(V,T,P,S) G=(V,T,P,S),其中 V V V 表示非终结符号集合, T T T 表示终结符号集合, P P P 表示产生式集合, S S S 表示起始符号。则增广文法为 G ′ = ( V ′ , T , P ′ , S ′ ) G'=(V',T,P',S') G′=(V′,T,P′,S′),其中:

  • V ′ = V ∪ { S ′ } V'=V\cup\{S'\} V′=V∪{S′},其中 S ′ ∉ V S'\notin V S′∈/V。
  • T = T T=T T=T,即终结符号集合不变。
  • P ′ = { S ′ → S } ∪ P P'=\{S'\rightarrow S\}\cup P P′={S′→S}∪P,即在原始文法的所有产生式前添加一个新产生式 S ′ → S S'\rightarrow S S′→S。
  • S ′ = S ′ S'=S' S′=S′,即新的起始符号为 S ′ S' S′。

状态机构建

Parse算法的关键在于如何构建状态机。对于一个增广文法,每个状态都表示当前应该考虑的推导序列。状态机由两部分组成:状态集合和转移函数。

状态集合分为两类:内核状态和闭包状态。内核状态表示栈顶符号可以直接推导出当前输入符号的状态,而闭包状态表示栈顶符号无法直接推导出当前输入符号,需要通过归约操作来实现。状态通过内核和闭包之间的转移实现。

具体地,根据每个产生式 X → α X\rightarrow\alpha X→α 可以得到一个项目 [ X → ⋅ α ] [X\rightarrow\cdot\alpha] [X→⋅α],表示在当前符号为 X X X 时,可以通过推导得到 α \alpha α。一个状态则可以含有多个项目。

状态机的转移函数根据当前状态和下一个输入符号进行计算,具体方式如下:

  1. 求出当前状态中每个项目的点( ⋅ \cdot ⋅)后面的符号,如果是输入符号,则将该项目移动到内核状态中;如果是非终结符号,则将所有以该非终结符号为左部的产生式加入到闭包状态中。
  2. 将所有闭包状态中的项目移动到内核状态中,直到没有新的项目可添加为止。

最终,构建出的状态机可以表示为一个DFA(确定有限状态自动机),其中每个状态都对应着一个子集。

应用

Parse算法主要应用于编译器中的语法分析阶段。它可以用来解析程序代码,并生成语法树。

常见的Parse算法包括LR、SLR、LALR和LL等。不同的Parse算法在处理文法时采用的策略不同,因此效率和精确度也有所不同。具体选择哪种算法需要结合实际情况进行考虑。

总结

本篇文章简要介绍了Parse算法的原理、构造和应用等内容,深入理解Parse算法对于编写高效、稳定的编译器至关重要。

Parse算法学习笔记相关推荐

  1. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  4. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  5. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  6. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  7. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  8. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  9. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

最新文章

  1. opencv-车牌区域提取
  2. Spring集成线程池
  3. oracle表空间的创建及dmp 文件的导入
  4. php关键词分词搜索 最多匹配的排在最前面_百度搜索引擎工作原理,做Seo的建议看一看 - 蜘蛛池博客...
  5. 使用postman删除Marketing Cloud里的contact数据
  6. [蓝桥杯][2015年第六届真题]生命之树(树形dp)
  7. unity摄影机depth模式_Unity3D Camera 摄像机属性详解
  8. 画面风格写实的5z20
  9. 【今日CS 视觉论文速览】 24 Jan 2019
  10. 如何在Cell里画出虚线?
  11. 嵌入式Linux开发|点亮那颗LED灯
  12. 数字图像处理技术与人脸识别
  13. Python--单引号、双引号、三引号用法
  14. 大神之光照耀着我 - 我的成长之路 - 起点
  15. C. Multiples of Length 思维构造
  16. 软件扫描出rsh漏洞,但是并无安装rsh服务,原因是为何?
  17. PHP反序列化原生类利用
  18. 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exis
  19. PlatoFarm进展不断,接连上线正式版以及推出超级原始人NFT
  20. 实战:战狼2票房数据分析——(3)数据读取及分析

热门文章

  1. 图片备注批注,更生动——《超级处理器》应用
  2. 穿上一件小白裙,就是我喜欢夏日的理由
  3. 如何批量发送html邮件,使用qq邮箱批量发送邮件 实例源码(支持富文本)
  4. ARCGIS空间数据图层叠加分析
  5. Android 泰语/缅甸语/捷克语下,Contacts列表中联系人出现排序错乱的
  6. 博士申请 | 新加坡国立大学刘谦雄老师招收机器学习方向全奖博士/博后/RA
  7. zynq bram读写 linux,Zynq-7000 通过BRAM实现PS、PL数据共享问题
  8. 计算机学院大学毕业晚会标题,“告白青春,感谢有你” 计算机学院2018届毕业晚会圆满举行...
  9. 【Scripts系列】之Makefile中条件分支ifeq/else/endif/else ifeq/ifneq/ifdef/ifndef用法详解
  10. StringIO 的用法