常规vs上下文免费语法

时间:2009-02-18 03:46:41

标签: context-free-grammar regular-language automata

我正在学习我的计算语言测试,并且有一个想法我遇到了问题。

我知道常规语法更简单,不能包含歧义,但不能完成编程语言所需的大量任务。我也理解无上下文语法允许歧义,但允许编程语言(如回文)所需的一些东西。

我遇到的问题是通过了解常规语法非终结符可以映射到终端或非终结符后跟终端或上下文 - 来理解我如何得出以上所有内容免费的非终端映射到终端和非终端的任何组合。

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

8 个答案:

答案 0 :(得分:66)

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

因此,对于回文,例如,形式为

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

您可以清楚地看到,回文不能用常规语法表达,因为它需要是正确的或左对齐的,因此两侧都不能有非终端。

由于常规语法是非模糊的,因此给定的非终端只有一个生成规则,而在无上下文语法的情况下可以有多个生成规则。

答案 1 :(得分:52)

我认为你想要考虑的是各种抽水法。常规语言可以通过有限自动机识别。无上下文语言需要堆栈,而上下文敏感语言需要两个堆栈(这相当于说它需要一个完整的图灵机。)

所以,如果我们考虑pumping lemma for regular languages,它本质上说的是,任何常规语言都可以分为三个部分, x y ,和 z ,其中语言的所有实例都在 xy * z 中(其中*是Kleene重复,即0或更多 y <的副本/ em>。)你基本上有一个可以扩展的“非终结”。

现在,无上下文语言怎么样?有一个类似的pumping lemma for context-free languages将语言中的字符串分成五个部分, uvxyz ,并且语言的所有实例都在 uv i xy中 i z ,对于i≥0。现在,只要你有两个“非终结”,可以复制或抽取相同的数字

答案 2 :(得分:13)

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

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

●abc

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

●根据生产规则替换为终端符号组

●ABC

常规语法:正确或左边的常规语法 正确的常规语法,所有规则都遵循表格

  1. B→a其中B是N中的非终结符,a是Σ
  2. 中的终端
  3. B→aC,其中B和C在N中,a在Σ
  4. B→ε其中B为N,ε表示空字符串,即长度为0的字符串
  5. 保留常规语法,所有规则都遵循表格

    1. A→a其中A是N中的非终结符,a是Σ
    2. 中的终结符
    3. A→Ba,其中A和B在N中,a在Σ
    4. A→ε其中A是N,ε是空字符串
    5. 上下文无关语法(CFG)

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

      ○V是单个非终结符号

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

答案 3 :(得分:6)

正则表达式

  • 词法分析的基础
  • 代表常规语言

Context Free Grammars

  • 解析的基础
  • 代表语言结构

enter image description here

答案 4 :(得分:4)

常规语法: - 包含生产的语法如下:RG:

V->TV or VT
V->T

其中V =变量,T =终端

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

我们知道所有RG都是线性语法,但只有左线性或右线性语法是RG。

常规语法可能含糊不清。

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

模糊语法: - 对于字符串x,它们存在多个LMD或超过RMD或多个Parse树或一个LMD和一个RMD,但两者都产生不同的Parse树。

                S                   S

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

这个语法是模棱两可的语法,因为有两个解析树。

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永远不会含糊不清。

答案 5 :(得分:3)

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

答案 6 :(得分:-1)

基本上,常规语法是上下文无关语法的子集,但我们不能说Every Context自由语法是一种常规语法。主要是上下文无关语法含糊不清,常规语法可能含糊不清。

答案 7 :(得分:-4)

常规语法从不模糊,因为它要么是线性的要么是线性的,所以我们不能为常规语法做出两个决策树,所以它总是明确的。但是除了常规语法之外,所有的都可能是也可能不是常规的