HTML是一种上下文无关的语言?
读一些 相关的 问题使我想到了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呢?
我对forms语言的概念很陌生,所以请耐心等待。 是的,我已阅读维基百科的文章;)
上下文无关是语言理论中的一个概念,对parsing器实现有重要的意义。 上下文无关语言可以用上下文无关语法来描述, 上下文无关语法是所有规则在箭头左边都有一个非terminal符号的语法 :
X→δ
这个简单的限制允许X
被左边出现的规则的右边代替,而不考虑之前或之后出现的规则。 例如,如果派生或parsing一个到达:
αXλ
一个是肯定的
αδλ
也是有效的。 非上下文无规则的例子是:
XY→δ Xa→δ aX→δ
那些将需要知道什么可能是派生X
周围,以确定是否适用一个规则,并导致非确定性( X
周围是什么也想知道它是如何派生的),这是一个不分析,并在任何情况下,我们想要一个语言是明确的。
certificate一种语言无上下文的唯一方法就是certificate它有一个上下文无关的语法,这不是一件容易的事情。 大多数编程语言都是由CFG描述的,所以工作就完成了。 但是还有其他语言,包括编程语言,使用逻辑或简单的英语来描述,所以需要工作来发现它们是否是上下文无关的。
对于HTML,关于其上下文自由的答案是肯定的。 SGML是一个定义良好的上下文无关语言,在其上定义的HTML也是一个CFL。 networking上的parsing器和两种语言的语法比比皆是。 无论如何, 存在 有效 HTML的LL(k)语法足以certificate该语言是上下文无关的,因为LL是CF的一个certificate子集。
但是,HTML在networking生命周期中演变的方式迫使浏览器将其视为不太明确。 现代的networking浏览器将竭尽全力去尝试从他们发现的任何东西中展现一些明智的东西。 他们使用的语法不是CFG,parsing器比SGML / HTML所需的语法复杂得多。
HTML是在几个层次上定义的。
- 在词汇层面,有有效的字符,标识符,string等的规则。
- 在下一层是XML,它由定义分层文档结构的开始和结束
<tags>
组成。 您可以使用XML或类似XML的任何用途,如Apache Ant
用于构build脚本。 - 在下一个层次中,HTML中有效的标签以及哪些标签可以嵌套在哪些标签中。
- 在下一个层次上,关于哪些属性对于哪些标签是有效的,哪些语言可以像HTML和JavaScript一样embedded到HTML中。
- 最后,你有关于给定的HTML文档的含义的语义规则。
句法部分被定义得足够好,可以被validation 。 语义部分比语法部分大得多,并且根据关于HTTP的浏览器动作和文档对象模型 (DOM)以及如何将模型呈现给屏幕来定义。
到底:
- parsing正确的HTML是非常容易的(这是上下文无关和LL / LR)。
- parsingWeb上实际存在的HTML是很困难的。
- 通过HTML / CSS / DOM实现语义(浏览器)是非常困难的。
有效的HTML不是上下文无关的语言。
首先,作为SGML应用的HTML是所有实际用途的虚构,因此分析SGML来回答这个问题是没有用的。 (但是,SGML小说可能也不是上下文的)。
查看实际定义的HTMLparsingalgorithm更有用。 它在两个层面上工作:标记化和树build立。 在讨论parsing器时,HTML调用标记化是比通常所称的标记化更高级别的操作。 在HTML的情况下,标记化将字符stream分成开始标记,结束标记,注释和文本等单位。 标记器展开字符引用。 通常,在讨论parsing器时,可能会将诸如“小于号”之类的东西视为“标记”,并将字符引用视为由标记组成,而不是由标记器parsing。
如果考虑将inputstream拆分为令牌的过程,那么HTML语言的这个级别是规则的( 除了树生成器的反馈)。
然而,有三个复杂的问题:第一个是将inputstream分解为令牌只是第一个,然后树实际上关心标记中的标识符。 第二个是树生成器反馈到标记器,以便由标记器进行的一些状态转换取决于树生成器的状态! 第三个是语言中的有效文档由适用于树木构build器阶段输出的规则来定义,并且这些规则足够复杂以至于不能使用树自动机来完全定义它们(如RELAX NG不expression的足以描述所有的有效性约束)。
这不是一个真正的证据,但是你可以通过并发症#2和#3来开发真正的证据。
请注意,无效文档的情况并不特别有趣,因为语言在没有上下文无关语法的情况下是否是上下文无关语法,而不考虑具有一些可理解的解释的分析树而生成所有可能的string就HTMLparsing器生成的树而言。 HTMLparsing器将成功消耗所有可能的string,所以从这个意义上说,所有可能的string都是“无效的HTML”语言。
编辑:有趣的问题作为练习留给读者:
HTML没有parsing错误,但忽略了一个上下文无关语言的有效性?
HTML没有parsing错误,忽略了一般有效性,但只有有效的元素名称允许上下文无关的语言?
(并发症#2适用于这两种情况。)
没有
见下面的编辑
这取决于。
如果你正在谈论的只是理论HTML组成的子集,那么是的 。
如果你还包括真实的生活,那么在互联网上的许多顶级网站上每天都有数百万人成功地访问和使用HTML。
这就是HTML的灵活性。 parsing引擎添加标签,closures标签,并照顾理论CFG无法做的事情。 如果你采用自动机,你可能会记得,正式语法中的生产规则在lhs(左边)上不能是空的(又名epsilon / lambda)。 由于parsing引擎基本上使用forms语法和自动机所不具备的知识,所以“语法”将具有epsilon/lambda -> result
,其中特定的epsilon / lambda规则是基于信息在语法中不可用。
由于我不认为任何正式的语法都允许使用空格,所以HTML不能用正式的语法来定义,也不是一种正式的语言。
当然,HTML5可能试图走向一种“更正式的”语言描述,但其实际上成为上下文无关语言的可能性(即不被语法匹配的string被拒绝)是关于XHTML 2.0风雨世界的可能性和全部replaceHTML(XHTML是他们为了使HTML成为一种正式语言所做的尝试……由于其脆弱性而被拒绝)。
值得注意的是,HTML 5是在实施之前定义的第一个HTML标准! 没错,HTML 1-4包含了一些刚刚在浏览器中实现的随机想法,并根据哪些function被广泛使用和广泛实施,被收集到标准中。 然后他们尝试了XHTML,这完全没有被采纳。 即使网页上的“xhtml”在几乎每种情况下都会自动被parsing为HTML,以防止某些东西被一个隐含的语法错误打破。 现在你可以看到我们是如何到达这里的,为什么不可能在短期内形成规范。
教训:“从理论上说,理论与实践没有区别,实际上是存在的。” – 瑜珈Berra
编辑:
实际上,通过阅读文档后发现,即使根据HTML 4.01规范,HTML实际上也不符合SGML。 要亲自查看,请查看http://www.w3.org/TR/html4/strict.dtd中的HTML 4.01 Strict文档types定义(doctype),并注意以下几行:
HTML 4.01规范包含了无法在DTD中expression的附加语法约束。
所以我想说,这可能不是一个CFL由于这些function(虽然它从技术上说并不反驳假设,有一些可能的PDA接受HTML 4.01,它确实阻止了SGML是一个CFL的论据,因此HTML是CFL)。
HTML5触发器放弃了对SGML的任何暗示的一致性 ,但大概是由CFG描述的。 然而,它仍然会提供不基于cfg的尽力而为的parsing,因此IMO目前的情况(即语言规范是正式定义的,无效的string仍然被接受,parsing和呈现在尽力而为的方式)在这方面是不太可能的变化很大,很长很长一段时间。
HTML5不同于以前的HTML版本,因为它严格定义了不完全正确的代码parsing行为。 HTML5以前的parsing器各不相同,他们都尽力“猜测”代码作者的意图。