编译原理:第八节

编译原理:自上而下LL(1)分析法实验(c++代码实现) 程序输入/输出示例: 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i 读文件:i+i*i# 输出结果:i+i*i#为合法符号串 代码: #include <stdio.h> #include <stdlib.h> #include <string. 阅读详情

语法分析

回顾一下语法分析方法:


分为两大类: 自顶向下分析 和 自底向上分析 其中前者又细分为 递归下降分析法(包含回溯的递归下降分析法和不含回溯的递归下降分析法)和非递归的预测分析法(LL分析法) 后者分为算符优先分析法和LR分析法。

(一)包含回溯的递归下降分析法:


思想:从语法的开始符号出发,试探使用不同产生式,寻找匹配于输入符号串的推导。或者说,从对应文法开始符号的根结点出发,自顶向下为输入符号串建立一棵分析树。这种分析方法实质上是一种试探过程,是因为文法中,对于某个非终结符号的规则其右部有多个选择,并根据所面临的输入符号不能准确 的确定所要选择时,就可能出现回溯。

例如:



(二)LL(1)分析法:

LL(1)分析法是一种自上而下的分析法,使用显示栈而不是递归调用来实现分析。第一个L指的是语法分析按从左到右的顺序扫描输入字符串。第二个L指在语法分析过程中产生句子的最左推导。“1”表示在分析过程中,每一步推导,最多只要向右扫描一个输入字符。
LL(1)分析器的逻辑结构(由总控程序,LL(1)分析表和分析栈三部分组成):

其中分析表是一个二维矩阵(形如 M【A,a】,A是非终结符号,a是终结符号)
分析栈用于存放分析过程中的文法符号。分析栈初始化时在栈底压入一个“#”,然后在次栈底底放入文法的开始符号。
总控程序的作用是依据分析表和分析栈联合控制输入字符串的识别和分析。

举个例子来看下详细的过程:已知

首先我们要构造文法分析表(此处默认已构造好,具体的构造过程在后面记录)
文法分析表如下:

第一步:进行初始化:把#入栈,然后把文法开始符号E入栈,读入输入字符串第一个符号id
第二步:查表E,id 得到 E—>TE '  然后将E弹出栈,然后将TE’反向压入栈中 即此时栈中元素从底到顶是 # E' T
第三步:查表T,id 得到 T—>FT'    然后将T弹出栈,然后将FT'反向压入栈中
第四步:查表F,id 得到 F—>id      然后将F弹出栈,然后将id反向压入栈中
第五步:栈顶是终结符号,无需查表,直接比较它和读入的符号,得id  == id 将栈顶元素id出栈,然后读入下一个符号+
第六步:查表T',+ 得到 T'—>e  ,将T'弹出栈
第七步:查表E',+ 得到 E'—>+TE' 然后将E'弹出栈,将+TE'反向压入栈中
第八步:栈顶元素+ 和读入的符号相同,+出栈,读入下一个符号 id 
第九步:查表T,id  得到 T—>FT'  然后将T出栈,然后将FT'反向压入栈中
第十步:查表F,id  得到 F—>id   然后F出栈  然后id入栈
第十一步:id == id ,id出栈,读入下一个符号*
第十二步:查表T',* 得到T’ —>*FT' 然后T‘出栈 将*FT’反向压入栈中
第十三步:* == *  ,* 出栈  然后读入下一个符号id
第十四步:查表F,id  得到F—>id  F出栈,id入栈
第十五步:id == id  id出栈,读入下一个符号#
第十六步:查表T',# 得到T'—>e  T'出栈
第十七步:查表E',#  得到E'—>e  E'出栈
第十八步:# == # 表示分析成功 停止分析过程

LL(1)分析表的构造:

从上面看出整个过程就是一个查表判断不断循环的过程,关键在于LL(1)表的构造。
给出算法:LL(1)分析表的构造
输入:文法G;文法G的FIRST和FOLLOW集
输出:文法G的LL(1)分析表
for 文法G的每个产生式A—>y1|y2|y3|...|ym|
{
	if a属于FIRST(yi) 置M[A,a]为"A->yi";
	if 空集属于FIRST(yi)
		for 任何a属于FOLLOW(A)
		{
			置M[A,a]为"A->yi"
		}
}
置所有无定义的M[A,a]为出错

关于FIRST集的构造:


关于FOLLOW集得构造:


例如:

文法:       E  —>TE’

                    E’ —>+TE’ | e

                   T  —>F T’

                    T’ —>*FT’ | e

                   F  —>(E) | id

计算Follow(E), Follow(E’) , Follow(T) ,Follow(T’) , Follow(F) 
解析:
先看FOLLOW(E) 因为E是文法的开始符号,所以#加入FOLLOW(E)中。)位于E之后,所以)加入FOLLOW(E)
所以FOLLOW(E)= { #, ) }
FOLLOW(E'),因为E  —>TE’ 所以FOLLOW(E)加入 FOLLOW(E‘),所以FOLLOW(E’)= { #,)}
FOLLOW(T)  由第一条规则 FIRST(E')加入其中(即 + ) 由第二条规则 FOLLOW(E')加入其中 FOLLOW(T)= { + ,#,) }
FOLLOW(T’)由三条规则,FOLLOW(T )加入其中,FOLLOW(T‘)= { +,#,)}
FOLLOW(F)有第三四条规则,FOLLOW(T)加入其中,FIRST(T')加入其中,FOLLOW(F) = { +,#,),* }

有了FIRST和FOLLOW集,我们就很容易构造分析表了。
这里要注意,再进行计算前必须先消除左递归,不然在构造分析表时表中某些项会出现多个情况,这就不属于LL(1)文法了。
所以要证明一个文法是LL(1)文法,只需给出其文法分析表即可。
山东大学编译原理2017试题 山东大学2017编译原理试题默写。题目精确,适合复习。仅供学习交流使用! 立即下载

相关推荐

编译原理课程设计-LL(1)预测分析法 算符优先分析 LR分析

一 课程设计的目的 - 2 - 二 课程设计的内容及要求 - 2 - 2.1 课程设计内容 - 2 - 2.2 课程设计要求 - 2 - 三 实现原理 - 2 - 3.1、词法分析 - 2 - 3.2、语法分析 - 3 - 语法分析程序可以根据个人的掌握情况选用常见的几种语法分析方法:递归下降分析方法、LL(1)预测分析法、算符优先分析、LR分析等方法中的任何一种来实现,也可以选用不同的方法来分析不同的语法成分,最后再综合起来。这里做了算符优先分析和LR(0)分析演示。 - 4 - 3.3、语义分析 - 4 - 四 算法实现流程图 - 5 - 4.1. 词法分析算法 - 5 - 4.2. 语法分析算法思想 - 7 - 语法分析流程图 - 7 - 算符优先分析流程图 - 8 - LR(0)预测分析流程图 - 8 - 五 测试数据 - 9 - 5.1词法分析测试数据 - 9 - 5.2 词法分析三个算法测试数据 - 10 - 5.3语法分析三个算法测试数据 - 10 - 5.4 语义分析测试数据 - 10 - 六 结果输出及分析 - 10 - 6.1语法分析阶段截图 - 11 - 6.2 语法分析两个算法截图 - 14 - 6.3语义分析阶段截图 - 15 - 七.软件运行环境及限制 - 15 - 八.心得体会 - 16 - 九.参考文献 - 16 -

【编译原理】 第七章 运行存储分配

第七章 运行存储分配 7.1 概述 编译器在工作过程中,必须为源程序中出现的一些数据对象分配**运行时的存储空间 **, 对于那些在编译时刻就可以确定大小的数据对象,可以在编译时刻就为它们分配存储空间,这样的分配策略称为静态存储分配 如果不能在编译时完全确定数据对象的大小,就要采用动态存储分配的策略。即在编译时仅产生各种必要的信息,而在运行时刻,再动态地分配数据对象的存储空间。 栈式存储分配 ...

土豆洋芋山药蛋的博客 2856

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6592

编译原理——自上而下的语法分析方法(LL分析法)

概述: 语法分析的地位:编译程序的核心部分 任务:词法分析出来的单词序列是否是给定文法的句子 理论:上下文无关文法和下推自动机 方式:自上而下的语法分析(推导)和自下而上的语法分析(规约) 下推自动机: 下推自动机模型: pda和fa的模型相比,多了一个下推栈 决定pda的动作因素:当前状态,读头指向的符号,下推栈栈顶符号 当输入串读完下推栈为空,到达终态 下推自动机定义: 当处于q状态,不需要读入任何字符,就可以将栈顶符号A转化为w(欧米伽),就是推导的过程, 当处于q状态,读入一个字

优快云-ych 3996

kettle多表数据迁移

点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,一个 转换 ,一个 作业 和一个 成功 到右侧的作业面板,这些作业项都可以改名字。点击文件—新建—转换,在左侧的 核心对象 标签下选择 输入 下的 表输入,双击添加到右侧的转换面板,再选择 作业 下的 复制记录到结果 ,双击添加到右侧的转换面板。新建转换,在左侧的 核心对象 标签下选择 作业 下的 从结果获取记录,双击添加到右侧的转换面板,再选择 作业 下的 设置变量 ,双击添加到右侧的转换面板。

u014061745的博客 1340

ADS124S08配置避坑指南:从SPI时序到寄存器设置,手把手教你调通24位ADC

本文详细解析了ADS124S08 24位ADC的SPI时序配置、寄存器设置及外围电路设计中的关键细节,帮助工程师避开常见陷阱。从SPI通信模式选择到DRDY引脚读取优化,再到基准电压启动时间调整,提供了实战验证的解决方案,确保高精度数据采集的稳定性。

weixin_29192365的博客 285

编译原理复习——语法分析(自顶向下)2

在前一章分析了LL(1)文法是什么并且也知道了如何判断一个文法是不是LL(1)文法。那么我们肯定是很喜欢一个文法是一个LL(1)文法的,但是现实条件是无论是生活中还是工作中我们喜欢的往往是我们所无法得到的。那么我们是不是可以将一些不是LL(1)文法的东西转换成LL(1)文法呢。通过这个就可以求出了预测分析表然后当我们输入一个句子进去后就进行判断了。这里有两种方式:提取左公因子和消除左递归。

m0_53345417的博客 1211

使用ACOLITE对OLCI影像进行大气校正+批处理

使用ACOLITE对OLCI影像进行大气校正+批处理

mrzhy1的博客 7359

【编译原理】语法分析(三)

常用的语法分析方法包括自顶向下和自底向上的方法,在上一篇文章中已经介绍了自顶向下的语法分析方法,本文将介绍自底向上的语法分析方法。

一直学,你始终是学生,但是只要创造一招,你便是宗师。 2万+

STM32F103C8T6驱动DHT11温湿度传感器程序

本程序基于 STM32F103C8T6 微控制器,通过 GPIO 模拟单总线通信时序实现对 DHT11 温湿度传感器的数据采集,主机采用拉低数据线的方式触发传感器启动,并通过检测高电平持续时间区分逻辑“0”和“1”,依次读取湿度和温度的整数数据及校验位,经过校验后将有效结果存入缓存数组,实现对环境温湿度的周期性测量与处理。

加斯顿工程师的博客 200

LAMMPS后处理—如何构建二维云图-接触角呢?

计算接触角

Rockyoung 6522

编译原理笔记【第八章 语义分析】

文章目录第一节 语义分析概述1.1 语义分析的任务1.2 语义分析和语法分析1.3 语义值1.4 语义动作和语义子程序1.5 翻译1.6 三地址码第二节 说明语句的翻译第三节 赋值语句的翻译第四节 goto语句的翻译第五节 if语句的翻译第六节 while语句的翻译第七节 for语句的翻译第八节 函数的翻译 第一节 语义分析概述 1.1 语义分析的任务 语义检查 一致性检查(数据类型是否一致、操作是否合法) 越界检查(数组维数是否正确、下标是否越界) 语义处理 说明语句的翻译(相关信息登记到符号表中) 执行

CodePandas 9429

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 430

第八节、程序的编译

第八节、程序的编译 1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码 2.详解编译+链接 2.1 翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。(linux后缀**.o** windows后缀**.obj**) 链接器同时也会引入标准C函数

m0_63027727的博客 242

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 531

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android Framework究竟值不值得你死磕?_framework有必要安装吗

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。一起互勉~网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

2401_84544434的博客 1258

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android Framework 11

安卓开发应用的领域很广,就业机会同样也很多,但是市面上做APP开发的人很多,而擅长处理APP开发土壤,能够在底层进行操作的技术人员并不多。在这里分享一份腾讯团队内部培训的Android Framework学习资料,相信这份资料会在你学习的路上让你事半功倍。Android framework就是这样的领域,而且他也和嵌入式有些像,大部分的从业者都是转行来的。的高速发展下,很多互联网公司对于底层开发技术人才的需求量是日益剧增,尤其是在智能终端开发领域更是明显。目前做Android的都知道,在。

2401_89791230的博客 914

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

「2022Android面试高薪必备」收藏过万的Android面试之framework汇总,学会了,学废了?_剖析framework面试 冲击android高级职位 目录

文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84123113的博客 703

Android应用层开发越来越少了,主流技术演变也越来越快,如今得Android开发者如何自处?_做开发的越来越少

最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

2401_84104809的博客 649

史上最全,Android 11

​。

2401_84123077的博客 73

最全阿里大佬首次分享《Android11,高级安卓面试题及答案2024级

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取。

2401_84520118的博客 789

「2024Android面试高薪必备」收藏过万的Android面试之framework汇总,学会了,学废了?_剖析framework面试 冲击android高级职位 目录

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

2401_84123113的博客 705

编译原理笔记【第二章 数据类型】

文章目录第一节 引言1. 什么是数据类型2. 数据类型的作用3. 数据类型的分类第二节 内部类型1. 内部类型的特点2. 内部类型的优越性第三节 用户定义类型1. 笛卡尔积2. 有限映像3. 序列4. 递归5. 判定或6. 幂集第四节 C语言的数据类型第五节 类型检查第六节 类型转换第七节 类型等价第八节 实现模型 第一节 引言 具体和抽象 具体:二进制串(机器语言) 抽象:符号注记(汇编语言,高...

CodePandas 1625

大二计算机与科学课表,求沈阳理工大学 大二或大三的课程表 计算机系的 其他学院的也可以!~ 谢谢大家了...

满意答案郑晓娴Ailsa2014.07.01采纳率:51%等级:8已帮助:415人第三节 J2EE架构与程序设计1-8(3,4,5)蒋社想新教1104编译原理1-8(3,4,5)周强新教1304计算机组成原理1-12(3,4,5)李洁新附2206编译原理1-8(3,4,5)周强新附2204计算机组成原理1-12(3,4,5)李洁新教1306第四节第五节下午 第六节 汇编语言程序设计9-16...

weixin_39734020的博客 274

Android最全Android Framework 11,京东面试真题解析视频

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

2401_84561579的博客 253
上一篇: Android:content uri转 file uri
下一篇: Java:使用jxl读取excel文件内容
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值