常规与上下文无关文法


96

我正在为我的计算语言测试而学习,并且有一个主意我无法解决。

我知道常规语法更简单,不能包含歧义,但是不能完成编程语言所需的许多任务。我还了解到,无上下文语法允许模棱两可,但是允许编程语言(例如回文集)需要一些必要的东西。

我遇到的麻烦是,通过了解常规语法非终结符可以映射到一个终端或一个非终结符,然后再一个终结符,或者上下文无关的非终结符可以映射到终端和非终结符的任何组合,来理解上述所有方法。

有人可以帮我把所有这些放在一起吗?

Answers:


70

规则语法是右线性的或左线性的,而上下文无关的语法基本上是末尾和非末尾的任何组合。因此,您可以看到常规语法是无上下文语法的子集。

例如,对于回文式来说,

S->ABA
A->something
B->something

您可以清楚地看到回文式不能以规则的语法表示,因为它必须是左右线性的,因此不能在两面都具有非终结符。

由于规则语法是无歧义的,因此对于给定的非终结式语法只有一条生产规则,而在无上下文语法的情况下可以有多个规则。


13
第一:常规语法可能是模棱两可的(例如,来自Kai Kuchenbecker的示例:S-> aA | aB,B-> a,A-> a)。唯一的事情是,语法树中的节点只有一种定位方式(例如,使用常规语法时,不存在关联歧义性)。第二:非终结
符的

1
当一个句子可以从一个以上的派生路径中从语法中派生出来时,就会产生歧义。仅仅对一个非终结

11
这个例子实际上是错误的。如果我们想像完整的规则A-> a | cB->b那么该语法将允许使用非回文法。例如,我可以产生:S->ABA->aBA->abA->abc。问题是我们不想在第一条规则中产生两个变量,而是两个终端。允许回文的语法的可能性是:S -> aSa | bSb | a | b
gdiazc 2014年

可以用常规语法表达的回文集:由单个字符组成的回文集。例如,S -> aSa | e并且a(aa)*a都描述了常规语言。这表明CFG可以描述常规语言,即使它违反了左右线性关系。诚然,这是一个不那么明显的回文..
马亭

试想一下,这个答案实际上是错误的。它说“无上下文”语法基本上是终端和非终端的任何组合。”然而,tu ^ nvw ^ mxy ^ kz是终端和非终端的组合,但不是上下文无关的
Charlie Martin

58

我认为您想考虑的是各种抽油烟。普通语言可以通过有限的自动机识别。上下文无关的语言需要一个堆栈,上下文相关的语言需要两个堆栈(这相当于说它需要一台完整的图灵机。)

因此,如果我们考虑常规语言抽水式引理,那么它的本质就是将任何常规语言都可以分解为三个部分xyz,其中该语言的所有实例都为xy * z(其中*是Kleene重复,即y的 0个或多个副本。)您基本上有一个可以扩展的“非终结符”。

现在,上下文无关的语言呢?对于上下文无关的语言,有一个类似的抽取引理它将语言的字符串分为五个部分uvxyz,其中语言的所有实例都在uv i xy i z中,且i≥0。现在,您有两个 “非终端” 只要您具有相同的编号,就可以复制或抽取。


10
上下文相关的语言不需要完整的图灵机。线性有界自动机就足够了。这是图灵机,其磁带是有限的,大小受输入字符串上某些线性函数的限制。
戴夫·克拉克

16

常规语法与上下文无关语法的区别: (N,Σ,P,S):终端,非终端,产生式,起始状态终端符号

●正式语法定义的语言的基本符号

●abc

非终结符号(或语法变量)

●根据生产规则,用端子符号组代替

●ABC

常规语法:右或左常规语法右常规语法,所有规则均服从形式

  1. B→a,其中B是N中的一个非终结点,而a是Σ中的一个终结点
  2. B→aC其中B和C在N中而a在Σ中
  3. B→ε其中B在N中,并且ε表示空字符串,即长度为0的字符串

离开常规语法,所有规则都服从形式

  1. A→a,其中A是N中的一个非终结点,而a是Σ中的一个终结点
  2. A→Ba,其中A和B在N中,a在Σ中
  3. A→ε,其中A在N中,而ε是空字符串

上下文无关文法(CFG)

○形式语法,其中每个生产规则的形式为V→w

○V是单个非终结符号

○w是一连串的终端和/或非终端(w可以为空)


5

常规语法:-包含产生式的语法为RG:

V->TV or VT
V->T

其中V =变量而T =终端

RG可以是左线性语法或右线性语法,但不能是中间线性语法。

众所周知,所有RG都是线性语法,但只有左线性或右线性语法才是RG。

常规语法可能是不明确的。

S->aA|aB
A->a
B->a

歧义语法:-对于一个字符串x,它们存在多个LMD或多个RMD或多个解析树或一个LMD和一个RMD,但两者都产生不同的解析树。

                S                   S

              /   \               /   \
             a     A             a     B
                    \                   \
                     a                   a

此语法之所以含糊不清,是因为两个语法分析树。

CFG:- 如果语法形式为CFG,则称为CFG:

   V->@   where @ belongs to (V+T)*

DCFL: -我们知道所有DCFL都是LL(1)语法,所有LL(1)都是LR(1),所以它永远不会模棱两可。因此DCFG永远不会模棱两可。

我们也知道所有RL都是DCFL,因此RL永远不会模棱两可。请注意,RG可能不明确,而RL可能不明确。

CFL:CFL可能会或可能不会模棱两可。

注意: RL永远不会固有地含糊。



3

如果所有生产规则都具有以下形式,则语法是上下文无关的:A(也就是说,规则的左侧只能是单个变量;右侧是不受限制的,并且可以是终端和变量的任何序列)。我们可以将语法定义为4元组,其中V是有限集(变量),_是有限集(终端),S是起始变量,R是有限规则集,每个规则都是映射V
正则语法为右线性或左线性,而上下文无关的语法基本上是最终和非最终的组合。因此我们可以说规则语法是无上下文语法的子集。在这些属性之后,我们可以说上下文无关语言集也包含常规语言集


-1

基本上,规则语法是上下文无关文法的一个子集,但是我们不能说每个上下文无关文法都是规则文法。主要是上下文无关语法是模棱两可的,而常规语法可能是模棱两可的。


-4

规则语法永远不会模棱两可,因为它要么是左线性的,要么是右线性的,所以我们不能为规则语法形成两个决策树,因此它始终是模棱两可的。但是除了规则语法之外,所有语法都可能是规则的,也可能不是规则的


4
@dinesh常规语法可能不明确。回想一下,如果存在两个不同的语法树并且标记了语法树,则语法是不明确的。因此,同构树是不同的树。即像S-> aA |这样的简单语法。aB,B-> a,A-> a是模棱两可的,因为单词'aa'存在两个同构但不同的语法树。
Kai Kuchenbecker 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.