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

2023-12-31 19:20

本文主要是介绍【形式语言与自动机/编译原理】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的各个步骤。

 

 

这篇关于【形式语言与自动机/编译原理】CFG->Greibach->NPDA(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556936

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

POJ 1625 自动机

给出包含n个可见字符的字符集,以下所提字符串均由该字符集中的字符构成。给出p个长度不超过10的字符串,求长为m且不包含上述p个字符串的字符串有多少个。 g++提交 int mat[108][108] ;int matn ;int N ;map<char ,int> to ;//ACconst int maxm = 108 ;const int kin

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。