上下文無關文法

在計算機科學中,若一個形式文法?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.pswp.cn/news/257987.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257987.shtml
英文地址,請注明出處:http://en.pswp.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…