浏览器工作方式 二 (译)

Formal definitions for vocabulary and syntax

词汇通常是使用正则表达式来表示的。举例来说,我们上述的语言可以被定义为如下:
INTEGER :0|[1-9][0-9]*
PLUS : +
MINUS: -

可以看出,数字是用正则来表示的。

句法通常是通过一种叫 BNF 的格式定义的,我们上述语言可以被定义为如下:
expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression

我们可以认为如果一个语言的语法是上下文无关语法,那么它总是可以被常规解释器解释的。上下文无关语法的一种直接定义就是可以完全由BNF表示。

Types of parsers - 解析器的类型

有两种比较常见的解析器类型: 自顶向下分析和自底向上分析。一种简单的解释是自顶向下分析是

根据形式语法规则,在语法分析树

的自顶向下展开中搜索输入符号串可能的最左推导。单词按从左到右的顺序依次使用。自底向上分析是

语法分析器从现有的输入符号串开始,尝试将其根据给定的形式语法规则进行改写,最终改写为语法的起始符号。

自底向上分析将会扫描所有输入的项一直到某条规则可以符合,然后用规则替换匹配的输入。这项工程会一直持续到输入的内容结束。已经符合了规则的部分会放入解释器堆栈中。

Stack Input
2 + 3 - 1
term + 3 - 1
term operation 3 - 1
expression - 1
expression operation 1
expression

这种自下而上的解析器称为移位減少解析器,因为输入向右移动(想想一个指针首先指向输入开始并向右移动)并逐渐转移到对应语法规则的堆栈中。

Generating parsers automatically - 自动生成解释器

有一些工具可以帮助你生成解释器,他们被叫做parser generators。你将语言语法输入进去,它会自动帮你生成一个可以使用的解释器。手工制作解释一需要非常专业的知识所以并不是一件简单的工作,这样自动生成的解释器就非常有用了。

Webkit 使用两个非常有名的自动生成工具。词法解析使用了 Flex, 解释器的生成使用了Bison....

HTML Parser - HTML 解释器

HTML解释器的工作是将HTML文件编译进解析树。

The HTML grammar definition - HTML的语法定义

W3C 阻止制定了HTML的词法和句法规范。

a context free grammar - 不是一种上下文无关语法

我们曾经讨论过大多数的时候我们都可以使用BNF 的格式定义句法,但很不幸,这并不适用于 HTML 的解析。HTML不能简单的被上下文无关语法解析器解析。正式的HTML的定义格式是DTD。

在世界上第一个网站出现的时候看起来很怪异,html文件更像是xml文件而xml文件有许许多多的解析器,XML 有一种比较接近HTML的变体XHTML,那么他们到底有什么区别呢?

那就是HTML更不严格。 有时候你漏掉了起始标签,有时候是结束标签但最后并没什么关系。 这对于苛刻的XML是一种无声的反抗。

很显然,这一点的不同造成了很大的影响。一方面开发者们更乐意使用HTML,另一方面也让HTML的解释器制作起来更加困难。也就是说,HTML不能简单的被转译。

HTML DTD

HTML是一种DTD格式的定义方法,这种格式曾经是用于定义SGML类型的语言的。这种格式对于所有可使用的元素的属性和层级关系进行定义。我们已经说过,HTML DTD不是一种上下文无关的语法。

DTD 有一些变体。过去,严格模式下要求完全符合规范而其他模式对于标签的支持依赖于浏览器的解析,目的是向下兼容。

W3C对DTD的规范定义:http://www.w3.org/TR/html4/strict.dtd

DOM

HTML的解析树是一个DOM元素和属性节点树。DOM 是 Document Object Model 的缩写。他是HTML的解析也是HTML对外的接口,比如对于JS的接口。这棵树的跟节点是 Document 对象。

DOM和HTML几乎有一一对应关系,比如:


    
        

Hello World

将会被解析为:

image.png

和HTML一样,DOM的规范也是由W3C规定的。是一个操作DOM的通用规范。W3C对此有一个详细文档,它的地址是:
http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/idl-definitions.html
当我说一颗树包括DOM节点的时候,我指的是这棵树是由有DOM接口的元素组成的。浏览器内部有他们自己的实践。

The parsing algorithm - 解析的算法

之前我们说过,HTML的解析不能简单的使用自顶向下或自底向上的方法解析,原因有以下:

  1. 是一种不严格的语言。
  2. 浏览器对于无效HTML的支持。
  3. 解析过程是来回折返的。大多数语言在解析的时候已经不会改变代码了,但是HTML当遇到Script标签并存在document.write的时候还是可能添加额外的信息,所以解析过程实际上也会改变源代码。

由于不能使用常用的方式解析HTML,浏览器粗昂早了新的解释器解析HTML。

解析算法由HTML5规范详细描述,这种算法由两个阶段组成: 符号化和形成解析树。

符号化是词法解析,将输入解析成符号。HTML的符号主要是由起始标签、结束标签、属性名和属性值组成。

词法解析器解析符号,然后将符号交给构建解析树的构建起,然后解析剩下的符号一直到所有的输入结束。

image.png

Figure 6: HTML parsing flow (taken from HTML5 spec)

你可能感兴趣的:(浏览器工作方式 二 (译))