上下文无关文法

在计算机科学中,若一个形式文法 G = (N, Σ, P, S) 的产生式规则都取如下的形式:V -> w,则称之为上下文无关文法英语:context-free grammar,缩写为CFG),其中 V∈N ,w∈(N∪Σ)* 。上下文无关文法取名为“上下文无关”的原因就是因为字符 V 总可以被字串 w 自由替换,而无需考虑字符 V 出现的上下文。一个形式语言是上下文无关的,如果它是由上下文无关文法生成的(条目上下文无关语言)。

上下文无关文法重要的原因在于它们拥有足够强的表达力来表示大多数程序设计语言的语法;实际上,几乎所有程序设计语言都是通过上下文无关文法来定义的。另一方面,上下文无关文法又足够简单,使得我们可以构造有效的分析算法来检验一个给定字串是否是由某个上下文无关文法产生的。例子可以参见 LR 分析器和 LL 分析器。

BNF(巴克斯-诺尔范式)经常用来表达上下文无关文法。

形式定义

上下文无关文法 G 是 4-元组:

G = (V\,, \Sigma\,, R\,, S\,) 这里的

1. V\, 是“非终结”符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。

2. \Sigma\, 是“终结符”的有限集合,无交集于 V\,,它们构成了句子的实际内容。

3. S\, 是开始变量,用来表示整个句子(或程序)。它必须是 V\, 的元素。

4. R\, 是从 V\, 到 (V\cup\Sigma)^{*} 的关系,使得 \exist\, w\in (V\cup\Sigma)^{*}: (S,w)\in R

此外,R\, 是有限集合。R\, 的成员叫做文法的“规则”或“产生式”。星号表示Kleene星号运算。

补充定义 1

对于任何字符串 u, v\in (V\cup\Sigma)^{*},我们称 u\, 生成 v\,,写为 u\Rightarrow v\,,如果 \exists (\alpha, \beta)\in R, u_{1}, u_{2}\in (V\cup\Sigma)^{*} 使得 u\,=u_{1}\alpha u_{2} 且 v\,=u_{1}\beta u_{2}。因此 v 是应用规则 (\alpha, \beta) 于 u 的结果。

补充定义 2

对于任何 u, v\in (V\cup\Sigma)^{*}, u\stackrel{*}{\Rightarrow} v(或 u\Rightarrow\Rightarrow v\, 在某些教科书中),如果 \exists u_{1}, u_{2}, \cdots u_{k}\in (V\cup\Sigma)^{*}, k\geq 0 使得 u\Rightarrow u_{1}\Rightarrow u_{2}\cdots\Rightarrow u_{k}\Rightarrow v

补充定义 3

文法 G = (V\,, \Sigma\,, R\,, S\,) 的语言是集合

L(G) = \{ w\in\Sigma^{*} : S\stackrel{*}{\Rightarrow} w\}

补充定义 4

语言 L\, 被称为是上下文无关语言(CFL),如果存在一个 CFG G\, 使得 L\,=\,L(G)

范式

每一个不生成空串的上下文无关文法都可以转化为等价的 Chomsky 范式或 Greibach 范式。这里两个文法等价的含义指它们生成相同的语言。

由于 Chomsky 范式在形式上非常简单,所以它在理论和实践上都有应用。比如,对每一个上下文无关语言,我们可以利用 Chomsky 范式构造一个多项式算法,用它来判断一个给定字串是否属于这个语言(CYK算法)。

转载于:https://www.cnblogs.com/javaleon/p/4103811.html

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

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

相关文章

centos 安装mysql时错误unknown variable #39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf#39;...

找到my.cnf所在目录。运行 chmod 664 my.cnf,再启动mysql成功

p5js可以在linux上运行吗,在linux上使用python运行phantomjs

我跟随this link,现在当我输入phan然后输入tab(\t)时,它会自动完成幻影JS。在但是,如果我运行phantomJS -v或phantomJS --version,我得到:bash: /usr/local/bin/phantomjs: /lib/ld-linux.so.2: bad ELF interpreter: …

使用Instant Client配置PL/SQL Developer

之前使用PL/SQL Developer都是直接在本机安装完整版的Oracle Database,一是省事,二是可以在本机做一些demo测试;最近换了台电脑,感觉Instant Client更简单一些,分分钟配好。 先下载Instant Client,注意&…

linux脚本转换exe,Ps1 To Exe(powershell脚本转换EXE工具) V3.0.6 官方版

Ps1 To Exe是款将PowerShell脚本转换为EXE可执行文件的软件。同时软件非常小巧,功能实用,软件还支持各国的语言,有需要的小伙伴们不要错过了。(点击图片查看高清大图)【软件特色】1、Ps1 To Exe 支持多种语言2、Ps1 To Exe使用简单&#xff0…

标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用

预处理&#xff1a;也就是包括须要的头文件&#xff0c;用#include<标准头文件>或#include "自己定义的头文件"宏定义&#xff0c;如&#xff1a;#define PI 3.1415926查看用宏定义的值替换宏名称,如&#xff1a;gcc -E test.c带參数的宏&#xff1a;MAX(x,y) …

java数据结构系列——排列(2):有序阵列

package Array;/*** 对数组排序。当添加到阵列保持有序数组元素&#xff1b;* author wl**/ public class MyOrderArray {private long array[];private int elements;//用于记录数组中实际数据的个数public MyOrderArray(){arraynew long[50];//数组默认长度为50&#xff1b;}…

NSString 练习

//将“⽂文艺⻘青年”改成“213⻘青年”。 NSString *str "文艺青年"; NSString *str1 [str stringByReplacingOccurrencesOfString:"文艺" withString:"213"]; NSLog("%",str1); //将 整数123 转换为字符串“123”。 NSString *s …

安全市场五巨头将面临新兴厂商的挑战

赛门铁克、思科、IBM、Check Point、英特尔&#xff0c;警钟已敲响~ 2016年同比增长率11.5%的数据出台之后&#xff0c;市场研究公司科技商业研究(TBR)为来年的安全行业绘制了一幅崭新的蓝图——安全市场上现有的企业将受到新兴厂商的挑战。 展望未来&#xff0c;现有安全市场五…

linux编译运行build.sh,linux下libwebsockets编译及实例

最近想自己搭建一个webscoket协议的服务器&#xff0c;打算用libwebsockts这个库。下载代码编译。编写一个shell脚本#!/bin/sh# wget http://git.warmcat.com/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.4-chrome43-firefox-36.tar.gz# tar xvzf libwebsockets-1.4-…

Tomcat如何配置环境变量

1&#xff0c; JDK&#xff1a;版本为jdk-7-windows-i586.exe 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2&#xff0c;tomcat&#xff1a;版本为apache-tomcat-7.0.33-windows-x86.zip 下载地址&#xff1a;http://tomcat.apache.org/ 2…

eclipse常用快捷键——非常实用

1、eclipse 查看变量或方法被调用的快捷键如下&#xff1a; &#xff08;1&#xff09;双击选中变量或者方法&#xff08;2&#xff09;键盘上CtrlshiftG组合键 2、eclipse中查看接口实现类快捷键 先找到接口类打开,然后双击接口名选中,再按住ctrlT就可以了。 3、eclipse中全局…

反编译查看源码dex2jar

为什么80%的码农都做不了架构师&#xff1f;>>> 上次说到了用apktool反编译&#xff0c;这次我们来用dex2jar 把apk解压得到文件夹 文件夹打开看到这些文件 其中这个classes.dex就是这次需要用到的字节码文件 把这个字节码文件托到dex2jar目录里 命令行编辑 得到下…

linux命令验证sqlldr,Linux:sqlldr命令

第一步&#xff1a;写一个 ctl格式的控制文件CTL 控制文件的内容 &#xff1a;load data --1. 控制文件标识infilexxx.txt --2. 要导入的数据文件名insert into table test--3. 将文件插入到数据库的 test 表中fields terminated by X09 --4. 用于分割一行中各个属性值的符号(例…

STL 中的链表排序

一直以来学习排序算法&#xff0c; 都没有在链表排序上下太多功夫&#xff0c;因为用得不多。最近看STL源码&#xff0c;才发现&#xff0c;原来即使是链表&#xff0c;也能有时间复杂度为O(nlogn)的算法&#xff0c; 大大出乎我的意料之外&#xff0c;一般就能想到个插入排序。…

cmd更换编码类型

chcp 65001 UTF-8 65001 GBK 936 本文出自 “曾颐楠的播客” 博客&#xff0c;请务必保留此出处http://zengyinan.blog.51cto.com/9524976/1721475 转载于:https://www.cnblogs.com/zengyinanos/p/5042732.html

代码混淆之后定位线上bug

代码混淆的目的 代码混淆的目的是防止竞争对手通过反编译来阅读项目代码。 Android中通过ProGuard来做代码混淆&#xff08;当然也还有其他的产品可以做代码混淆&#xff09;。 bug日志反混淆 资料&#xff1a;错误log、mapping.txt 异常log&#xff1a; mapping.txt&#xff…

linux怎么切换不同版本的r,在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3

在linux中用同一个版本的R 同时安装 Seurat 2 和 Seurat 3Seurat 作为单细胞分析中的重量级R包&#xff0c;有多好用用&#xff0c;用过的人都知道。Seurat 分析流程基本涵盖了单细胞分析中的所有常见分析方法&#xff0c;包括filtering&#xff0c;tSNE&#xff0c;UMAP降维及…

Unity手游之路四3d旋转-四元数,欧拉角和变幻矩阵

http://blog.csdn.net/janeky/article/details/17272625 今天我们来谈谈关于Unity中的旋转。主要有三种方式。变换矩阵&#xff0c;四元数和欧拉角。 定义 变换矩阵可以执行任意的3d变换&#xff08;平移&#xff0c;旋转&#xff0c;缩放&#xff0c;切边&#xff09;并且透视…

本地通知

本地通知&#xff0c;local notification&#xff0c;用于基于时间行为的通知&#xff0c;比如有关日历或者todo列表的小应用。另外&#xff0c;应用如果在后台执行&#xff0c;iOS允许它在受限的时间内运行&#xff0c;它也会发现本地通知有用。比如&#xff0c;一个应用&…

Redux 并不慢,只是你使用姿势不对 —— 一份优化指南

原文地址&#xff1a;Redux 并不慢&#xff0c;只是你使用姿势不对 —— 一份优化指南原文作者&#xff1a;Julian Krispel译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;github.com/xitu/gold-m…译者&#xff1a;reid3290校对者&#xff1a;sunui&#xff0c;xek…