上下文无关文法

✍ dations ◷ 2025-08-22 22:00:18 #上下文无关文法

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

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

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

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

这里的

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

补充定义 1

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

补充定义 2

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

补充定义 3

文法 G = ( V , Σ , R , S ) {displaystyle G=(V,Sigma ,R,S)} 的语言是集合

补充定义 4

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

一个简单的上下文无关文法的例子是:S -> aSb | ab 。这个文法产生了语言 {anbn : n ≥ 1} 。不难证明这个语言不是正则的。

这个例子可以产生变量 x,y,z 的算术表达式:

例如字符串 "( x + y ) * x - z * y / ( x + x )" 就可以用这个文法来产生。

字母表 {a,b} 上 a 和 b 数目不相等的所有字符串可以由下述文法产生:

这里 T 可以产生 a 和 b 数目相等的所有字符串,U 可以产生 a 的数目多于 b 的数目的所有字符串, V 可以产生 a 的数目少于 b 的数目的所有字符串。

在推导的任何一步α=> β中,都是对α中的最左边非终结符进行替换。如文法:

那么最左推导为:

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

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

相关

  • 头孢克肟头孢克肟(Cefixime)是一种口服的第三代头孢菌素抗生素,通常用于治疗淋病、扁桃腺炎和咽炎。常用剂量为400毫克。头孢克肟在美国以“Suprax”的名称发售,直到2003年,当它的专利失
  • 陷入胶着波罗的海 – 黑海 – 北极 – (跳马 – PQ-17船团 – 仙境)1941年巴巴罗萨 – (比亚韦斯托克及明斯克 – 斯摩棱斯克 – 乌曼 – 列宁格勒 – 第一次基辅 – 塞瓦斯托波尔围
  • 水原秋樱子水原秋樱子(日文:水原 秋桜子、1892年10月9日-1981年7月17日)日本俳人、医学博士,本名水原丰。出生于东京市神田区猿乐町(现东京都千代田区神田猿楽町)代代经营妇产科医院的家庭。1
  • 内行厂内行厂又称内厂、内办事厂,明朝厂卫之一。明武宗正德初年宦官刘瑾设立,设于在北京荣府旧仓地,也就是四司之一的惜薪司,侦缉范围比锦衣卫、东厂和西厂三个特务机构还要大,除监察臣
  • 周行健周行健(1895年-1986年),又名周承乾,江西广丰人,中国冶金学家与冶金材料学家。早年毕业于江西省立第二中学校,1916年考入南京高等师范学校工艺专修科,1919年毕业。毕业后由周仁举荐,先
  • 姜一学姜一学(?-17世纪),字元弢,号巢云,山东济南府滨州人,明朝、南明政治人物。天启七年(1627年)举人,崇祯四年(1631年)成进士,授行人司行人,转兵部武选司主事。弘光时,升兵部员外郎,和朱芾煌、吴国
  • 范讽范讽(?-?),字补之,齐州(今山东省济南市)人,历北宋宋真宗赵恒及宋仁宗赵祯二朝,赵祯年间任龙图阁直学士。其父范正辞在宋太宗赵炅年间任侍御史知杂事,有兄弟范识为进士,其子范宽之官至尚
  • 爱德华·阿纳托利耶维奇·斯特列尔佐夫爱德华·阿纳托利耶维奇·斯特列尔佐夫(俄语:Эдуа́рд Анато́льевич Стрельцо́в,转写:Eduard Anatolyevich Streltsov,1937年7月21日-1990年7月22日),
  • 陈世恩陈世恩,字庆远,号两峰,河南归德府夏邑县人。明朝政治人物、进士出身。万历七年(1579年)己卯科举人,十七年(1589年)己丑科进士,授保定府推官,报最第一,行取户科给事中,转右给事中,进左。屡
  • 星系群星系群是约少于50个星系左右,因为重力的拘束而聚集在一起的集团;拥有更多星系的集团则称为星系团。我们的银河属于被称为本星系群的成员。 星系群是最小的星系集合体,它们拥有