瀏覽器工作方式 二 (譯)

Formal definitions for vocabulary and syntax

詞匯通常是使用正則表達(dá)式來表示的笑窜。舉例來說纹磺,我們上述的語言可以被定義為如下:
INTEGER :0|[1-9][0-9]*
PLUS : +
MINUS: -</pre>

可以看出夭谤,數(shù)字是用正則來表示的攀甚。

句法通常是通過一種叫 BNF 的格式定義的梦皮,我們上述語言可以被定義為如下:
expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression</pre>

我們可以認(rèn)為如果一個(gè)語言的語法是上下文無關(guān)語法丽已,那么它總是可以被常規(guī)解釋器解釋的。上下文無關(guān)語法的一種直接定義就是可以完全由BNF表示厢绝。

Types of parsers - 解析器的類型

有兩種比較常見的解析器類型: 自頂向下分析和自底向上分析契沫。一種簡單的解釋是自頂向下分析是

根據(jù)形式語法規(guī)則,在語法分析樹

的自頂向下展開中搜索輸入符號串可能的最左推導(dǎo)昔汉。單詞按從左到右的順序依次使用懈万。自底向上分析是

語法分析器從現(xiàn)有的輸入符號串開始,嘗試將其根據(jù)給定的形式語法規(guī)則進(jìn)行改寫靶病,最終改寫為語法的起始符號会通。

自底向上分析將會(huì)掃描所有輸入的項(xiàng)一直到某條規(guī)則可以符合,然后用規(guī)則替換匹配的輸入娄周。這項(xiàng)工程會(huì)一直持續(xù)到輸入的內(nèi)容結(jié)束涕侈。已經(jīng)符合了規(guī)則的部分會(huì)放入解釋器堆棧中。

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

這種自下而上的解析器稱為移位減少解析器煤辨,因?yàn)檩斎胂蛴乙苿?dòng)(想想一個(gè)指針首先指向輸入開始并向右移動(dòng))并逐漸轉(zhuǎn)移到對應(yīng)語法規(guī)則的堆棧中裳涛。

Generating parsers automatically - 自動(dòng)生成解釋器

有一些工具可以幫助你生成解釋器,他們被叫做parser generators众辨。你將語言語法輸入進(jìn)去端三,它會(huì)自動(dòng)幫你生成一個(gè)可以使用的解釋器。手工制作解釋一需要非常專業(yè)的知識所以并不是一件簡單的工作鹃彻,這樣自動(dòng)生成的解釋器就非常有用了郊闯。

Webkit 使用兩個(gè)非常有名的自動(dòng)生成工具。詞法解析使用了 Flex, 解釋器的生成使用了Bison....

HTML Parser - HTML 解釋器

HTML解釋器的工作是將HTML文件編譯進(jìn)解析樹蛛株。

The HTML grammar definition - HTML的語法定義

W3C 阻止制定了HTML的詞法和句法規(guī)范虚婿。

a context free grammar - 不是一種上下文無關(guān)語法

我們曾經(jīng)討論過大多數(shù)的時(shí)候我們都可以使用BNF 的格式定義句法,但很不幸泳挥,這并不適用于 HTML 的解析然痊。HTML不能簡單的被上下文無關(guān)語法解析器解析。正式的HTML的定義格式是DTD屉符。

在世界上第一個(gè)網(wǎng)站出現(xiàn)的時(shí)候看起來很怪異,html文件更像是xml文件而xml文件有許許多多的解析器东涡,XML 有一種比較接近HTML的變體XHTML凸舵,那么他們到底有什么區(qū)別呢掀潮?

那就是HTML更不嚴(yán)格邑商。 有時(shí)候你漏掉了起始標(biāo)簽恶迈,有時(shí)候是結(jié)束標(biāo)簽但最后并沒什么關(guān)系奈附。 這對于苛刻的XML是一種無聲的反抗佑颇。

很顯然,這一點(diǎn)的不同造成了很大的影響移袍。一方面開發(fā)者們更樂意使用HTML,另一方面也讓HTML的解釋器制作起來更加困難奄妨。也就是說直焙,HTML不能簡單的被轉(zhuǎn)譯厨喂。

HTML DTD

HTML是一種DTD格式的定義方法颁褂,這種格式曾經(jīng)是用于定義SGML類型的語言的。這種格式對于所有可使用的元素的屬性和層級關(guān)系進(jìn)行定義。我們已經(jīng)說過歼冰,HTML DTD不是一種上下文無關(guān)的語法靡狞。

DTD 有一些變體。過去隔嫡,嚴(yán)格模式下要求完全符合規(guī)范而其他模式對于標(biāo)簽的支持依賴于瀏覽器的解析甸怕,目的是向下兼容。

W3C對DTD的規(guī)范定義:http://www.w3.org/TR/html4/strict.dtd

DOM

HTML的解析樹是一個(gè)DOM元素和屬性節(jié)點(diǎn)樹腮恩。DOM 是 Document Object Model 的縮寫梢杭。他是HTML的解析也是HTML對外的接口,比如對于JS的接口秸滴。這棵樹的跟節(jié)點(diǎn)是 Document 對象武契。

DOM和HTML幾乎有一一對應(yīng)關(guān)系,比如:

<html>
    <body>
        <p>
            Hello World
        </p>
        <div> <img src="example.png"/></div>
    </body>
</html>

將會(huì)被解析為:

image.png

和HTML一樣荡含,DOM的規(guī)范也是由W3C規(guī)定的咒唆。是一個(gè)操作DOM的通用規(guī)范。W3C對此有一個(gè)詳細(xì)文檔释液,它的地址是:
http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/idl-definitions.html
當(dāng)我說一顆樹包括DOM節(jié)點(diǎn)的時(shí)候钧排,我指的是這棵樹是由有DOM接口的元素組成的。瀏覽器內(nèi)部有他們自己的實(shí)踐均澳。

The parsing algorithm - 解析的算法

之前我們說過恨溜,HTML的解析不能簡單的使用自頂向下或自底向上的方法解析,原因有以下:

  1. 是一種不嚴(yán)格的語言找前。
  2. 瀏覽器對于無效HTML的支持糟袁。
  3. 解析過程是來回折返的。大多數(shù)語言在解析的時(shí)候已經(jīng)不會(huì)改變代碼了躺盛,但是HTML當(dāng)遇到Script標(biāo)簽并存在document.write的時(shí)候還是可能添加額外的信息项戴,所以解析過程實(shí)際上也會(huì)改變源代碼。

由于不能使用常用的方式解析HTML槽惫,瀏覽器粗昂早了新的解釋器解析HTML周叮。

解析算法由HTML5規(guī)范詳細(xì)描述,這種算法由兩個(gè)階段組成: 符號化和形成解析樹界斜。

符號化是詞法解析仿耽,將輸入解析成符號。HTML的符號主要是由起始標(biāo)簽各薇、結(jié)束標(biāo)簽项贺、屬性名和屬性值組成君躺。

詞法解析器解析符號,然后將符號交給構(gòu)建解析樹的構(gòu)建起开缎,然后解析剩下的符號一直到所有的輸入結(jié)束棕叫。

image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奕删,隨后出現(xiàn)的幾起案子俺泣,更是在濱河造成了極大的恐慌,老刑警劉巖完残,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伏钠,死亡現(xiàn)場離奇詭異,居然都是意外死亡坏怪,警方通過查閱死者的電腦和手機(jī)贝润,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門绊茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铝宵,“玉大人,你說我怎么就攤上這事华畏∨羟铮” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵亡笑,是天一觀的道長侣夷。 經(jīng)常有香客問我,道長仑乌,這世上最難降的妖魔是什么百拓? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮晰甚,結(jié)果婚禮上衙传,老公的妹妹穿的比我還像新娘。我一直安慰自己厕九,他們只是感情好蓖捶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扁远,像睡著了一般俊鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畅买,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天并闲,我揣著相機(jī)與錄音,去河邊找鬼谷羞。 笑死焙蚓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播购公,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼萌京,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宏浩?” 一聲冷哼從身側(cè)響起知残,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎比庄,沒想到半個(gè)月后求妹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佳窑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年制恍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片神凑。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡净神,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉委,到底是詐尸還是另有隱情鹃唯,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布瓣喊,位于F島的核電站坡慌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藻三。R本人自食惡果不足惜洪橘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棵帽。 院中可真熱鬧熄求,春花似錦、人聲如沸岖寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仗谆。三九已至指巡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隶垮,已是汗流浹背藻雪。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狸吞,地道東北人勉耀。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓指煎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親便斥。 傳聞我的和親對象是個(gè)殘疾皇子至壤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容