首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将CFG转换为CNF

CFG是上下文无关文法(Context-Free Grammar)的缩写,CNF是乔姆斯基范式(Chomsky Normal Form)的缩写。

上下文无关文法是一种形式语言的描述方法,它由产生式(规则)组成,可以用来描述语言的语法结构。CFG包括一个起始符号、非终结符号、终结符号和一组产生式规则。起始符号是语法分析的起点,终结符号是语言中的实际元素,非终结符号则表示语法结构的组成部分。产生式规则定义了如何从非终结符号推导出其他符号串。

乔姆斯基范式是一种将上下文无关文法进行标准化的方法,它包括两种形式:CNF-0和CNF-1。CNF-0要求产生式的右部只能是非终结符号和终结符号的组合,而CNF-1则要求产生式的右部只能是两个非终结符号或一个终结符号的组合。乔姆斯基范式的标准化使得语法分析更加高效且容易实现。

将CFG转换为CNF的过程主要包括以下几个步骤:

  1. 消除起始符号以外的所有非终结符号的ε产生式(可以通过将产生式中的非终结符号替换为其他产生式中的组合来实现)。
  2. 消除所有产生式的右部超过两个符号的情况。这可以通过引入新的非终结符号和中间产生式来实现,将右部进行拆分。
  3. 消除所有产生式的右部包含终结符号的情况。这可以通过引入新的非终结符号和中间产生式来实现,将终结符号替换为对应的非终结符号。
  4. 消除所有产生式的左部为非终结符号的情况。这可以通过引入新的非终结符号和中间产生式来实现,将左部进行拆分。
  5. 最后,将得到的产生式进行合并,得到CNF形式的文法。

乔姆斯基范式的转换过程可以使用自顶向下或自底向上的方法进行,具体使用哪种方法取决于具体的文法和实现方式。

CFG转换为CNF的优势在于,CNF形式的文法具有良好的性质和简洁的结构,可以方便地进行语法分析和推导。它也更容易与其他算法和工具集成,提高了文法描述和处理的灵活性。

对于应用场景,CFG转换为CNF主要应用于语法分析、编译器设计、自然语言处理等领域。

关于腾讯云相关产品和产品介绍链接地址,由于不能提及具体品牌商,无法给出腾讯云相关产品的链接。但可以参考腾讯云的官方文档和产品手册,以了解他们提供的云计算解决方案和工具。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 我个人对内存漏洞攻防战的一些见解

    今天看到了铁磊师兄和张超老师以及yuange等大牛朋友圈发的关于内存漏洞攻防方面的讨论和真知灼见,受益匪浅。内存破坏漏洞的攻防战已经持续20多年,我虽然在2016年才开始近距离围观这场战争,但是仍然斗胆谈谈自己的看法。 所谓内存破坏漏洞,如其名,其最原始的作用就是对内存的破坏,这个破坏最开始可能是不可控制的。因此,攻击者需要把这种破坏转换为某种相对可以控制的成果。 在相对早期的对抗中,由于防护机制较少,攻击者会选择一些比较“肤浅”的方式利用内存破坏漏洞,比如说栈溢出破坏返回地址、破坏SEH。堆溢出破坏双向链表,来构造DWORD SHOOT(说白了就是一个write what where)。 而如今,简单的破坏已经不再凑效,攻击者就转而去寻找更值得被破坏的对象,比如说破坏掉数组的length、base来构造地址读写,或者破坏一些对象来构造一些write what where/ read write的原语。这个过程不一定是一步到位,攻击者通常需要一步一步的提高自己的能力,比如把一个write what where转换为一个可控的越界写,把越界写转换为任意地址读写。 我们也可以看到这是新兴的战场,攻击者不断的找到一些值得破坏的对象,而这些值得破坏的对象又一点一点的被防御方渐渐的禁掉了。比如Win10的TypeIsolation把一些容易构造原语的对象给隔离掉,javascriptcore把ArrayBuffer的DataStore隔离到一个指定区域,这一类对抗的例子可以说数不胜数,而且日益激烈,Win10 1903刚发现了一个好用的对象,1909就用不了了。 在传统的战场上,如GS、SafeSEH/SEHOP、DEP、ASLR、CFG、RFG等防护机制相继出现,虽然在这些防护机制的保护下,攻击者仍能一直不断攻击成功,但是也极大的提升了攻击者的门槛。 GS+SafeSEH/SEHOP基本把利用栈溢出漏洞的可能性给封死了。为啥我敢说的这么绝对?栈跟堆不一样,堆上有趣的对象有很多,想破坏谁就把它堆风水一下就可以了。但是栈的布局相对固定,没办法风水,所以只要把有限个潜在的值得破坏的对象给封死,就万事大吉。 对于堆来说,情况相对复杂,DEP、ASLR、CFG、RFG在攻击成功的路上各设关卡,这些防御机制的存在逼迫攻击者必须构造出相对强大的能力才能够实现最终的目的(劫持控制流、篡改关键数据等),试想,如果没有ASLR和CFG,攻击者只需要一个read write,改掉vtable,配合一个xchg rax, rsp的gadget就可以一步到位劫持控制流和栈指针。这样的read write的原语对不少目标来说都不难构造。然而,有了这些防护机制之后,一些无法构造出强力的原语的目标和漏洞就变得难以利用,只有类似于脚本引擎、内核这种容易构造强力原语(如任意地址读写)的目标才能轻易打穿了。 在战争的后期大家发现,就算全保护机制全上了,对于能够构造出较强能力的攻击者,可以通过找到一些未被保护到的路径打穿目标。于是一方面防御方开始在这些目标外面套一层沙箱或者虚拟化并对其不断的完善,让这些目标即使被打穿也收益有限,这可以说又是另一个战场。另一方面就是防患于未然,即防止攻击者构造出较强的能力(如任意地址读写)。比如用对象隔离,来减少好用的对象,用内存分配随机化,增加攻击者将被破坏对象布局到指定位置的难度。我之前说的对象的新兴战场就是这一类,这些方法有时候很有效,但是如果漏洞品相好或者多个漏洞串联出很好的能力(即攻击者的初始能力就很强),这些方法也是有可能被绕过的。 现在自动化生成漏洞利用代码这个课题被研究的很火热。然而,大多数(尤其是国内)的研究都是把防御机制全下掉的情况下来自动生成利用代码。无防护机制的时代已经基本过去,因此这一类研究很难应用到实战中去,所以我个人觉得,根据现在的内存攻防形势,如果真要搞自动化漏洞利用的研究,我临时起意,感觉可以在以下几个点入手。

    03

    MySQL从删库到跑路(二)——MySQL字符集与乱码解析

    字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。 字符编码(Character encoding)是把字符集中的某个字符编码为指定字符集中字符,以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成ASCII,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示。 字符序(collation)是指同一个字符集内字符之间的比较规则。只有确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。一个字符可以包含多种字符序。MySQL字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci、cs、或bin结尾。以ci结尾的字符序表示大小写不敏感,以cs结尾的字符序表示大小写敏感,以bin结尾的字符序表示按二进制编码值比较。

    02
    领券