编译原理:first集和follow

一、First 集(首符号集)

定义
对于符号(非终结符或终结符)或符号串,First 集是该符号串能够推导出的所有可能开头的终结符的集合。若符号串可以推导出空串(ε),则 ε 也属于 First 集。

注意:这里是终结符哦!(不包括一些特殊符号)

计算规则

  1. 终结符:First(a) = {a}。
  2. 非终结符 A
    • 若存在产生式 A → a…,则将 a 加入 First (A)。
    • 若存在产生式 A → B…,则将 First (B) 加入 First (A)。
    • 若 B 可以推导出 ε(即 First (B) 包含 ε),则递归处理后续符号。
    • 若所有产生式均以 ε 结尾(如 A → ε),则 First (A) 包含 ε。

举几个例子:

1.后面跟的不是非终结符
        A->aB|ε
        A->c
        First(A)={a,ε,c}

2.后面跟非终结符(一)
        A->Ba
        B->b
        First(A)={b}

3.后面跟非终结符(二)
        A->Bc
        B->b|ε
        First(A)={b,c}

4.后面跟非终结符(三)
        A->BC
        B->b|ε
        C->c|ε
        First(A)={b,c,ε}

二、Follow 集(后继符号集)

定义
对于非终结符 A,Follow (A) 是所有可能出现在 A 后面的终结符的集合,包括结束符 $(表示输入结束)。

计算规则

  1. 起始符号 S:Follow (S) 初始包含 $。
  2. 若存在产生式 B → αAβ,则将 First (β)(除去 ε)加入 Follow (A)。
  3. 若存在产生式 B → αA(即 β 为空),则将 Follow (B) 加入 Follow (A)。
  4. 若 A → αBβ 且 B 可以推导出 ε,则将 First (β)(除去 ε)和 Follow (A) 加入 Follow (B)。

给规则3举例:

形如A->aB(a可以是终结符或者非终结符或者直接为空)或者A->aBβ是一个产生式且β=>ε
比如
A->B
A->CB
A->dBC
C->ε
将Follow(A)加入到Follow(B)中

综合例题

例一:

给定文法 G(S) 如下:
S→IETSP∣O
I→if
E→b
O→other
L→else
T→then
P→LS∣ε

符号First 集Follow 集
S{if, other}{#, else}
I{if}{b}
E{b}{then}
O{other}{else, #}
L{else}{if, other}
P{else, ε}{else, #}
例二:

G(E):E->TE'
E'->+TE'|E
T->FT'
T'->*FT'|E
F->(E)|i

FirstFollow
First(E)={(,i}Follow(E)={#,)}
First(E')={+ ,ε}Follow(E')={#,)}
First(T)={(,i}Follow(T)={+,#,)}
First(T')={* ,ε}Follow(T')={+,#,)}
First(F)={(,i}Follow(F)={*,+,#,)}
例三:

G[S]:S→aH
H→aMd
H→d
M→Ab
M→ε
A→aM
A→e

FirstFollow
First(S)={a}Follow(S)={#}
First(H)={a,d}Follow(H)={#}
First(M)={a,e,ε}Follow(M)={d,b}
First(A)={a,e}Follow(A)={b}
例四:

G(E):E->TE'
E'->+E|ε
T->FT'
T'->Tlε
F->PF'
F'->*F'|ε
P->(E)|a|b|^

FirstFollow
First(E)={(,a,b,^}Follow(E)={#,)}
First(E')={+,ε}Follow(E')={#,)}
First(T)={(,a,b,^}Follow(T)={+,#,)}
First(T')={(,a,b,^,ε}Follow(T')={+,#,)}
First(F)={(,a,b,^}Follow(F)={(,a,b,^,+,#,)}
First(F')={*,ε}Follow(F')={(,a,b,^,+,#,)}
First(P)={(,a,b,^}Follow(P)={*,(,a,b,^,+,#,)}

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

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

相关文章

python实现简单fast-cgi服务,对接到nginx

python代码 import socket import struct import threading# FastCGI 头格式(8 字节) FCGI_HEADER_FORMAT "!BBHHBx" FCGI_VERSION 1 FCGI_TYPE_BEGIN_REQUEST 1 FCGI_TYPE_PARAMS 4 FCGI_TYPE_STDIN 5 FCGI_TYPE_STDOUT 6 FCGI_TYPE_E…

vue开始时间小于等于结束时间,且开始时间小于等于系统时间,时间格式:年月日时分

// 日期配置 export const DATA_CONFIGS [{itemKey: "startDate",startDateKey: "startDate",endDateKey: "endDate",isStart: true,},{itemKey: "endDate",startDateKey: "startDate",endDateKey: "endDate",is…

PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境

PyCharm 是一款专为 Python 开发设计的集成开发环境(IDE),它提供了强大的代码编辑、调试、版本控制等功能,是 Python 开发者的必备工具之一。如果你是初学者,或者正在寻找一款高效的开发工具,这篇文章将帮助…

Qt线程等待条件QWaitCondition

Qt 线程等待条件 概念 Qt提供了QWaitCondition类实现“等待条件”式的线程控制方法,它让线程阻塞在等待条件的地方,直到条件满足后才继续执行下去。也就是说,QWaitCondition可以使一个线程在满足一定条件时通知其他多个线程,使它…

RAG 和 RAGFlow 学习笔记

一、RAG(检索增强生成) 1. RAG 的定义与核心思想 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合 信息检索(Retrieval) 和 文本生成(Generation) 的技术…

Windows连接服务器Ubuntu_MobaXterm

通过 SSH 远程连接(命令行方式) 🔧 所需工具: Windows:MobaXterm(强烈推荐)或 PuTTY Ubuntu:已开启 SSH 服务 Ubuntu 开启 SSH 服务(仅需一次) 在 Ubuntu …

Rust 中的高效视频处理:利用硬件加速应对高分辨率视频

引言 在视频处理领域,随着4K、8K甚至更高分辨率内容的普及,传统的CPU计算方式逐渐显得力不从心。无论是视频剪辑、直播流处理还是格式转换,高负载场景下CPU占用过高的问题常常让开发者头疼。硬件加速技术通过利用GPU等专用硬件分担编解码任务…

大模型提示工程中,提示、补全、指令、上下文和样本这几个概念的区别是什么?

提示 (Prompt) 定义:输入给大模型的完整文本刺激,是与模型交互的主要方式。 特点: 是最广义的概念,包含其他几个元素整体输入的总和,包括指令、上下文和样本等内容决定模型如何理解和处理请求 示例: 分…

AI的未来演进

企业数字IP实战:创始人分身如何实现品宣获客双赢? ——从量子化建模到联邦学习的全链路技术拆解 一、行业痛点:品牌信任与获客效率的双重困局 2025年数据显示,73%的企业因传统营销模式效率低下错失市场机遇(家居品牌…

软件定义无线电39

13.8 RFSoC上PYNQ的SDR设计流程 本节中详细介绍的设计过程可以分为六个独立的步骤,如图13.16所示,并在接下来的几页中进行讨论。 13.8.1 初始设计过程 。在这里,系统设计人员必须考虑许多因素,例如RFDC接收和/或发送的频率范围…

​自动化网络架构搜索(Neural Architecture Search,NAS)

NAS是一种旨在自动设计神经网络结构的技术。传统上,神经网络的架构设计依赖于专家的经验和大量的试错过程,而NAS通过算法自动搜索网络架构,以发现最适合特定任务的神经网络设计。 NAS的主要组成部分包括: 搜索空间:定…

Ubuntu 22.04 安装和运行 EDK2 超详细教程

Ubuntu 22.04 安装和运行 EDK2 超详细教程 适合新手小白,从零开始 🌟 1. 什么是 EDK2? EDK2(EFI Development Kit 2)是一个开源的 UEFI(统一可扩展固件接口)开发环境,主要用于编写和…

什么是STEP认证

**什么是STEP认证** STEP认证,全称为“可持续纺织生产认证”(Sustainable Textile Production),是一项由国际环保纺织协会Oeko-Tex提供的权威独立认证体系。这一认证体系犹如纺织和皮革行业的绿色灯塔,为追求可持续发…

odoo-045 ModuleNotFoundError: No module named ‘_sqlite3‘

文章目录 一、问题二、解决思路 一、问题 就是项目启动,本来好好地,忽然有一天报错,不知道什么原因。 背景: 我是在虚拟环境中使用的python3.7。 二、解决思路 虚拟环境和公共环境直接安装 sqlite3 都会报找不到这个库的问题…

[Linux系统编程]进程间通信—system V

进程间通信—system V 1. System V 共享内存(Shared Memory)1.1 共享内存的建立过程1.2 共享内存函数2. System V 消息队列(Message Queues)3. System V 信号量(Semaphores)4. 总结前言: 之前所提的管道通信是基于文件的,OS没有做过多的设计工作。 system V 进程间通信…

R语言——获取数据1

参考资料:学习R 数据的来源可以由很多。R内置有许多数据集,而在其他的附件包中能找到更多的数据。R能从各式各样的来源中读取,且支持大量的文件格式。 1、内置的数据集 R的基本分发包有一个datasets,里面全是示例数据集。很多其他…

HTTP 请求方法

HTTP 请求方法 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间通信的规则。HTTP请求方法,也称为HTTP动词,是客户端向服务器发送请求时使用的操作类型。本文将详细介绍HTTP请求方法的概念、分类、常用方法及其在实际应用中的…

python函数装饰器

python函数装饰器 声明:博主并没有系统学习过python语言,在实际项目中遇到关于python不懂的语法,这里仅作为个人学习积累笔记 1.1 python函数相关基础 深入了解python函数装饰器移步:Python 函数装饰器 下面的笔记来源于上述链接…

OpenCV 图形API(7)用于将笛卡尔坐标(x, y)转换为极坐标(magnitude, angle)函数cartToPolar()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算二维向量的大小和角度。 cartToPolar 函数计算每个二维向量 (x(I), y(I)) 的大小、角度,或同时计算两者: magnitude…

什么是向量搜索Vector Search?

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…