【编译原理】LL(1)文法

news2024/9/29 0:21:51

文章目录

  • 语法分析基本概念
  • 自上而下语法分析
    • 自上而下语法分析的问题
  • 消除文法左递归
    • 消除直接左递归
    • 消除间接左递归
    • 消除左递归的算法
  • 解决回溯问题
    • FIRST集与提出公共左因子
      • FIRST集
      • 提取左公共因子
    • FOLLOW集合
  • 构造FIRST集和FOLLOW集
    • 构造FIRST集合
      • 构造每个文法符号的FIRST集合
      • 构造任何符号串的FIRST集合
    • 构造FOLLOW集合
  • LL(1)文法
    • 文法条件
    • 分析过程
      • 一个示例
  • 参考资料

语法分析基本概念


image.png
前置知识
词法层面:采用正规式有限自动机描述和识别语言的单词符号
语法层面:用上下文无关文法描述语法规则

上下文无关文法(CFG)
四元式G=( V T V_T VT, V N V_N VN, S S S, P P P)
V T V_T VT: 终结符集合,非空
V N V_N VN: 非终结符集合,非空,表示各层次的句法单位
S: 文法的开始符号,S ∈ V N \in V_N VN 指程序这个句法单位
P: 产生式集合,产生式形为 P − > α P-> \alpha P>α , P ∈ V N P \in V_N PVN , α ∈ ( V N ∪ V T ) ∗ \alpha \in (V_N \cup V_T)^* α(VNVT)

直接推出和推导
直接推出:根据产生式得到,举个例子,当 A − > γ ∈ P A-> \gamma \in P A>γP α 、 β ∈ ( V T ∪ V N ) ∗ \alpha、\beta \in (V_T \cup V_N)^* αβ(VTVN) 是,则有 α A β − > α γ β \alpha A \beta -> \alpha \gamma \beta αAβ>αγβ ,即 α A β \alpha A \beta αAβ直接推出 α γ β \alpha \gamma \beta αγβ
推导:经过多步直接推出得到,若 α 1 − > α 2 − > . . . − > α n \alpha_1 -> \alpha_2 ->...-> \alpha_n α1>α2>...>αn,则 α 1 \alpha_1 α1可以推导出 α n \alpha_n αn

句子、句型、语言的概念
句型:S推导得到的串
image.png
句子:仅含终结符的句型
语言:文法G产生的所有句子的集合,记为 L ( G ) L(G) L(G)
image.png

语法分析的任务
分析一个文法的句子的结构,用语法分析树表示

语法分析器的功能
按照文法产生式P,识别输入串(词法分析结果)是否为一个句子(一个形式上正确的程序)

语法分析的地位
在编译器中起主导、推动作用

语法分析分类
image.png

自上而下语法分析

基本思想
从文法的开始符号开始,向下推导,推出句子/从语法分析树的根开始,自上而下逐步构建出整个树
分析示例
image.png
说明:IP可以视为调用词法分析器,调用一次就得到输入单词

自上而下语法分析的问题

回溯问题
候选式重新选择
image.png
如何避免回溯问题的出现,即是说当自上而下进行推导的过程中出现某一非终结符有多个候选式的情况,如何选择正确的候选式进行语法分析?

文法左递归
出现输入串的语法分析停止向前推进但语法分析树不断增长的情况
image.png

消除文法左递归

文法左递归分为直接左递归和间接左递归两种,下面将分别叙述这两种左递归的消除方法

消除直接左递归

左递归变为右递归,需要满足的条件在于产生式转换后得到的短语不会变化
image.png
一个适用更普遍的消除直接左递归的示例
image.png
习题(ps: 产生式不要忘记 ϵ \epsilon ϵ
image.png

消除间接左递归

一个间接左递归的例子
image.png
方法的适用条件
image.png
如何改造
将间接左递归通过推导转化为某非终结符的直接左递归,再通过左递归转右递归的方式消除得到的直接左递归
image.png

消除左递归的算法

image.png
习题
image.png
需要注意的问题:

  1. 算法中最后一步是消除从S(开始符号)永远无法到达的非终结符的产生式。在习题中即是说Q、R是S推导无限多步也不会得到的,因而是无用的,这两个非终结符的作用已经被 S ′ S' S发挥了
  2. 消除左递归算法中对非终结符的排序是feel free的,不同的排序方式会得到不同的文法形式,但他们所定义的语言是相同的

解决回溯问题

消除回溯的前提
image.png

FIRST集与提出公共左因子

怎么选择合适的候选式,根据当前输入字符,选择以当前输入字符开头的候选式,或是以能够推出当前输入字符的非终结符开头的候选式

FIRST集

终结首符集,G中每个非终结符的每个候选式都有一个FIRST集 F I R S T ( α ) FIRST(\alpha) FIRST(α)
image.png
消除回溯的必要条件之一
image.png
image.png

提取左公共因子

使得一个非终结符的多个候选式的首字符集尽可能不相交
引入新的非终结符,使得左公共因子只出现一次
image.png

FOLLOW集合

考虑 ϵ \epsilon ϵ 候选的情况
文法定义如下
image.png
分析结果
image.png
考虑这样一个格局,这这个格局里面出现句型 i T ′ + iT'+ iT+,即是说+会跟在T’后面,于是在匹配输入时,我们将T’推为了 ϵ \epsilon ϵ
image.png
FOLLOW集合
用来说明一个非终结符号后面能跟什么终结符
定义
image.png
怎么用
image.png
当当前输入符号不在A的任何候选首符集中时,若a出现在了A的FOLLOW集中,并且A有 ϵ \epsilon ϵ候选,则这里可将A推导为 ϵ \epsilon ϵ
注意
image.png

构造FIRST集和FOLLOW集

将对无穷推导空间的考察转变为对有限产生式的反复扫描得到结果

构造FIRST集合

image.png

构造每个文法符号的FIRST集合

image.png
注意:

  1. X − > Y . . . X->Y... X>Y... ϵ ∈ F I R S T ( Y ) \epsilon \in FIRST(Y) ϵFIRST(Y)并不能说明 ϵ \epsilon ϵ属于FIRST(Y),因为我们不知道…里面是否包含了其他非 ϵ \epsilon ϵ的终结符
  2. 注意终止扫描的条件

构造任何符号串的FIRST集合

image.png

构造FOLLOW集合

在每个句型中,能够跟在该非终结符后面的终结符
image.png
构造方法
扫描产生式右部,寻找非终结符
image.png
注意:

  1. 终止条件为不再有任何非终结符的FOLLOW集发生变化
  2. A − > α B β A->\alpha B \beta A>α 中B为一非终结符, α \alpha α β \beta β为终结符或非终结符

LL(1)文法

文法条件

image.png
LL(1)文法:
第一个L指从左到右扫描输入串
第二个L指最左推导
1指每一步都是根据当前的单词来找候选式,即每一步只需向前查看一个符号
判断方式

  1. 消除文法的左递归
  2. 提取左公共因子
  3. 验证处理后的文法是否满足这三个条件

LL(1)分析法
image.png

分析过程

  1. 消除左递归
  2. 提取左公共因子
  3. 计算FIRST集和FOLLOW集
  4. 判断该文法是否为LL(1)文法,若满足,则对其进行自上而下的分析

一个示例

下图中展示的为一消除了左递归的文法G
image.png
image.png
技巧:FIRST集计算看产生式的左部
image.png
FOLLOW集求解技巧:看产生式右部,一个非终结符的右部符号的first集?最右部的非终结符需要考虑产生式左部的follow集,一个非终结符的右部符号是否能推为 ϵ \epsilon ϵ

参考资料

  1. 国防科技大学编译原理课程视频

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

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

相关文章

新书稿费终于下来了!你猜有多少?

我的新书《从零开始学ARM》从正式出版到现在已经有半年时间了! 第一批印刷的几千册已经基本销售完, 第二版会对其中勘误进行修正,并继续继续印刷。 前两年写书、审稿, 所有业余时间都耗在这上面了, 在下面这篇文章…

人大金仓KingbaseES_V008R006C008B0014安装

人大金仓安装 一、安装前准备工作 1、硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产CPU硬件体系架构。 2、软件环境要求 KingbaseES支持各种主流的Linux操作系统64位发行版本,包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足,创建了一个计算机管理教师工作量管理系…

EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法

只需一步,将你的EtherCAT协议设备转换为EthernetIP协议! 捷米特JM-ECTM-EIP网关,这款专为EtherCAT协议设备设计的转接装置,可以轻松地将EtherCAT设备数据采集的数据转换成EthernetIP协议。而且,我们的网关接口非常灵活…

同星智能亮相2023北美汽车测试展,国产替代的前方是“星辰大海”!

01 圆满落幕 2023年10月24日至10月26日,为期三天的2023北美汽车测试展览会(Automotive Testing Expo)在美国密歇根 Surburban Collection Showplace 成功举行。同星智能作为一家具备全球影响力的中国工业软件企业亮相了本次展会,…

聊一聊 tcp/ip 在.NET故障分析的重要性

一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层…

linux 安装 Anaconda3

文章目录 一、下载二、安装1.使用xftp把下载包拉到服务器上2.执行安装命令3、在安装时没有自动添加环境变量,这里手动设置3.1.1通过修改~/.bashrc来配置环境变量3.1.2 重新载入配置文件3.1.3 测试 一、下载 官网下载链接 二、安装 1.使用xftp把下载包拉到服务器上…

安装RabbitMQ

安装RabbitMQ 下载需要的两个包 # 这直接就可以安装了,下面 ‘上传对应的rmp包’ 操作 [rootrabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash [rootrabbitmq-1 ~]# yum install erlang-21.3.8.2…

linux继续循环案例测试ping网络,目录下的文件权限循环输出

第一:查看本机ip #ip addr 通过脚本访问本机ip1-100,是否可以ping通,并显示结果,上图 知识点 ping -c 数字1 -w 数字1,向目的ip发送1个数据包,等待1秒,无回复中止 &>/dev/null 知…

python 之生成器表达式,以及与列表推导式的区别

文章目录 生成器表达式基本结构示例生成一个简单的生成器遍历生成器并获取值使用条件过滤 优点 生成器表达式与列表推导式的区别1. 返回类型2. 生成方式3. 内存占用4. 访问方式示例总结 生成器表达式是一种在 Python 中用来创建生成器的高效方法。生成器表达式和列表推导式类似…

The valid characters are defined in RFC 7230 and RFC 3986

服務器通過Body 對象接收參數&#xff0c;而客戶端通過param 地址URL傳參數&#xff0c;不能解析。 return axiosHelper<Protocol<ABC[]>>({method: POST,url: ,data: _reqparams: {data: _req}}) public List<InvoiceItem> getAAAA(RequestBody Query quer…

Ubuntu 22.04.3 LTS中安装singularity

文章目录 概要背景知识什么是singularity ? 安装流程1. 安装Go2. 下载Singularity3. 编译Singularity源代码 4. 验证安装是否成功singularity的使用安装open structure 小结 概要 这里主要记录singularity的安装和使用&#xff0c;安装过程中会出现相关的错误&#xff0c;所以…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程&#xff0c;供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆&#xff0c;同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆&#xff0c;于是首先去查看了登陆功能的报错…

阿里微服务质量保障系列:故障演练

对于很多大型企业(如阿里巴巴)来说,经过多年的技术演进,系统工具和架构已经高度垂直化,服务器规模也达到了比较大的体量。当服务规模大于一定量(如10000台)时,小概率的硬件故障每天都会发生。这时如果需要人的干预,系统就无法可靠的伸缩。 为此每一层的系统都会面向失…

数据库SQL

数据库&SQL 数据库基本概念数据库DataBase定义 数据库管理系统(DBMS)定义在JAVA项目中与数据库的结合数据库管理系统中常见的概念库与表的关系 SQL数据类型数字类型浮点类型字符类型TEXT类型日期类型 SQL语言的分类DDL:数据定义语言修改表结构的注意事项 DML:数据操作语言D…

关于卷积神经网络的池化层(pooling)

了解池化层 池化层又称“下采样层”或“子采样层”&#xff0c;池化层可以大大降低特征的维度&#xff0c;减少计算量&#xff0c;同时可以避免过拟合问题。 顾名思义&#xff0c;最大池化层就是从输入的矩阵中某一范围内&#xff0c;选择最大的元素进行保留&#xff1b;平均池…

在MacBook上实现免费的PDF文件编辑

之前我想对PDF文件进行简单处理&#xff08;比如删页面、添空白页、调整页面顺序&#xff09;&#xff0c;要么是开wps会员【花钱贵】&#xff0c;下载&#xff08;盗版&#xff09;Adobe Acrobat【macOS不好下载】&#xff0c;要么用福昕阅览器登陆学生账号&#xff08;学校买…

运算符重载(operator)

语法&#xff1a; 返回值 operator 运算符 ( 参数 ) 例&#xff1a; Point operator(const Point &p1,const Point &p2); //输出 Point 类型的输出运算符重载函数 ostream & operator<<(ostream& out,Point &p) {cout << "输出运算符…

01. Python基础环境搭建

目录 1、什么是Python 2、Python的特点 3、基础环境搭建 3.1、下载安装解释器 3.2、hello world 4、集成开发环境&#xff1a;PyCharm 4.1、下载安装Pycharm 4.2、新建简单Demo 1、什么是Python Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。Pytho…