编译原理笔记10:语言与文法,正规式转CFG,正规式和CFG,文法、语言与自动机

news2024/11/19 23:29:31

目录

    • 正规式,和 CFG
      • 正规式到 CFG 的转换:
      • 正规式和 CFG 的关系
      • 为毛不用 CFG 描述词法规则
      • 贯穿词法、语法分析始终的思想
    • 上下文有关文法 CSG
    • 文法、语言与自动机
      • 0型文法:
      • 1型文法:
      • 2型文法:
      • 3型文法:
      • 为什么, CSG 叫 CSG?

对语言进行形式化描述的规则叫文法。

词法规则、语法规则都以形式化的方法对语言进行描述,这样的规则就叫文法。在使用 lex 的时候,我们就可以使用文法来简单地定义和修改语言。

前几篇笔记中我们比较细致地研究了正规式,当时我们用正规式来描述词法规则,然后根据正规式构造可以识别由该正规式表示的语言的自动机。

但其实,CFG 也是可以描述词法的(但为什么不这么做呢?)

正规式,和 CFG

正规式所描述的语言结构都可以用 CFG 描述,反之不一定。

正规式和 CFG 是有关系的!NFA 是可以转化成 CFG 的!!一个 NFA 的状态和状态转移关系就对应一个产生式!!~~惊不惊喜?意不意外???~~至于为啥可以咱们暂且不论,先从这里往下看,后面时机成熟,自会解释。(先咕咕咕)

正规式到 CFG 的转换:

  1. 构造正规式的 NFA;

  2. 若 0 为初态,则 A0 为开始符号;

  3. 对于 move(i, a) = j,引入产生式 Ai → aAj;

    【从 i 状态经过标记为 a 的边转移到 j 状态。对于这样的状态转移关系,我们可以为其生成对应的产生式 Ai → aAj 】

    **NFA 中的每个边,即每个状态转移都会生成一个对应的产生式。**我们在这里引入 Ai → aAj(这里的 a 是指经过的边),这样一来,我们就用这种方法将 NFA 中的状态以及状态转移关系变成了 CFG 中的产生式。

  4. 对于 move(i, ε) = j,引入产生式 Ai → Aj;

    为空转移生成与之对应的产生式。

  5. 若 i 是终态,则引入产生式 Ai → ε(终态,对应的是空产生式)。

NFA 中有状态和状态间的转移,我们就可以把这些变成一个 CFG

【例】以正规式 r = ( a|b )*abb 的 NFA 构造 CFG。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0rI2YHe-1687258389041)(./img/10_1.png)]

如果没有最后的 ε,那么无论怎么推导,在推导的下一步总会引入一个新的非终结符,永远得不到一个我们想要的句子。

通过这种方式转化出来的 CFG 也是一种“正规文法”(后续会讲到)

另外,我们也可以使用经验(脑补)的方法来将正规式转化成 CFG。对于上面的正规式 r,我们不难(?)写出:

A → HT
H → ε | Ha | Hb
T → abb

过程:

  1. 通过观察,我们发现正规式 (a|b)*abb 是可以分为明显的两部分的,即a或b的星闭包连接上abb。第一部分就是星闭包,第二部分就是abb。因此,我们在构造 CFG 的时候,也就可以一上来就把开始符号拆成两部分,即上面第一行的 H 和 T
  2. 我们用前面的非终结符 H 来生成正规式中前半部分的星闭包。a或b的星闭包,就是由a或b构成的长度>=0的一个ab串,于是我们就可以通过 H 本身不限次引入 a、b 来构造星闭包,具体就是第二行的产生式。产生式 H->ε 的作用有二,一是为了满足只有空串的情况,因为星闭包可以为空;二是用来结束 H 的产生式,只有有了 ε,我们才能够结束对 H 的构造,否则这个推导会一路无限递归下去。。。
  3. T 就是给 abb 准备的

万一,如果 H 是正闭包而不是星闭包,那么就可以改成:H→a|b|Ha|Hb

正规式和 CFG 的关系

我们都知道:如果 NFA 能够接受一个串,那就说明在这个 NFA 内部一定存在一条从初态到终态的路径,路径上的链接就是这个串本身。

而,从上面的转化规则和例子,我们可以确定:这样的一个串一定对应CFG里面的一个推导。

也就是说,NFA 中的一个路径一定对应着 CFG 中的一个推导。反过来讲,CFG 中任意一个推导也都对应着 NFA 中的一个路径。

因此,正规式与 CFG 之间是等价的!!

任意一个正规式所描述的语言,都可用 CFG 来描述。也就是说对任意一个正规式,我们都可以为他构造出来其相应的、和它描述的语言相同的集合的 CFG。

但反过来,就不一定了——并不是所有用 CFG 描述的语言都可以用正规式来描述

既然凡是正规式能描述的,都能用CFG描述,反之则不行。这就说明 CFG 的语言描述能力更强。

可,为什么还用正规式,而非 CFG 来描述词法呢???

为毛不用 CFG 描述词法规则

原因很简洁:对人好,对机器也好~~(它好我也好)~~。

对人好:正规式更直观简单,人容易理解。而正规式描述词法恰巧已经够用了(词法无非标识符、关键字、字面量之类,这些都是线性结构,使用正规式就能充分描述);

对机器好:DFA 构造起来比用于 CFG 分析的下推自动机简单,效率更高。且使用两种不同方式来表示词法和语法,便于对两者进行区分,便于编译器前端的模块划分。

贯穿词法、语法分析始终的思想

  1. 语言的描述和识别,是表示一个语言的两个侧面,二者缺一不可;
  2. 一般而言,正规式适用于描述线性结构(标识符、关键字、注释等);
  3. CFG 适用于描述具有嵌套(层次)性质的非线性结构,比如不同结构的句子 if-then-else、while-do 等;
  4. 用正规式和 CFG 描述的语言,对应的识别方法(自动机)不同。

上下文有关文法 CSG

CFG 很棒,但 CFG 文法本身,无法描述上下文有关的结构。

不能用 CFG 描述的语言:

在这里插入图片描述

上述的 L1、L2、L3 均是上下文有关的。

与上述 CSL 类似的 CFL

在这里插入图片描述

文法、语言与自动机

0型文法:

若文法 G=(N, T, P, S) 的每个产生式 α→β 中,均有 α∈(N∪T)*,且至少有一个非终结符,β∈(N∪T)* , 则称 0 型文法。

产生式两侧的表达式需要含终结符,且是 N、T 元素组成的串。

1型文法:

在 0 型文法的基础上,要求:对 G 的任何产生式 α→β(S → ε 除外),满足|α|≤|β|。

其实就是在 0 型的要求之上,要求产生式左侧表达式必须比右侧的短,也就是说这种语言不会越推越短,一定是越推越长的(毕竟总是要把产生式往产生式里面代入,如果被代入的东西变长了,那么一定就会随着推导的进行整个串都越来越长),而且可以一次性换掉带有终结符的非终结符序列。

2型文法:

在 0 型文法的基础上,要求:G 的任何产生式都要形如 A→β,有 A∈N,β∈(N∪T)* 。

这其实就是在说,产生式左侧必须是一个单独的非终结符,右侧还是和原来一样随便即可。

3型文法:

在 0 型文法的基础上,要求:G 的任何产生式都要形如【 A→ a 或 A → aB (或 A→Ba)】,其中A、B∈N,a∈T

注意啊,这里的【 A→ a 或 A → aB (或 A→Ba)】是指在 “A → a” 或 “ A → aB (或 A→Ba)”这俩里面二选一,而不是“A→ a”、“A → aB”、“A→Ba”之间三选一。意思是说,一个串如果想要填字母就只能往一边续。如果用 A → aB,那就是向右侧延伸,越续越长。选 A→Ba 那就是向左侧延伸,越续越长。

在这里插入图片描述

  • 任何一个1型文法,都是一个0型文法

  • 任何一个2型文法,都是一个1型文法,都是一个0型文法

  • 任何一个3型文法,都是一个2型文法,都是一个1型文法,都是一个0型文法。

  • 所有3型文法的集合,是2型文法集合的子集

  • 2型文法的集合,是1型文法集合的子集

  • 1型文法的集合,是0型文法集合的子集

为什么, CSG 叫 CSG?

CFG,左边只有一个非终结符。

CSG 因为左边可以有终结符(即,可以是一个文法符号序列),所以在对非终结符进行展开时,我们需要考虑这个非终结符的左边是什么、右边是什么,也就是说我们要考虑这个非终结符的(已经存在了的)上下文了,因此,叫做上下文有关。

而 CFG 的非终结符完全可以在任何地方随便展开,只需要考虑他自己单独一个非终结符就行了,所以叫上下文无关!

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

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

相关文章

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调

之前尝试了基于LLaMA使用LoRA进行参数高效微调,有被惊艳到。相对于full finetuning,使用LaRA显著提升了训练的速度。 虽然 LLaMA 在英文上具有强大的零样本学习和迁移能力,但是由于在预训练阶段 LLaMA 几乎没有见过中文语料。因此&#xff0…

pdf上传文件过大怎么缩小?pdf在线压缩的简单方法

在日常使用中,我们经常会遇到需要共享或传输pdf文件但是文件过大无法传输的情况,需要使用压缩图的pdf压缩(https://www.yasuotu.com/pdfyasuo)功能来解决这个问题,利用这款pdf在线压缩工具可以快速将pdf文件压缩&#…

【三维重建】【深度学习】windows10下NeRF代码Pytorch实现

【三维重建】【深度学习】windows10下NeRF代码Pytorch实现 提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【三维重建】【深度学习】windows10下NeRF代码Pytorch实现前言NeRF模型运行下载源码并安装环境训练NeRF训练…

【AI底层逻辑】——篇章12:统计学与概率论数据“陷阱”

目录 引入 一、“思维方式”是解题关键!! 1、统计思维的诞生 2、概率的力量 概率与数理统计的区别? 如何验证假设? 经验与现实如何共存——贝叶斯定理? “朴素”的朴素贝叶斯? 二、数据“陷阱” …

HTTP Host 头攻击是什么?

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是HTTP Host头…

小鱼深度产品测评之:阿里云云产品OCR文档自学习,一款面向“无算法基础“的企业与个人开发者用户的产品。

OCR文档自学习 1、引言2、开箱体验3、我的任务菜单3.1 创建任务3.2 编辑任务3.3 创建模板 4、 在线使用 菜单5、 数据监控 菜单6、总结 1、引言 OCR文档自学习,看到这个标题,很多人第一反应就是,我不会算法 这个怎么搞的嘛? 其…

MetaAI发布人工智能语音模型Voicebox

Meta官网博客更新:人工智能研究人员在语音生成人工智能方面取得了突破。我们开发了Voicebox,这是第一个可以推广到语音生成任务的模型,它没有经过专门训练,以最先进的性能来完成。 与图像和文本的生成系统一样,Voicebo…

CRC校验码详解、常见算法实现及代码实例

一、CRC概念 1. 什么是CRC? 在前面的文章中通过小例子的比喻,简单介绍过什么是CRC,这里再详细的讲解一次。 CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。 数据通信领域中最常用的…

第二十二章_Redis经典五大类型源码及底层实现

redis源码在哪里 \redis-7.0.5\src https://github.com/redis/redis 源码分析参考书(推荐) 《Redis设计与实现》 《Redis5设计与源码分析》 Redis源代码的核心部分 src源码包下面该如何看? 源码分析思路 这么多你如何看? 1、外…

C/C++ VS2019连接MySQL数据库 - 增删改查(详细步骤)

一、配置Visual Studio 找到自己安装MySQL的路径,确保有include和lib两个文件夹 打开创建的Visual Studio项目,切换x64平台 注意:如果你的项目中没有x64平台,请严格按照下面图片的步骤进行操作 a. 点击下拉框,点击配…

面向对象程序设计|理解++i和i++

首先我们从最简单的整型运算来理解前和后: 将a10再赋值20意味着(a10)返回的是a的空间,又把这个20赋值给这个空间的内存,最后a20; (a)意味着a返回的是空间(引用),可以继续作的调用,引…

Java版本工程项目管理系统源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

STM32存储器映射

STM32的寻址范围 32位的单片机有32根地址线(每根地址线有两种状态:导通或者不导通)。 单片机内存地址访问的存储单元是按字节编址的。 存储器映射 存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址…

JAVA_HOME变量的详细配置(图文)

用到Java项目的时候,有时候要用到Java_home,这个需要在系统配置中配置一下。如何操作呢?以下为详细的图文步骤。 1)打开环境变量的窗口 2)打开新建系统变量 3)编辑JAVA_HOME 在变量名后输入JAVA_HOME,找到…

IDEA配置本地Maven详细教程

IDEA配置本地Maven详细教程 一、下载二、安装三、配置环境变量四、IDEA配置Maven 一、下载 官网下载:点击下载 网盘下载:点击下载 二、安装 将下载后的zip文件(免安装版)解压到自己想要放的位置,,我这里…

第八十一天学习记录:gVim的使用

首先,根据所使用的系统下载VIM,百度搜索或者CSDN搜索有资源可以下载。 gVim是Windows下的一个Vim实现,它提供了类似于Vim命令行界面的编辑器视窗,并且支持通过鼠标和菜单来执行一些基本的编辑命令。 安装完成后,桌面上…

Video-LLaMa:利用多模态增强对视频内容理解

在数字时代,视频已经成为一种主要的内容形式。但是理解和解释视频内容是一项复杂的任务,不仅需要视觉和听觉信号的整合,还需要处理上下文的时间序列的能力。本文将重点介绍称为video - llama的多模态框架。Video-LLaMA旨在使LLM能够理解视频中…

软考A计划-系统集成项目管理工程师-信息化系统的生命周期-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【GESP】2023年03月图形化一级 -- 问路

文章目录 问路1. 准备工作2. 功能实现3. 设计思路与实现(1)角色、舞台背景设置a. 角色设置b. 舞台背景设置 (2)脚本编写a. 角色:Averyb. 角色:Dee 4. 评分标准 问路 1. 准备工作 (1&#xff09…

全网超详细的【Axure】Axure RP 10 的下载、安装、中文字体、免授权

文章目录 1. 文章引言2. axure10的安装3. axure10的元件库4. axure10的下载地址 1. 文章引言 最近在学习原型图,针对画原型图的工具,反复对比墨刀、Axure、xiaopiu后,最终选择了Axure。 接下来,我便详细介绍如何安装axure10&…