Chomsky类型3和Chomsky类型2语法之间的区别

时间:2012-07-18 19:57:29

标签: regular-language context-free-language chomsky-hierarchy

我无法阐明乔姆斯基类型2(无上下文语言)和乔姆斯基类型3(常规语言)之间的区别。

有人可以用简单的英语给我一个答案吗?我无法理解整个层次结构的事情。

3 个答案:

答案 0 :(得分:14)

Type II语法是一种带有堆栈的Type III语法

Type II语法基本上是一种带有嵌套的Type III语法。

III型语法(常规):

用例 - CSV(逗号分隔值)

特性:

    可以使用FSM(有限状态机)读取
  • 不需要中间存储
  • 可以使用正则表达式阅读
  • 通常使用1D或2D数据结构表示
  • 是平的,意味着没有嵌套或递归属性

前:

this,is,,"an "" example",\r\n
"of, a",type,"III\n",grammar\r\n

只要您能够找出上述文本的所有规则和边缘情况,您就可以解析CSV。

II型语法(无上下文):

用例 - HTML(超文本标记语言)或一般的SGML

特性:

  • 可以使用DPDA(确定性下推自动机)
  • 读取
  • 将需要一个用于中间存储的堆栈
  • 可以表示为AST(抽象语法树)
  • 可能包含嵌套和/或递归属性

HTML可以表示为常规语法:

<h1>Useless Example</h1>
<p>Some stuff written here</p>
<p>Isn't this fun</p>

但它尝试使用FSM解析它:

<body>
  <div id=titlebar>
    <h1>XHTML 1.0</h1>
    <h2>W3C's failed attempt to enforce HTML as a context-free language</h2>
  </div>
  <p>Back when the web was still pretty boring, the W3C attempted to standardize away the quirkiness of HTML by introducing a strict specification</p
  <p>Unfortunately, everybody ignored it.</p>
</body>

看到区别?想象一下,你正在编写一个解析器,你可以从一个开放的标签开始并完成一个结束标签,但是当你在到达结束标签之前遇到第二个开始标签时会发生什么?

很简单,您将第一个开始标记推送到堆栈并开始解析第二个标记。对存在的嵌套级别重复此过程,如果语法结构良好,则可以在与构建它相反的级别一次取消一个层的堆栈

由于“纯”无上下文语言的严格性,除非它们是由程序生成的,否则它们相对较少。 JSON是一个很好的例子。

无上下文语言的好处在于,虽然非常富有表现力,但它们仍然相对简单易于解析。


但是等等,我不是说HTML是无上下文的。是的,如果它是格式良好的(即XHTML)。

虽然XHTML可以被认为是无上下文的,但是宽松定义的HTML实际上会考虑类型I(即上下文敏感)。原因是,当解析器到达结构不良的代码时,它实际上会根据周围的上下文决定如何解释代码。例如,如果一个元素缺少其结束标记,则需要确定该元素在层次结构中的位置,然后才能确定结束标记的放置位置。

可以使上下文无关语言上下文相关的其他功能包括模板,导入,预处理器,宏等。

简而言之,上下文相关语言看起来很像上下文无关语言,但上下文相关语言的元素可能会根据程序状态以不同方式解释。

免责声明:我没有在CompSci接受过正式培训,所以这个答案可能包含错误或假设。如果你问我终端和非终端之间的区别,你会得到一个空白的凝视。我通过实际构建一个Type III(Regular)解析器并通过阅读其余部分来了解这一点。

答案 1 :(得分:6)

wikipedia page有很好的图片和要点。

粗略地说,可以描述常规语言的底层机器不需要内存。它在输入上作为状态机(DFA / NFA)运行。常规语言也可以用正则表达式表达。

添加了“下一个”复杂程度的语言是一种无上下文语言。描述这种语言的底层机器将需要一些内存来表示无上下文且不规则的语言。请注意,向计算机添加内存会使其更强大,因此它仍然可以表达不需要内存的语言(例如常规语言)。底层机器通常是push-down automaton

答案 2 :(得分:5)

类型3语法由一系列状态组成。他们不能表达嵌入。例如,Type 3语法不能要求匹配括号,因为它无法显示括号应该“包裹”其内容。这是因为,正如Derek指出的那样,Type 3语法不会“记住”任何有关它通过以前进入当前状态的状态的信息。

Type 2语法包含一组“制作”(您可以将它们视为模式),其中可以嵌入其他制作。因此,它们是递归定义的。生产只能根据其包含的内容来定义,并且不能在其自身之外“看到”;这就是语法无上下文的原因。