【形式语言与自动机/编译原理】CFG->Greibach->NPDA(1)

本文将详细讲解《形式语言与自动机》(研究生课程)或《编译原理》(本科生课程)中的上下文无关文法(CFG)转换成Greibach范式,再转成下推自动机(NPDA)识别语言是否可以被接受的问题。此外,本文还给出了python代码的具体实现。

由于内容比较多,所以为了讲清楚,分成了3篇博客,第一篇(即本篇)主要讲 解从上下文无关文法到Greibach范式的具体步骤和流程,并给出了相应的算法及具体的例子;第二篇主要讲解从Greibach范式到下推自动机NPDA,同样给出了相应的算法及具体的例子;第三篇主要是对前两篇中给出的算法用python语言进行实现,并测试之前的例子。

它们的地址如下:

第一篇:

第二篇:

第三篇:


整体流程

这里先来介绍以下从上下文无关文法到Greibach范式再到下推自动机的整体流程,如下所示:

由上下文无关文法转换成下推自动机的过程,可以分为两个步骤,即:(1)上下文无关文法转换成Greibach范式(2)Greibach范式转换成下推自动机NPDA。这两个过程包括的具体步骤以及它们的顺序如下,

上下文无关文法-->消除左递归-->消除无用符号-->消除单一产生式-->消除空产生式-->得到Greibach范式-->生成状态转移函数-->得到下推自动机NPDA

以下将按照这个顺序分步骤进行讲解。

上下文无关文法转换成Greibach范式

1.1 消除左递归

c25af6d51bb64bdba7d34d14469a8dc6.png

d520400d5748483a9a0e69514049588f.png

86c9c7113874438096f0e92a82fb02e5.png

给出两个消除直接左递归的例子:

例子1:

8049239d739d4714b26a6b3aba1df46b.png

7e09c46bc833490397185e0a6ee31381.png

e3b75242a80a43689d656dcb4ed67de0.png

下面举3个消除间接左递归,并将其转换成直接左递归的例子:

bca32d7209564724a7fbcae58f81a68f.png

1c208926ef7441e4bf7260f3efe4e1e1.png

0964ee4ccd1842ad8316c5e040846646.png

1.2 消除无用符号

b6de6d92fa324eb88f22de6bdb170da0.png

简单来说,无用符号包括不可达符号和非产生符号两种。不可达符号是指不能直接或间接推出终结符号的非终结符号。非产生符号是指由开始符号S推不出的非终结符号。

bc1b4e4116ae4a18bfa9c754088e8ba4.png

f2a4ffbb69cd45ef908728ca061fa258.png

下面给出2个例子:

1de82e78e9d74b01bebe1b72446a7977.png

例子2:

41fe8b97501c449bb6d4658e2f9a33a6.png

1.3 消除单一产生式

71fd0401cc7f4a21a838feb6c18a54fb.png

97f7a3abf7f24222b148bde77e3a1901.png

8962cbdfd5ce47d5a6cd71ee7ed32555.png

0720487f7a6d45628b839ce4fcee43dc.png

以下给出4个例子:

227f634ae0824b86986028fa9de0998b.png

6796207c1f834b7b8fff8dac1889ab6c.png

10122aeb06af47faac1550f3c7859cec.png

1.4 消除空产生式

4641aaf629ba425f90537f4b090742ad.png

f54fb35baaef4205b0ebf217161cc3d9.png

763456b08d8e43068b8023f7be8f2a1b.png

以下给出3个例子:

9b036ac2e76b495ab63dbc8f4c5a3fb6.png

例子3:

bacd887604d745e7a6e8754d442de058.png

1.5 得到Greibach范式

56f83b8ea34b4a9cb438914cbbf237ec.png

7203f176c7244ce0ac5a27c72ff055fd.png

以下给出2个例子:

3e800830f782467cbd4b176aae08f218.png


本篇博客主要介绍了从上下文无关文法到Greibach范式的各个步骤,下一篇将讲解从Greibach范式到下推自动机NPAD的各个步骤。

 

 

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

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

相关文章

Unity坦克大战开发全流程——游戏场景——通关点

游戏场景——通关点 按照这样将场景设置好即可 创建一个通关点特效,并为其添加一个碰撞器。 写一个脚本并将其挂载

Linux:进程退出 与 进程等待wait,waitpid

1.进程退出 1.1 进程退出介绍 进程退出场景 代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止 进程常见退出方法: 1. 正常终止(可以通过 echo $? 查看进程退出码): 从main return调用exit…

HTML+CSS+JAVASCRIPT实战项目——新年快乐特效

生成动态视频 <!doctype html> <html> <head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, minimum-scale1.0, user-scalableno"/><title>2024新年快乐…

Centos7部署Keepalived+lvs服务

IP规划&#xff1a; 服务器IP地址主服务器20.0.0.22/24从服务器20.0.0.24/24Web-120.0.0.26/24Web-220.0.0.27/24 一、主服务器安装部署keepalivedlvs服务 1、调整/proc响应参数 关闭Linux内核的重定向参数&#xff0c;因为LVS负载服务器和两个页面服务器需要共用一个VIP地…

性能优化-如何提高cache命中率

本文主要介绍性能优化领域常见的cache的命中率问题&#xff0c;旨在全面的介绍提高cache命中率的方法&#xff0c;以供大家编写出性能友好的代码&#xff0c;并且可以应对性能优化领域的面试问题。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &am…

docker build打包时下载python包run pip总是超时的解决办法

报错 Step 4/6 : RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt---> Running in ece078308279 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/ WARNING: Retrying (Retry(total4, connectNone, readNone, redirec…

广州市网约车平台:照片上传标准与处理技巧全解析

《广州市网络预约出租汽车综合业务管理平台》是一个旨在规范和提升广州市网约车服务质量的在线管理系统。它整合了司机和车辆信息管理、预约服务、监管监控、服务质量评价以及数据分析等功能&#xff0c;确保网约车服务符合当地法规要求&#xff0c;同时为乘客提供安全、便捷的…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

java基础之String的不可变性

目录 概述 String是如何实现不可变的 String为何设计成不可变的 1.缓存和性能优化 2.安全性 3.线程安全性 4.API设计和预测性能 概述 String类的不可变性意味着一旦创建了一个字符串对象&#xff0c;它的值就不能被修改。 String是如何实现不可变的 查看源码 public …

FreeRTOS 实时操作系统第八讲 - 时间管理 (系统节拍,延时函数)

一、系统节拍 FreeRTOS 实时操作系统需要一个时钟节拍&#xff0c;以供系统处理诸如延时、超时、软件定时器等与时间相关的事件。 时钟节拍是周期性定时中断&#xff0c;这个中断可以看做是系统心跳。中断时间间隔取决于不同的应用&#xff0c;一般是 1ms – 100ms。时钟的节拍…

将“渴望“乐谱写入AT24C02并读出播放

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…

Winclone Pro 10 for Mac:轻松备份和还原你的Windows系统

Winclone Pro 10 for Mac是一款专为Mac用户设计的备份和还原软件&#xff0c;旨在帮助用户轻松管理和保护他们的Windows系统。无论是为了数据安全还是系统的稳定性&#xff0c;Winclone Pro 10都能提供全面的解决方案。 这款软件具备强大的备份功能&#xff0c;能够快速而准确…