编译原理04-自顶向下语法分析方法
文章目录
- 学习目标
- 4.0 相关问题
- 1、什么是语法分析?
- 2、什么是自顶向下分析法?
- 3、在自顶向下的分析过程中,存在的问题是什么?
- 4、什么是确定的自顶向下分析法?
- 5.存在的问题
- 4.1 语法分析技术概况
- 练习题1:自定向下推导
- 定义4.1:First集的定义
- 定义4.2:Follow集的定义
- 定义4.3:Select集的定义
- 练习题:
- 4.2 LL(1)文法的判别
- 4.2.1判别算法:
- Step1:计算First(X)集
- 计算First(α)集
- Step2:计算Follow(X)集
- Step3:计算Select集
- 4.3 貌似做了两个习题
- 4.4 预测分析法(LL(1)分析法)
- 4.4.1 构造预测分析表
- 4.4.2 LL分析实例:
- 符号串 i * i 的LL[1]分析过程:
- 4.4.3 预测分析程序流程图
- 4.3 文法等价变换
- Step1:消除左公共因子
- Step2:消除左递归
- 4.5 递归下降分析法
学习目标
明确语法分析在编译过程所处的阶段和作用
理解确定的自顶向下的语法分析法的思想
了解并掌握表驱动LL(1)分析程序
了解并掌握递归下降LL(1)分析程序
4.0 相关问题
1、什么是语法分析?
- 识别由词法分析给出的单词符号串是否是给定文法的正确句子(程序)
2、什么是自顶向下分析法?
- 面向目标的分析方法
- 也就是从文法的开始符号企图推导出与输入的单词符号串完全相匹配的句子,若是输入串是给定文法的句子,则必能推导出,反之则必然出错。
3、在自顶向下的分析过程中,存在的问题是什么?
- 需对文法有一定限制
4、什么是确定的自顶向下分析法?
定义: 确定的自顶向下分析方法,是从文法的开始符号出发,考虑如何根据当前的输入符号 (单词符号)唯一地确定选用哪个产生式替换相应非终结符以往下推导,或如何构造一棵相 应的语法树。
特点:实现方法简单、直观,便于手工构造或自动生成语法分析器,是最常用的语法分析方法之一
区别:自顶向下的不确定分析方法是带回溯的分析方法(4.4节有提及)
5.存在的问题
当一个非终结符号对应若干个规则时,选择哪个规则的右部对该非终结符号进行展开呢?
例如:如果要被代换的最左非终结符号是U,且有n条规则:U::=A1|A2|…|An,那么如何确定用哪个规则的右部去替代U?
4.1 语法分析技术概况
第四章:自顶向下的确定分析
第五章:自底向上的算符优先分析
第六章:自底向上的LR分析
练习题1:自定向下推导
定义4.1:First集的定义
设G=(VT,VN,S,P)是上下文无关文法,其中
可以根据当前的输入符号是属于哪个产生式右部的首符集而决定选择相应产生式进行推导。
定义4.2:Follow集的定义
设G=(VT,VN,S,P)是上下文无关文法,,S是开始符号
当文法中存在推导形如:时,如果当前的字符属于Follow(A),则用空字符串取代A的出现。
定义4.3:Select集的定义
结论:文法G是LL(1)文法的充要条件是,对于每个非终结符U有多个不同的产生式,比如为U→α和U→β,满足:
练习题:
(1)求出所有非终结符的First集
(2)求出所有非终结符的Follow集
(3)求出所有产生式的select集
(4)判断此文法是否是LL(1)文法?
4.2 LL(1)文法的判别
- 当需要选用自顶向下分析技术时,必须判别所给文法是否是LL(1)文法
4.2.1判别算法:
1、计算非终结符是否能推出ε
2、构造First集
3、构造Follow集
4、构造Select集并作判别
Step1:计算First(X)集
对每一文法符号X计算First(X)
若XVT,First(X)={X}
若XVN ,且有产生式Xa…P,aVT ,则aFirst(X)
若XVN,且有产生式Xε,则 ε First(X)若XVN,有产生式XY1Y2…Yn,且Y1,Y2,…,Yi任意一 个文法符号,当Y1,Y2,…,Yi-1ε,则
First(Y1)-{ε},First(Y2)-{ε},…
First(Yi-1)-{ε}, First(Yi)都包含在First(X)中。
当Yi ε(i=1,2,…n), 将{ε}并入First(X)中。 反复使用上述步骤,直到每个符号的First不再增大。
计算First(α)集
Step2:计算Follow(X)集
1:对所有X∈VN,令Follow(X)={};对开始符S, 令Follow(S)={ # };
2:若有产生式Y→αXβ, 如果 则: Follow(X)= First(β) 否则 Follow(X)=(First(β)-{
}) ∪Follow(Y)
3:重复2和3,直至对所有X∈VN,Follow(X)收敛为止。
Step3:计算Select集
结论:如果相同左部产生式的Select交集都是空集,则该文法是LL(1)文法。因此,该文法是LL(1)文法。
4.3 貌似做了两个习题
书本4.3没讲
5.17 好像是讲了程序设计
5.24
4.4 预测分析法(LL(1)分析法)
4.4.1 构造预测分析表
[1]初始化: Stack :=empty;Push(#S);
[2]读下一个输入符: Read(a);
[3]若当前格局是( #, # ),则成功结束; 否则转下;
[4]设当前格局为(… X, a…),则
4.4.2 LL分析实例:
符号串 i * i 的LL[1]分析过程:
4.4.3 预测分析程序流程图
4.3 文法等价变换
- LL(1)文法不含左公共因子
某个非终极符A有如下的两个产生式:
A→ αβ,A→ αγ (即有左公共因子)
- LL(1)文法不含左递归 某个非终极符A有直接左递归产生式:
A→ Aα | …
Step1:消除左公共因子
Step2:消除左递归
4.5 递归下降分析法
递归下降法(Recursive-Descent Parsing)
对每个非终结符按其产生式结构产生相应语法分析子程序。
- 终结符产生匹配命令
- 非终结符则产生调用命令
文法递归相应子程序也递归,所以称这种方法为递归子程序方法或递归下降法。
编译原理04-自顶向下语法分析方法相关推荐
- 编译原理——自上而下的语法分析方法(LL分析法)
自上而下的语法分析方法(LL分析法) 概述: 语法分析的地位:编译程序的核心部分 任务:词法分析出来的单词序列是否是给定文法的句子 理论:上下文无关文法和下推自动机 方式:自上而下的语法分析(推导)和 ...
- 编译原理--实验2 语法分析
文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...
- 编译原理教程_4 语法分析
文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 4. 语法分析 4.1 概述 4.1.1功能 4.1.2 基本任务 4. ...
- 【编译原理】Python语法分析LL(1)、LR(1)
目录 一.实验目的 二.实验任务 三.实验原理 1 LL(1)文法 2 LR文法 四.实验过程 1 LL(1)文法 2 LR文法 五.实验结果 1 LL(1)文法 2 LR(0)文法 3 ...
- 自顶向下语法分析方法
目录 自顶向下分析 上下文无关文法的特性 带回溯的自顶向下语法分析 引起回溯的原因 消除回溯与左递归 消除回溯 消除左递归 确定的自顶向下分析 LL 分析法(预测分析法) LL(K)LL(K)LL(K ...
- 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...
- 【编译原理】自上而下语法分析(CC++源码+实验报告)
文章目录 1 实验目的和内容 1.1 实验目的 1.2 实验内容 1.3 实验要求 2 设计思想 2.1 根据BNF描述该文法 2.2 根据文法画相应的语法图 2.3 判断是否是LL(1)文法-求Fi ...
- 编译原理——自上而下的语法分析
语法分析的功能: 语法分析方法的分类: (1)自上而下(自顶而下)分析法:从开始符号出发,进行最左推导,或从根开始,构造推导树.(回溯分析法属于不确定的自上而下的语法分析方法,而递归下降分析法和预测 ...
- 编译原理学习之语法分析
1.语法分析的地位 –是编译程序的核心部分. 2.语法分析的任务 –识别由词法分析得出的单词序列是否是给定文法的句子. 3.语法分析的理论基础 –上下文无关文法和下推自动机 4.语法分析的方式 1)自 ...
- 编译原理--语法分析:LR(1)
规范LR(1)项 对LR(0)中本来需要归约的行为,再往前看一步,考察归约后, 下一步是否会报错. 入股归约后下一步不会报错,按LR(0)进行归约. 否则,不进行归约.正式地将, 可行前缀&有 ...
最新文章
- 开发腾讯移动游戏平台SDK ios版Ane扩展 总结
- 深入剖析nginx时间缓存
- B-treeB+tree数据库索引原理
- mac下显示隐藏文件的方法
- mysql flaskalchemy_FlaskSQLAlchemy声明性和MySQL特定的数据类型
- MFC中 给基于CFormView的单文档添加背景图片
- PDF加密、解密内幕(三) -破解加密PDF文件
- mysql非整型分区_mysql分区
- Arcgis将圆任意等分思路(附python实现代码)
- 伺服电机常用参数设置_松下伺服几个参数需要熟悉并掌握设置方法
- Source Sink (live555)
- 推荐一款高颜值免费在线SCI绘图工具~~~
- P1967 货车运输( 最大生成树+LCA or Kruskal重构树)
- xposedhook部分记录
- 使用vite插件编写tsx文件
- 商业智能BI的未来,如何看待AI+BI这种模式?
- 修饰符*和&应该靠近数据类型还是该靠近变量名
- c# try catch 用法
- 博人传:火影迷青春的证明和延续
- 《大上海》《血滴子》票房不佳很可能都赔钱
热门文章
- H264编码器与H265编码器对比
- 详解K均值聚类算法(K-means Clustering)简易实例:从空调温度判别使用者
- Django之Model数据库数据的操作
- 雷蛇键盘灯光配置文件_三模连接一步到位,游戏宅女必备的雷蛇电竞外设套装...
- 敏捷开发(Agile)
- 万字专栏总结 | 离线强化学习(OfflineRL)总结(原理、数据集、算法、复杂性分析、超参数调优等)...
- 2018考研信工所二室
- CAN资料整理(二):CAN协议帧格式
- OpenNESS AF 模块代码梳理
- 度分秒转度数和度数转度分秒