编译原理笔记13:自上而下语法分析(3)构造预测分析表、LL(1) 文法

news2024/11/18 11:38:32

目录

    • 构造预测分析表
      • 不懂也能用的构造步骤
      • FIRST、FOLLOW 和分析表的原理?
    • LL(1) 文法

构造预测分析表

预测分析表的作用,是为推导的进行指明方向——我们用当前下推栈栈顶和读写头所指向的符号的组合(即当前的状态),去查询预测分析表,以确定推导的下一步该向着何种方向前进。

推导应该前进的方向,由 FIRST、FOLLOW 集合说明——这两个集合能够说明,我们可以通过怎样的方式来一步步向着终结符靠近。

不懂也能用的构造步骤

预测分析表构造的步骤如下,建议按照例子实操一遍。实在想不通,背下来步骤应该也可以把表构造出来。

  1. 看待填行的行首非终结符 A
  2. 找到左部是上面看到的这个非终结符 A 的产生式,根据产生式右部的不同,按以下三种情况处理:
    1. 如果产生式是以非终结符 B 打头的序列 α ,那么找到 FIRST(B),将 FIRST(B) 集合中每个元素所在列、非终结符 A 所在行确定的位置填写上序列 α
    2. 如果产生式是以终结符 a 打头的序列 β ,那么直接去找终结符 a 所在列,并将 β 填入 A 行 a 列的位置中
    3. 如果产生式是 ε,则找到 FOLLOW(A) ,将 FOLLOW(A) 集合中每个元素所在列、非终结符 A 所在行确定的位置填写上 ε

概括来说,就是:根据产生式左部的非终结符确定本次要构造的分析表行。根据 FIRST、FOLLOW 集合,将产生式右部填入分析表,以此确定每行的内容。比如对于产生式 L → E;L|ε,我们需要把产生出来的右部 E;Lε 填入到分析表 L 行的某些位置中。

实例如下:

在这里插入图片描述

FIRST、FOLLOW 和分析表的原理?

FIRST、FOLLOW 集合都能够说明一些东西,比如, FIRST(L) 集合告诉我们:

  • 如果此时栈顶是 L ,而读写头读到了 id,那么我们应该用 E;L 来进行展开,因为这样可以让推导过程向着【把栈顶元素变为id 】的方向前进。这是因为从 E 开始经过数步推导后,E 能够最终展开为 id 而完成匹配
    在这里插入图片描述

  • 如果此时栈顶是 L ,而读写头读到了 num ,那么我们应该用 E;L 来进行展开,因为这样可以让推导过程向着【把栈顶元素变为 num】的方向前进。这是因为从 E 开始经过数步推导后,E 能够最终展开为 num 而完成匹配
    在这里插入图片描述

  • 如果此时栈顶是 L ,而读写头读到了 ( ,那么我们应该用 E;L 来进行展开,因为这样可以让推导过程向着【把栈顶元素变为 (】的方向前进。这是因为从 E 开始经过数步推导后,E 能够最终展开为 ( 而完成匹配
    在这里插入图片描述

而当产生式右部是 ε 时,根据该产生式左部的非终结符所对应的 FOLLOW 集合来确定这个 ε 该填到哪里——也就是说,仅当某个非终结符的产生式右部为 ε 时,我们才需要考虑 FOLLOW 集合

  • 如果此时栈顶是 T',而读写头读到了 + ,那么……嗯,T' 可没有展开为 + 的产生式啊,但 T' 可以被穿透,其 FOLLOW 集合 FOLLOW(T') 是包含 + 的;
  • 同理,如果此时栈顶是 T',而读写头读到了 - ,也可以通过选择将 T' 以 ε 展开而穿透的方式来向着推出 - 的方向前进。

LL(1) 文法

LL(1),第一个 L ,代表从左到右扫描输入序列,第二个 L 代表推导的过程是最左推导。1 则代表只有一个读写头(也就是每次都只向前看一个终结符)

该文法的分析表的每个格子中只能有一个产生式的右部。该文法必须是非二义的,文法的产生式不能包含公共左因子和左递归。

LL(1) 文法使用范围有限,实际主要使用 LR(1) 文法。LR(1) 文法是 LL(1) 文法的真超集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全学习指南:新手入门建议

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言网络安全基础知识学…

IPv6:连接未来的新一代互联网协议

由于互联网发展迅猛,IPv4地址数量已经接近枯竭。IPv6应运而生,成为下一代互联网协议。IPv6较IPv4来说,地址容量上升了数倍,并有更好的安全性和效率。 IPv6(Internet Protocol version 6)是指新一代互联网协…

【Java】如何优雅的关闭线程池

文章目录 背景一、线程中断 interrupt二、线程池的关闭 shutdown 方法2.1、第一步:advanceRunState(SHUTDOWN) 把线程池置为 SHUTDOWN2.2、第二步:interruptIdleWorkers() 把空闲的工作线程置为中断2.3、 第三步:onShutdown() 一个空实现&…

PG系列2:Linux下yum安装PG 15

文章目录 一. 下载PG二. 开始安装2.1 安装数据库2.2 初始化数据库2.3 设置开机启动2.4 修改密码2.5 设置允许远程连接2.6 重启数据库服务2.7 修改数据库密码 三. 验证参考: 一. 下载PG 官网地址: https://www.postgresql.org/选择Download 选择CentOS 选择对应的版本 …

iOS 单元测试之常用框架 OCMock 详解

目录 前言: 一、单元测试 1.1 单元测试的必要性 1.2 单元测试的目的 1.3 单元测试依赖的两个主要框架 二、OCMock 的集成与使用 2.1 OCMock 的集成方式 2.2 OCMock 的使用方法 2.3 mock使用限制 三、最后 前言: 在iOS开发中,单元测…

OpenCV——实验结果输出《图像基本操作》

1.图像融合 图像融合主要使用的函数为 cv2.addWeighted() #图像融合 # img_cat img_dog #shapes (414,500,3) (429,499,3) img_dog cv2.resize(img_dog,(500,414))#resize函数,不考虑图像形变问题。 print(img_dog.shape) #两张图片的权重相同,gamm…

java编写金字塔

一、实心金字塔 首先,尝试写一个逐层加1个*的金字塔: 可以看出,每一层由空格和*组成,且空格*的总数为底部基石的数量,那么前后空格数就是(底部基石数 - 各层星星数)*1/2,然后拼接字…

C# 特性(Attribute)总结

目录 特性是什么? 如何使用特性? (1).Net 框架预定义特性 (2)自定义特性 为什么要使用特性? 特性的应用 特性实现枚举展示描述信息 特性是什么? 特性(Attribute&…

基于spss的多元统计分析 之 聚类分析+判别分析(2/8)

实验目的: 1.掌握聚类分析及判别分析的基本原理; 2.熟悉掌握SPSS软件进行聚类分析及判别分析的基本操作; 3.利用实验指导的实例数据,上机熟悉聚类分析及判别分析方法。 实验前预习:…

js中原型和原型链的理解(透彻)

js中原型、原型链、继承的理解(透彻) 1、前言1.1 什么是函数对象1.2 什么是实例对象1.3 什么是原型对象1.4 构造函数、原型对象、实例对象的关系 2、原型3、原型链4、原型的相关属性及方法5、总结 1、前言 1.1 什么是函数对象 函数对象就是我们平时称呼…

centos连接XShell

先设置网络自动连接,为Xshell 连接centos做准备 选择应用程序->系统工具->设置 选择网络,如果有线没有打开,选择打开,在点击设置 记住ipv4地址,选择自动连接,然后应用 最后鼠标右键点击桌面&#xf…

RabbitMQ入门案例之Topic模式

前言: 本文章将介绍RabbitMQ中的Topic(主题)模式,其中还会涉及 ‘#’ 和 ‘*’ 两个通配符在RabbitMQ中的区别。 官网文档地址:https://rabbitmq.com/getstarted.html 什么是Topic模式 RabbitMQ的Topic模式是一种基于…

SpringBoot 如何使用 Spring Integration 处理事件

SpringBoot 如何使用 Spring Integration 处理事件 Spring Integration 是 Spring Framework 的一个扩展,它提供了一种基于消息传递的集成模式。使用 Spring Integration,我们可以将不同的应用程序、系统和服务连接起来,从而实现数据的传递、…

VMware中Linux虚拟机配置静态ip

一、输入ip addr查看ip地址 二、输入cd /etc/sysconfig/network-scripts进入centos网络配置文件夹 三、接着输入ls查看目录 四、 输入vi ifcfg-ens33进入网卡配置 五、 进入以后是这个界面,红色方框里的内容是需要手动修改的,下面图片里已经修改过了。 …

【C】分支和循环语句的简单介绍

语句 分支语句if语句语法结构代码演示 switch语句语法结构代码演示 循环语句while循环语法结构代码分析 for循环语法结构代码演示 do...while循环语法结构代码分析 什么是语句呢? 在C语言中由分号(;)隔开的就是一条语句。 分支语句 if语句 …

【算法设计与分析】期末考试知识总结(知识超浓缩版)

目录 简要介绍 复杂度 迭代 插入排序 二分查找 快排划分 选择排序 计数排序 基数排序 桶排序 递归 递归式的计算-四种方法 欧几里得算法 汉诺塔问题 快速排序 归并排序 堆排序 分治 二维极大点问题 一维最邻近点对 二维最邻近点对 逆序对的数目 凸包 最大字段…

RecyclerView 低耦合单选、多选模块实现

作者:丨小夕 前言 需求很简单也很常见,比如有一个数据列表RecyclerView,需要用户去点击选择一个或多个数据。 实现单选的时候往往简单下标记录了事,实现多选的时候就稍微复杂去处理集合和选中。随着项目选中需求增多&#xff0c…

k8s的部署

二进制搭建 Kubernetes v1.20 k8s集群master01:192.168.92.30 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:192.168.92.21 k8s集群node01:192.168.92.40 kubelet kube-proxy docker k8s集群node02…

阿里云热修复打补丁包注意事件

1、每次发布app到应用市场前,注意保存没有加固前的apk文件和mapping.txt 2、修复好bug,打包app前,要做的事情 (1)先把有问题的apk的mapping.txt文件复制到/app路径下 (2)修改混淆配置:将-printmapping mapping.txt使…

Android蓝牙协议知识汇总

蓝牙协议下载 蓝牙技术联盟网址:https://www.bluetooth.com/ 在这个网址搜索,比如: 在搜索结果中找到蓝牙协议规范: 点击上面网址: 蓝牙手册里包含了部分核心协议,比如L2CAP、SDP、ATT、GATT&#x…