当前位置: 首页 > article >正文

编译原理|FIRST、FOLLOW、SELECT集超详细解读(含例题)

编译原理FIRST、FOLLOW、SELECT集超详细解读含例题在编译原理的自顶向下语法分析中FIRST、FOLLOW、SELECT三个集合是核心基石——它们是构造LL(1)分析表、判断文法是否为LL(1)文法的关键。很多同学刚开始接触时会被抽象的定义和推导规则难住今天就结合通俗解读、严谨规则和两道例题帮大家彻底吃透这三个集合的求法与应用。建议阅读顺序先吃透三个集合的核心定义与规则再跟随经典算术表达式例题实操之后用简单例题查漏补缺最后通过总结掌握LL(1)判定方法循序渐进高效吃透。一、核心概念详解定义通俗解读求法规则先明确三个集合的核心定位FIRST集看“开头”FOLLOW集看“后面”SELECT集看“选择哪条产生式”三者层层递进、相互关联。1. FIRST集首符号集定义对于任意一个文法符号串α可以是终结符、非终结符或它们的组合FIRST(α) 就是α能够推导出的所有可能串中第一个终结符的集合。如果α能推导出空串ε文中也写作varepsilon那么ε也在FIRST集中。通俗理解想象你是一个“预言家”站在一个非终结符比如E的门口你想知道它变身后第一眼能看到的终结符实际的字符是什么如果它能直接隐身变成空串ε那ε也要算上。就像看一本书的下一章你想知道这一章最先可能看到哪些关键线索终结符。求法规则迭代计算直到集合不再增大终结符如果X是终结符则FIRST(X) {X}自己就是自己的首符号。空产生式如果有X→ε则将ε加入FIRST(X)。非终结符推导对于产生式X→Y₁Y₂…Yₖ先把FIRST(Y₁)中除ε以外的所有元素加入FIRST(X)如果Y₁能推出ε则继续把FIRST(Y₂)中除ε以外的所有元素加入FIRST(X)以此类推如果Y₁、Y₂、…、Yₖ全都能推出ε那么把ε也加入FIRST(X)。✅ 核心要点FIRST集的关键是“穿透空串”非终结符推导时只要前面的符号能推空就继续往后找首符号。2. FOLLOW集后跟符号集定义对于非终结符AFOLLOW(A)是在文法的某个句型中紧跟在A后面的所有终结符的集合。注意FOLLOW集只针对非终结符且如果A可以是句型的最后一个符号输入结束符通常记作#也属于FOLLOW(A)。通俗理解FOLLOW集就像是给非终结符找一个“贴身保镖”。我们要找出在所有合法的句型中谁终结符有资格紧跟在这个非终结符的屁股后面。如果它可能出现在句子的末尾那么结束符#也是它的保镖。就像某个主要角色非终结符的戏份暂时告一段落后接下来可能紧接着出现哪些场景或人物终结符。求法规则迭代计算直到集合不再增大开始符号将结束符#加入文法开始符号S的FOLLOW(S)中开始符号的最后一定是结束符。一般情况A→αBβ如果B后面跟着符号串β则将FIRST(β)中除ε以外的所有元素加入FOLLOW(B)β的首符号就是B的保镖。结尾或后面能推空A→αB 或 A→αBβ且β⇒ε这意味着B后面可能什么都没有或者β消失后B就到了结尾。此时将FOLLOW(A)中的所有元素加入FOLLOW(B)A的保镖也是B的保镖。✅ 核心要点FOLLOW集的关键是“继承保镖”若后续符号能推空就继承前面非终结符的FOLLOW集元素。3. SELECT集选择符号集定义SELECT集是针对产生式的。对于产生式A→αSELECT(A→α)表示在语法分析过程中当我们处于非终结符A且当前输入的终结符属于这个集合时我们就应该选择使用A→α这条规则进行推导。通俗理解SELECT集是“行动指南”。当你在语法分析时如果当前站在非终结符A上且手里的输入字符属于某个产生式的SELECT集你就必须果断选择这条产生式进行推导不会出错。求法规则如果α不能推导出εSELECT(A→α) FIRST(α)直接取右部的首符号集。如果α能推导出ε即α⇒*εSELECT(A→α) (FIRST(α) - {ε}) ∪ FOLLOW(A)。通俗解释如果α能变成空那么当输入符号既不在α的开头里又恰好是A后面可能跟的符号时我们就让A推出空串把匹配权交给后面的符号。✅ 核心要点SELECT集的关键是“区分空与非空”非空右部看FIRST集空右部看FOLLOW集。掌握了三个集合的定义与规则后我们通过经典算术表达式文法实操把理论落地手把手教你推导过程帮你巩固核心知识点。二、经典例题演练深度实操为了帮大家巩固三个集合的求法我们选用编译原理中经典的算术表达式文法作为例题。这个文法不仅结构清晰还包含了空产生式ε非常适合用来练习。我们先对文法进行消除左递归处理得到以下产生式#代表输入结束符E → T E E → T E | ε T → F T T → * F T | ε F → ( E ) | i1. 求FIRST集首符号集步骤提示从无空串依赖的基础非终结符开始逐步推导依赖它的非终结符重点关注空产生式的处理。F的FIRST集看F的产生式F→(E) | i。它要么以(开头要么以i开头且不能推空。FIRST(F) { (, i }T’的FIRST集看T’→F T’ | ε。它要么以开头要么直接变空。FIRST(T’) { *, ε }T的FIRST集看T→F T’。T的开头取决于F因为F不能变空所以T的开头就是F的开头。FIRST(T) FIRST(F) { (, i }E’的FIRST集看E’→T E’ | ε。要么以开头要么变空。FIRST(E’) { , ε }E的FIRST集看E→T E’。E的开头取决于TT不能变空所以E的开头就是T的开头。FIRST(E) FIRST(T) { (, i }2. 求FOLLOW集后跟符号集步骤提示先确定开始符号的FOLLOW集再根据产生式中非终结符的位置结合“继承保镖”规则逐步推导。FOLLOW(E)E是开始符号所以必须有结束符#另外在产生式F→(E)中E的后面紧跟着)所以)也是FOLLOW(E)的元素。FOLLOW(E) { ), # }FOLLOW(E’)在E→T E’中E’处在末尾意味着E’的保镖就是E的保镖E’结束后E也就结束了。FOLLOW(E’) FOLLOW(E) { ), # }FOLLOW(T)在E→T E’中T后面跟着E’根据规则E’的FIRST集去掉ε要加入FOLLOW(T)即又因为E’可以变成ε所以E的保镖), #也要加入。FOLLOW(T) { , ), # }FOLLOW(T’)在T→F T’中T’在末尾所以它继承T的所有保镖。FOLLOW(T’) FOLLOW(T) { , ), # }FOLLOW(F)在T→F T’中F后面跟着T’T’的FIRST集去掉ε里有*加入FOLLOW(F)又因为T’可以变成ε所以T的保镖, ), #也要全部加入。FOLLOW(F) { *, , ), # }3. 求SELECT集选择符号集步骤提示先判断产生式右部是否能推空再根据规则选择FIRST集或FOLLOW集明确推导时的选择依据。E→T E’右部不能推出ε直接取FIRST(TE’)。SELECT(E→T E’) { (, i }E’→T E’右部不能推出ε直接取FIRST(TE’)。SELECT(E’→T E’) { }E’→ε右部就是ε取FOLLOW(E’)。SELECT(E’→ε) { ), # }通俗解释当你在E’处发现后面的输入是)或者已经结束了#说明E’这里不需要再匹配了直接让它变空隐身即可。T→F T’右部不能推出ε直接取FIRST(FT’)。SELECT(T→F T’) { (, i }T’→*F T’右部不能推出ε直接取FIRST(FT’)。SELECT(T’→F T’) { * }T’→ε右部就是ε取FOLLOW(T’)。SELECT(T’→ε) { , ), # }F→(E)右部不能推出ε直接取FIRST((E))。SELECT(F→(E)) { ( }F→i右部不能推出ε直接取FIRST(i)。SELECT(F→i) { i }经典例题侧重深度实操下面补充一道简单例题步骤更简洁适合入门巩固帮你查漏补缺强化对规则的记忆。三、基础例题巩固入门适配为了让大家进一步熟悉规则再补充一道简单文法的演练步骤更简洁适合入门巩固。假设有如下简单文法 S→AB A→aA | ε B→b1. 求FIRST集FIRST(B)B→b所以FIRST(B) {b}FIRST(A)A→aA加入aA→ε加入ε。所以FIRST(A) {a, ε}FIRST(S)S→AB。先看FIRST(A)加入a因为A能推ε继续看FIRST(B)加入b。所以FIRST(S) {a, b}2. 求FOLLOW集FOLLOW(S)S是开始符号加入#。所以FOLLOW(S) {#}FOLLOW(A)找A在产生式右部的位置在S→AB中A后面跟着B。将FIRST(B)中非空元素加入FOLLOW(A)即加入b。所以FOLLOW(A) {b}FOLLOW(B)在S→AB中B在最后。将FOLLOW(S)加入FOLLOW(B)。所以FOLLOW(B) {#}3. 求SELECT集SELECT(A→aA)aA不能推ε等于FIRST(aA)所以SELECT(A→aA) {a}SELECT(A→ε)ε能推ε等于(FIRST(ε) - {ε}) ∪ FOLLOW(A) ∅ ∪ {b}所以SELECT(A→ε) {b}SELECT(B→b)等于FIRST(b)所以SELECT(B→b) {b}SELECT(S→AB)等于FIRST(AB)所以SELECT(S→AB) {a, b}四、总结与应用4.1 核心知识点总结通过这两道例题你会发现求这三个集合的核心就在于对空串ε的处理记住三句话即可FIRST集遇到能推空的符号要“穿透”它继续往后看。FOLLOW集如果后面的符号能推空要把自己的保镖分给它。SELECT集能推空的产生式它的SELECT集由FOLLOW集决定不能推空的由FIRST集决定。4.2 LL(1)文法判定应用落地 判定规则看同一个非终结符的多个产生式的SELECT集是否有交集。如果所有非终结符的任意两个产生式的SELECT集都没有交集那么这个文法就是LL(1)文法。这三个集合的核心应用就是判断一个文法是不是LL(1)文法——LL(1)文法的精髓的是“向前看一个输入符号就能明确选择哪条产生式推导不产生二义性”。比如经典例题中E’的两个产生式SELECT集分别是{}和{), #}完全没有交集简单例题中A的两个产生式SELECT集分别是{a}和{b}也没有交集所以这两个文法都是LL(1)文法。最后提醒FIRST、FOLLOW、SELECT集的推导一定要遵循“迭代计算直到集合不再增大”的原则尤其是FOLLOW集常常需要反复推导才能得到最终结果。多练两道例题就能熟练掌握啦

相关文章:

编译原理|FIRST、FOLLOW、SELECT集超详细解读(含例题)

编译原理|FIRST、FOLLOW、SELECT集超详细解读(含例题)在编译原理的自顶向下语法分析中,FIRST、FOLLOW、SELECT三个集合是核心基石——它们是构造LL(1)分析表、判断文法是否为LL(1)文法的关键。很多同学刚开始接触时会被抽象的定义…...

Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术应用

一:Delft3D软件介绍及建模原理和步骤对常见的地表水数值模型进行介绍,学习Delft3D软件的构成、界面内容,了解地表水数值模型的建模步骤:1.1地表水数值模拟常用软件介绍EFDC_Explorer(商业) Delft3D&#xf…...

大学生零基础打CTF比赛全攻略:要学啥、怎么学,看完就能参赛

大学生零基础打CTF比赛全攻略:要学啥、怎么学,看完就能参赛(干货版) 摘要:对大学生来说,CTF(Capture The Flag,夺旗赛)不仅是网络安全领域最具实战性的竞赛,…...

为什么我强烈推荐大学生打CTF!看完你就懂了!

前言 写这个文章是因为我很多粉丝都是学生,经常有人问: 感觉大一第一个学期忙忙碌碌的过去了,啥都会一点,但是自己很难系统的学习到整个知识体系,很迷茫,想知道要如何高效学习。 这篇文章我主要就围绕两点…...

如何快速掌握ComfyUI_InstantID:从零到一的AI人脸编辑完整实战指南

如何快速掌握ComfyUI_InstantID:从零到一的AI人脸编辑完整实战指南 【免费下载链接】ComfyUI_InstantID 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_InstantID 在AI图像生成领域,保持特定人物身份的同时实现风格转换一直是个技术挑战…...

5秒极速转换!m4s转换工具:B站缓存视频合并为MP4的完整指南

5秒极速转换!m4s转换工具:B站缓存视频合并为MP4的完整指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否在B站缓…...

配置openclaw使用taotoken作为其底层大模型供应商

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 配置 OpenClaw 使用 Taotoken 作为其底层大模型供应商 基础教程类,引导使用 OpenClaw 这类 Agent 框架的开发者&#x…...

番茄小说下载器:3分钟打造个人专属离线图书馆

番茄小说下载器:3分钟打造个人专属离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器是一款专为小说爱好者设计的强大开源工具,…...

Google I/O 2026最魔幻的一幕:发新模型的同时,Google砍了自己的CLI

5月19号凌晨,我刚躺下准备刷会儿手机睡觉,结果被朋友圈刷屏了。 Google I/O 2026,总共两个小时的 keynote,愣是让我看到凌晨两点。不是因为我有多敬业,而是信息量实在太大——大到我觉得不记下来,明天就忘了…...

希捷ST20000NM007D深度评测:20TB企业级硬盘,兼顾容量与稳定的实用之选

在企业存储领域,“容量”与“稳定”始终是核心诉求。随着大数据、云存储、边缘计算的快速发展,企业对存储设备的要求愈发严苛——既需要足够大的空间承载海量数据,又要保证724小时不间断运行的稳定性,同时还要控制功耗与运营成本。…...

影刀RPA跨境店群运营架构:TikTok Shop多节点高并发调度与Python环境隔离实战

大家好,我是林焱。 太有意思了,刚刷朋友圈,看到一个在跨境圈子里被疯狂转发的消息。 有几个当年和我一样,在南充念工程测量技术出身的 00 后学弟,最近跑回母校干了件特别硬核的事。 他们没有像传统的成功校友那样&a…...

Servlet 容器 vs Spring 容器 超详细对比

目录 一、先搞懂两个容器本质 1. Servlet 容器(Web 容器) 2. Spring 容器(IoC 容器) 二、核心相同点 三、核心不同点(重点) 四、最直白通俗理解 五、Web 项目完整启动顺序(必背面试题) 容器层级关系 六、请求处理流程差异 1. 原生 Servlet 模式(只有 Servle…...

Servlet 容器与过滤器 超详细讲解

目录 一、Servlet 容器(Servlet Container) 1. 是什么? 2. 核心作用(必须掌握) 3. Servlet 生命周期(容器全权控制) 4. 工作流程(HTTP 请求完整链路) 5. 总结一句话 二、过滤器(Filter) 1. 是什么? 2. 核心特点 3. 过滤器能做什么?(高频场景) 4. 过滤…...

Gitee Scan:关键领域软件工厂的安全检测能力分析

Gitee Scan:关键领域软件工厂的安全检测能力分析 文章概述 软件供应链安全正成为互联网、金融、国防等关键领域关注的焦点。Gitee Scan 是 Gitee DevSecOps 平台中集成的安全检测组件,提供 SAST(静态应用安全测试)、SBOM&#xff…...

【MATLAB】人脸表情识别与情感分析程序(工程实操版)

【MATLAB】人脸表情识别与情感分析程序(工程实操版) 摘要:人脸表情是人类情感表达的核心载体,人脸表情识别与情感分析技术融合了计算机视觉、图像处理、模式识别等多领域知识,广泛应用于人机交互、心理评估、智能安防、教育教学等场景。传统表情识别依赖人工判断,存在主…...

随身移动文件工作站 金士顿高速移动固态系列

当下移动办公已成为职场人的常态,无论是商务会谈时给客户演示视频、设计文件,还是户外创作时调取海量素材,亦或是日常通勤中处理微信接收的各类文件,都离不开高效的文件存储与传输支持。但现实中的痛点却屡屡困扰着大家&#xff1…...

站长日记:实测一款神仙工具,终于搞定了Bing和360的收录难题

最近真的很想吐槽一句:现在做个小站怎么就这么难? 事情是这样的,上个月为了测试一个新出的长尾词,我花周末两天火速搭了个新站,内容全部手写,绝对原创。按照以前的经验,这种质量的站&#xff0c…...

利用Taotoken模型广场为不同AI应用场景挑选最合适的模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为不同AI应用场景挑选最合适的模型 在构建AI驱动的应用时,一个常见的挑战是如何为不同的功能模块…...

[QA]插件式测试用例生成工具:LLM Test Case Tool 的设计与实现

一句话介绍:QA 在需求分析和测试设计中常用的能力沉淀到浏览器插件里:用户在阅读 PRD 时,可以直接在页面右下角调用 Workee,完成摘要、大纲、疑点、测试点、测试用例、UAT 用例和多页面分析。 1. 背景:为什么还需要这个…...

Input Overlay 完整指南:实时显示键盘、游戏手柄和鼠标输入的终极工具

Input Overlay 完整指南:实时显示键盘、游戏手柄和鼠标输入的终极工具 【免费下载链接】input-overlay Show keyboard, gamepad and mouse input on stream 项目地址: https://gitcode.com/gh_mirrors/in/input-overlay Input Overlay 是一款功能强大的开源输…...

CANN 模型转换与适配:从 PyTorch 到 Ascend OM 的完整指南

模型转换是昇腾落地的第一道坎。不管你用 PyTorch、TensorFlow 还是 MindSpore,最终都要变成 Ascend 的 .om 模型才能在 NPU 上跑。 这篇文章讲清楚:模型转换的完整流程、常见问题和优化技巧。 为什么需要模型转换? 昇腾 NPU 不能直接运行 Py…...

SleeperX:macOS系统级电源管理架构解析与深度集成方案

SleeperX:macOS系统级电源管理架构解析与深度集成方案 【免费下载链接】SleeperX MacBook prevent idle/lid sleep! Hackintosh sleep on low battery capacity. 项目地址: https://gitcode.com/gh_mirrors/sl/SleeperX 在macOS生态系统中,电源管…...

丹麦语语音合成总不“像真人”?揭秘ElevenLabs最新v3.2引擎中未公开的3个丹麦语重音标记开关,限前200名开发者速查

更多请点击: https://intelliparadigm.com 第一章:丹麦语语音合成的“真人感”困局本质 丹麦语语音合成长期面临“真人感”缺失的核心挑战,其根源并非单纯的数据量不足或模型容量有限,而是深植于该语言独特的音系结构与韵律特征之…...

微信好友关系检测完整指南:快速找出谁删了你

微信好友关系检测完整指南:快速找出谁删了你 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 你是否曾…...

Midjourney范戴克印相实战手册(2024唯一认证工作流):从sref灰度映射到氯化银颗粒模拟全链路拆解

更多请点击: https://intelliparadigm.com 第一章:范戴克印相的历史溯源与数字再生哲学 范戴克印相(Van Dyke Brown printing)诞生于19世纪末,是铁银盐印相工艺的重要分支,以荷兰画家安东尼范戴克命名&am…...

Midjourney拟态风终极内参(2024.06最新版):含6类行业专属LORA融合权重表、11个失效规避checklist及3个已验证绕过--v 6.2限流机制的prompt结构

更多请点击: https://codechina.net 第一章:Midjourney拟态风的范式跃迁与v6.2限流本质解构 Midjourney v6.2 的发布并非一次简单的模型迭代,而是一场以“拟态风”(Mimetic Style)为内核的生成范式跃迁——其核心在于…...

对比直接调用与通过 Taotoken 调用的稳定性体验差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接调用与通过 Taotoken 调用的稳定性体验差异 作为一名长期使用各类大模型 API 的开发者,我在构建和运维应用时&…...

3个关键设置让Windows风扇控制软件发挥最佳性能

3个关键设置让Windows风扇控制软件发挥最佳性能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl.Relea…...

不止于指路,智慧导览如何重构公共空间价值

在过去很长一段时间里,公共空间的价值被简单地等同于功能性。一个公园只要有绿化和座椅,一个商场只要有商铺和电梯,一个政务大厅只要有窗口和座位,就被认为是合格的公共空间。然而,随着人们生活水平的提高和消费观念的…...

构建企业级 AI 编程助手(AI-OS)v1.0,集成 Matt Pocock 全套技能,实现零幻觉开发

告别单文件 Prompt:构建企业级 AI 编程助手(AI-OS)v1.0,集成 Matt Pocock 全套技能,实现零幻觉开发 引言:为什么你的 AI 编程总是“翻车”? 在使用 OpenCode、Cursor、Cline 等 AI 编程工具时&a…...