50

阅读一些 相关 问题让我想到了 HTML 的理论性质。

我在这里不是在谈论类似 XHTML 的代码。我说的是这种疯狂的标记之类的东西,它是完全有效的 HTML(!)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html<head>
<title//
<p ltr<span id=p></span</p>
</>

那么考虑到 SGML 在这里注入的巨大复杂性,HTML 是一种上下文无关的语言吗?无论如何,它是一种正式的语言吗?有语法吗?

HTML5 怎么样?

我是正式语言概念的新手,所以请多多包涵。是的,我已经阅读了维基百科的文章;)

4

4 回答 4

59

上下文无关是语言理论中的一个概念,它在解析器实现中具有重要意义。上下文无关语言可以用上下文无关语法来描述,其中所有规则在箭头左侧都有一个非终结符:

X→δ

这个简单的限制允许X用出现在左侧的规则的右侧代替,而不管之前或之后发生了什么。例如,如果在派生或解析时到达:

αXλ 

可以肯定的是

αδλ

也是有效的。非上下文无关规则的示例是:

XY→δ
Xa→δ
aX→δ

那些需要知道什么可以派生X来确定规则是否适用,这会导致不确定性(周围的东西X也想知道它的派生结果),这是解析中的禁忌,无论如何我们希望一种语言被明确定义。

证明一种语言是上下文无关的唯一方法是证明它有一个上下文无关的语法,这不是一件容易的事。大多数出现的编程语言都已经被 CFG 描述了,所以这项工作就完成了。但是还有其他语言,包括编程语言,是用逻辑或简单的英语描述的,因此需要努力找出它们是否是上下文无关的。

对于 HTML,其上下文自由的答案是肯定的。SGML 是一种定义良好的上下文无关语言,在它之上定义的 HTML 也是一种 CFL。两种语言的解析器和语法在 Web 上比比皆是。无论如何,存在有效HTML 的 LL(k) 语法足以证明该语言是上下文无关的,因为 LL 是 CF 的一个已证明子集。

但是 HTML 在 Web 生命周期中的演变方式迫使浏览器将其视为定义不明确。现代 Web 浏览器会不遗余力地尝试从他们发现的几乎任何东西中呈现出一些有意义的东西。他们使用的语法不是 CFG,而且解析器比 SGML/HTML 所需的要复杂得多。

HTML 是在多个级别定义的。

  1. 在词汇级别,有有效字符、标识符、字符串等的规则。
  2. 下一层是 XML,它由<tags>定义分层文档结构的打开和关闭组成。您可以将 XML 或类似 XML 的东西用于任何目的,例如Apache Ant构建脚本。
  3. 下一层是在 HTML 中有效的标签,以及关于哪些标签可以嵌套在哪些标签中的规则。
  4. 下一层是关于哪些属性对哪些标签有效的规则,可以嵌入 HTML 中的语言,如 CSS 和 JavaScript。
  5. 最后,您有关于给定 HTML 文档含义的语义规则。

句法部分定义得很好,可以验证。语义部分比句法部分大得多,并且根据有关 HTTP 的浏览器操作、文档对象模型(DOM) 以及模型应如何呈现到屏幕上来定义。

到底:

  1. 解析正确的 HTML 非常容易(它是上下文无关的和 LL/LR)。
  2. 解析 Web 上实际存在的 HTML 是很困难的。
  3. 在 HTML/CSS/DOM 上实现语义(浏览器)非常困难。
于 2011-03-06T00:02:33.347 回答
14

有效的 HTML 不是上下文无关的语言。

首先,HTML 作为 SGML 的一种应用,对于所有实际目的来说都是虚构的,所以分析 SGML 来回答这个问题是没有用的。(然而,SGML 小说可能也不是上下文无关的。)

查看实际定义的 HTML 解析算法更有用。它在两个级别上工作:标记化和树构建。HTML 所称的标记化是比在谈论解析器时通常称为标记化的更高级别的操作。在 HTML 的情况下,标记化将字符流拆分为开始标记、结束标记、注释和文本等单元。标记器扩展字符引用。通常,在谈论解析器时,您可能会将小于号之类的东西视为“标记”,并认为字符引用由标记组成,而不是由标记器解析。

如果您考虑将输入流拆分为标记的过程,那么 HTML 语言的该级别是常规的(来自树构建器的反馈除外)。

但是,存在三个复杂性:第一个是将输入流拆分为令牌只是第一个,然后是树构建器的一方,它实际上关心令牌中的标识符。第二个是树构建器反馈给分词器,以便分词器进行的一些状态转换取决于树构建器的状态!第三个是该语言中的有效文档由适用于树构建器阶段的输出的规则定义,并且这些规则足够复杂,无法使用树自动机完全定义(RELAX NG 没有表现力就证明了这一点足以描述所有的有效性约束)。

这不是一个实际的证明,但您可能可以通过处理复杂性 #2 和 #3 来开发真正的证明。

请注意,无效文档的情况并不是特别有趣,因为该语言是否是上下文无关的,因为存在上下文无关语法,它生成所有可能的字符串,而不考虑具有一些可理解解释的分析树就 HTML 解析器生成的树而言。HTML 解析器将成功使用所有可能的字符串,因此从这个意义上说,所有可能的字符串都是“无效的 HTML”语言。

编辑:留给读者作为练习的有趣问题:

没有解析错误但忽略有效性的 HTML 是一种上下文无关的语言吗?

没有解析错误并忽略一般有效性但只有有效元素名称的 HTML 是否允许使用上下文无关语言?

(并发症 #2 在这两种情况下都适用。)

于 2013-03-06T10:27:56.423 回答
11

请参阅下面的编辑

这取决于。

如果您谈论的是仅包含理论 HTML 的子集,那么的。

如果您还包括现实生活中的工作 HTML,每天有数百万人在 Internet 上的许多顶级网站上成功访问和使用,那么NO

这就是赋予 HTML 灵活性的原因。解析引擎添加标签、关闭标签,并处理理论上 CFG 无法完成的事情。如果您使用自动机,您可能会记得形式语法中的生产规则在 lhs(左侧)上不能为空(又名 epsilon/lambda)。由于解析引擎基本上使用了形式语法和自动机所没有的知识,因此它不受此限制,并且“语法”将epsilon/lambda -> result根据语法中不可用的信息选择特定的 epsilon/lambda 规则.

由于我认为任何形式语法都不允许空 lhs,因此 HTML 不能由形式语法定义,并且根本不是形式语言。

当然,HTML5 可能会尝试转向“更正式”的语言描述,但它成为现实中无上下文语言的可能性(即与语法不匹配的字符串被拒绝)与 XHTML 2.0 席卷世界的可能性有关完全取代了 HTML(XHTML 是他们试图使 HTML 成为一种正式语言的尝试……由于其脆弱性而被集体拒绝)。

值得注意的是,HTML 5 是第一个在实施之前定义的 HTML 标准!没错,HTML 1-4 由一些刚刚在浏览器中实现的随机想法组成,并在基于哪些特性被广泛使用和广泛实现之后被收集到标准中。然后他们尝试了XHTML,完全没有被采用。甚至网络上的“xhtml”在几乎所有情况下都会自动解析为 HTML,以防止内容因神秘的语法错误而中断。现在你可以看到我们是如何到达这里的,以及为什么它不太可能很快正式化。

教训:“理论上,理论和实践没有区别。实践中,有区别。” - 瑜伽士贝拉

编辑:

实际上,通读文档后发现,即使根据 HTML 4.01 规范,HTML 实际上并不符合 SGML。要亲自查看,请查看http://www.w3.org/TR/html4/strict.dtd上的 HTML 4.01 Strict 文档类型定义 (doctype)并注意以下几行:

HTML 4.01 规范包括不能在 DTD 中表达的附加句法约束。

所以我想说,由于这些特性,它可能不是 CFL(尽管从技术上讲,它并没有反驳存在一些可能的 PDA 接受 HTML 4.01 的假设,但它确实阻止了 SGML 是 CFL 因此 HTML 是节能灯)。

HTML5 触发器,放弃任何对 SGML 的隐含一致性,但大概可以由 CFG 描述。然而,它仍然会提供不基于 cfg 的尽力而为解析,因此 IMO 在这方面的当前情况(即语言规范已正式定义,无效字符串仍被接受、解析和呈现)在这方面不太可能在很长很长很长时间内发生巨大变化。

于 2011-11-24T06:40:53.993 回答
5

HTML5 与以前的 HTML 版本不同,它严格定义了不完全正确的代码的解析行为。HTML5 之前的解析器各不相同,每个解析器都尽力“猜测”代码作者的意图。

于 2011-03-03T02:11:56.160 回答