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

news/2025/2/24 17:34:58

目录

    • 构造预测分析表
      • 不懂也能用的构造步骤
      • 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.niftyadmin.cn/n/454471.html

相关文章

VS调试时无响应,卡顿,卡死的解决方案

1.修改体调试设置 调试->选项->调试->符号;去掉xxx服务器,勾选仅加载指定的模块 2.修改搜狗输入法 3.由于VS运行太久缓存太多。 1.单击“开始”,选择“运行...”,或者winr快捷键 2.键入“devenv.exe /resetuserdata”。 此命令…

uniapp 前端定时刷新token,接口排队等待,promise 接口封装

一、需求 此项目为小程序。小程序完成第一版token刷新设计思路是:根据接口调用返回的errorCode来判断当前用户的token和refreshToken是否过期。根据不同的errorCode,前端去调用接口完成token的刷新或者跳转到登录页面重新登录。 由于小程序的用户功能权限…

Spring Boot 中自定义数据校验注解

Spring Boot 中自定义数据校验注解 在 Spring Boot 中,我们可以使用 JSR-303 数据校验规范来校验表单数据的合法性。JSR-303 提供了一些常用的数据校验注解,例如 NotNull、NotBlank、Size 等。但是,在实际开发中,我们可能需要自定…

Linux中centos修改系统时间并写到硬件,Linux中centos设置定时自动同步网络时间

文章目录 前言一、centos修改系统时间并写到硬件1.1查看当前的系统时间1.2修改系统时间1.3查看硬件时间1.4同步系统时间和硬件时间1.5本地时间写入硬件时间 二、centos设置定时自动同步网络时间2.1安装ntpdate工具2.2CentOS安装/操纵crontab2.3启动crontab并查看状态2.4写一个c…

【头歌-Python】Python第七章作业(初级)

第1关:字符串去重排序 任务描述 输入一个非空字符串,去除重复的字符后,从小到大排序输出为一个新字符串。 输入格式 一个非空字符串 输出格式 去重排序后的字符串 示例 输入: Life is short, you need Python!输出&#…

史上最大图灵测试实验完成150万人类参与1000万次对话,判断对面是人还是AI

本文 介绍 了AI 21实验室推出了一个好玩的社交图灵游戏——「人类还是机器人?」 【导读】这个「人类还是AI?」的游戏一经推出,就被广大网友们玩疯了!如今全世界已有150万人参与,网友们大方分享自己鉴AI的秘诀。 历上规模最大的…

Mysql高阶语句(一)

Mysql高阶语句(一) 一、MySQL高级进阶SQL 语句1、SELECT斜体样式2、DISTINCT3、WHERE4、AND、OR5、IN6、BETWEEN7、通配符、LIKE8、ORDER BY9、| | 连接符10、GROUP BY11、HAVING 二、函数1、数学函数2、聚合函数3、字符串函数4、日期时间函数 一、MySQL…

自由软件,自由社会之GNU 操作系统的初始公告

导读这是 GNU 工程的原始通告,由理查德斯托曼于 1983 年 9 月 27 日发表。纵观历史,可以发现 GNU 工程在很多地方都与这份初始通告有很多差异。比如实际是拖延到了 1984 年 1 月才开始。而自由软件的很多哲学理念也是数年之后才得以厘清。 From mit-vax!…