LL(1)文法的核心原理

news2024/12/24 3:38:33

来自编译原理课本,课本上讲的非常好,这里用我自己的方法再讲述一下。

讨论范围:2型文法,产生式的左边只有一个非终结符号。(这样才能构建树)

用语法树去进行巨型分析的时候会遇到的问题:

多个候选式的时候使用哪个候选式作为子节点?
假设我们提前知道使用某个候选式之后推导出的句型的首终结符是a,每个候选式推导出来的句型的首终结符是不一样的,这样我们就可以根据目标句型选择候选式了。

例如:
S→Ap|Bq
A→a|cA
B→b|dB
分析输入串W=ccap是否为文法的句子,则语法树如下图
在这里插入图片描述

其中我们第一步为什么选择Ap而非Bq呢,因为只有A才能推导出c打头的字符串啊!选择B是没可能推导出来的。

这里就引出了第一个集合:first集合(首终结符集合)

在这里插入图片描述

但是有一种特殊情况是需要我们讨论的,如果存在候选式为ε的情况怎么办呢?怎么来确定我要不要选这个候选式呢?向后看一个,看看后面的终结符号。当你无法做选择的时候,不妨往后走一步,说不定你就知道怎么办了。
文法:
S→aA|d
A→bAS|ε
输出串W=abd
在这里插入图片描述
到第三步的时候我们选择A→ε是因为后面的S→d,引出follow集合(后面跟着的终结符集合)。
在这里插入图片描述
那么影响候选式选取的就有两个因素,既有first集,又有follow集合,归并一下,那就是select集合。
在这里插入图片描述
不能推导出空的时候只看first,能推导出空的时候就需要考虑follow集合啦。

LL(1)文法的判别也就出来啦:同一非终结符号的候选式的select集合没有交集(这样才能选择)。

求first集的步骤

  1. A的候选式以终结符号a开头的,把a加入到first(A)
  2. A的候选式以非终结符B开头的,把first(B)加入first(A)
  3. 注意如果有A→BC···,B→ε,first(C)包含于first(A)

一些注意事项:
第二步和第三步最好写出所有的包含关系再添加,因为很可能前期刚把first(B)加入first(A),后期B又被扩充了,这样就需要再次添加,直到各个集合不再扩大。也就是说这个包含关系是适用于最终结果的。

求follow集的步骤

  1. 看产生式的右边,如果出现···Aa···,把a加到follow(A)里面
  2. 如果出现···AB···,把first(B)- ε 加到follow(A)里面
  3. 如果出现B→···A,follow(B)包含于follow(A)
  4. 讨厌的空规则又来了,如果有B→···AC,C→ε,
    follow(B)包含于 follow(A)

注意事项和first集差不多,就是空规则和包含关系。还有follow集里面没有ε哦,以及加入一个 # .

select集,略

LL(1)分析表,面向select集填产生式的右边

表驱动的LL(1)分析

三列:步骤、分析栈、符号串

注意分析栈是个栈,需要逆序进栈!!

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

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

相关文章

web前端期末大作业 html+css+javascript汽车介绍网页设计实例 企业网站制作(带报告3490字)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

WEB前端网页设计 CSS网页代码 基础参数(三)

目录 font-size属性单位; color:文本颜色 间距 text-decoration:文本装饰 text-align:水平对齐方式 white-space:空白符处理 text-overflow:标示对象内溢出文本 盒子模型: 高度坍…

Python课程设计-图书管理系统

Python课程设计-图书管理系统摘要第一章 绪论1.1 开发环境及技术1.2 系统实现功能描述第二章 功能详细设计与实现2.1 系统框架各层次实现2.1.1 可视页面设计2 数据库设计3 逻辑流程设计2.2 主要功能的设计与实现1 功能 1用户登录2 功能 2展示图书3 功能 3添加图书4 功能 4删除图…

3dmax 打开查看模型

下载一个3dmax模型如下图;包含一个.max文件,一个文件夹; 从File菜单打开该模型;打开对话框右侧会显示模型的一个缩略图; 有任何情况均忽略,直接打开,出现一个Scene Converter对话框,…

Spring MVC 源码分析

Spring MVC 源码分析1. 回顾Servlet1.1. 什么是Servlet1.2. Servlet工作模式1.3. Servlet的工作原理1.4. 源码分析1.4.1. Servlet接口1.4.2. GenericServlet抽象类1.4.3. HttpServlet抽象类1.5. Servlet的局限性2. Spring MVC简介2.1. 什么是MVC2.2. 什么是Spring MVC&#xff…

【深度学习】详解 BEiT

目录 摘要 一、引言 二、方法 2.1 图像表示 2.1.1 图像 patch 2.1.2 视觉 token 2.2 主干网络:图像 Transformer 2.3 预训练 BEiT:掩码图像建模 2.4 从变分自动编码器的角度来看 2.5 预训练设置 2.6 在下游视觉任务微调 BEiT 三、实验 3.…

谁还说我没表情包用?马上用Python采集上万张个表情包

前言 今天来表演一手 采集全网表情包图片 虽然我现在的wx表情包已经996个了,但是我还在存表情包哈哈,多了就继续删 现在跟人聊天,不发个表情包,我都觉得不对劲,怪难受的 索性今天就来,给你们分享一下&a…

Vue3:分析elementplus表格第一列序号hover变多选框实现思路

灵感来自Vue el-table 表格第一列序号与复选框hover切换 源码是通过Vue2elementui去实现的,本篇是通过Vue3elementplus实现,所以在代码上面有些许不同,但函数名一致 实现思路: ①通过表头是多选框,我们可以判定这一…

9.1、面向对象编程

文章目录面向对象编程简介面向对象编程面向对象编程的三大特性对象和类封装练习继承什么是继承重写父类方法多继承私有属性和私有方法多态项目案例:栈和队列的封装栈的封装队列的封装python是面向对象的编程语言 面向对象编程简介 “面向过程”(Procedure Oriente…

Java并发编程—synchronized

文章目录synchronized 的底层实现原理监视器锁对象的锁的获取过程如下:monitorexit:加synchronized锁前后对比synchronized的作用synchronized的三种主要用法synchronized为什么是 非公平锁?————————————————————————…

大数据项目 --- 电商数仓(一)

这个项目实在数据采集基础使用的,需要提前复习之前学的东西,否则的话就是很难继续学习.详见博客数据项目一 ---数据采集项目.大数据项目 --- 数据采集项目_YllasdW的博客-CSDN博客大数据第一个项目笔记整理https://blog.csdn.net/m0_47489229/article/details/127477626 目录 …

Android 基于物理特性动画 —— 弹簧动画

在安卓开发中我们可以通过动画添加视觉提示,向用户通知应用中的动态。当界面状态发生改变时(例如有新内容加载或有新操作可用时),动画尤其有用。动画还为应用增加了优美的外观,使其拥有更高品质的外观和风格。 首先来…

Java并发编程—并发和并行、线程上下文

文章目录并发和并行并发和并行的区别上下文切换相关问题为什么循环次数少的情况下,单线程快?什么时候需要用多线程?线程上下文切换消耗的时长?用什么测试的线程上下文?面试回答下面的工具会加分:如何减少上…

DQL简介

学习笔记之DQL 数据查询语言,用来查询数据库中表的记录。 查询关键字:select 基本查询 1查询多个字段 select 字段1,字段2,字段3.. from 表名; select * from 表名;2设置别名 select 字段1 [别名1],字段2[别名2]... from 表名;3…

233搞懂HMM(隐马尔可夫)

文章目录2条性质3个参数3个问题维特比算法参考资料有向图模型,主要用于时序数据建模,在语音识别,自然语言处理等领域,以及在知识图谱命名实体识别中的序列标注,有广泛应用。 HMM模型由两部分组成, 观测变量…

spring boot 应用mybatis

Mybatis入门: Mybatis入门_做测试的喵酱的博客-CSDN博客 目录 一、spring boot 应用mybatis 核心 二、举例: 2.1 背景 2.2 项目结构: 2.3 依赖包 pom 2.4 项目配置文件application.yml 2.5 实例层entity 2.6 mybatis的mapper层 2.7 spring boot…

Android—过渡按钮的简单实现

Android—过渡按钮的简单实现前言准备工作登录页面(activity_main.xml)登录成功页面(activity_new.xml)主要代码给登录按钮设置监听事件(MainActivity.xml)点击登录按钮出现加载动画(TransitionButton.java)当isSuccessful判断为true时(MainActivity.xml)加载动画结束时切入跳转…

C语言笔记-16-Linux基础-文件元数据

C语言笔记-16-Linux基础-文件元数据 文章目录C语言笔记-16-Linux基础-文件元数据前言一、概述二、ln 硬连接三、软连接四、stat 获取元数据总结前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言笔记-16-Linux基础-文件元数据 一、概述 文…

Kaggle泰坦尼克号-决策树Top 3%-0基础代码详解

Titanic Disaster Kaggle,里的经典入门题目,因为在学决策树所以找了一个实例学习了一下,完全萌新零基础,所以基本每一句都做了注释。 原文链接:Titanic: Simple Decision Tree model score(Top 3%) | Kaggle 目录 1.…

SolidWorks如何绘制环形波纹垫片

环形波纹垫片主要用于螺纹式固定件或者防滑螺纹固定中,那这个环形垫片一般怎么用SolidWorks制作呢?首先我们观察到这样的垫片是上下此起彼伏的波纹状,厚度一般1MM左右,制作起来还是有点小难度,但是通过仔细观察,我们可以看到它的大概走向,如图 也就是特征就是这边凹下去…