瀏覽器原理(三)——渲染過程之解析

前言

此篇爲翻譯內容,原篇地址:在這裏

解析——介紹

因爲解析是渲染引擎中非常重要的一個過程,我們將進一步深入地瞭解它。 我們先來看一下關於解析的一點介紹。

解析文檔意味着將其轉換爲有意義的結構 —— 代碼可以理解和使用。解析的結果通常是表示文檔結構的節點樹,它被稱爲解析樹或語法樹。

例如——解析一個表達式“2+3-1”,就會返回下面這個樹:

數學表達式樹節點

語法

解析是基於文檔遵循的語法規則 —— 其中使用的語言或格式進行的。你可以解析的每種格式都必須具有由詞彙和語法規則組成的確定性語法。它被稱爲上下文無關語法。人類語言不是這樣的語言,因此不能用傳統的解析技術進行解析。

解析——詞法分析器組合

解析可以分爲兩個子過程 -——詞法分析和語法分析。

詞彙分析是將輸入打破令牌(tokens)的過程。令牌(token)是語言詞彙 -——有效構建塊的集合。在人類語言中,它將包含出現在該語言字典中的所有單詞。

語法分析是語言語法規則的應用。

解析器通常將工作分給兩個組件——詞法分析器(有時也叫標記生成器),負責將輸入分成有效的令牌,而解析器則負責根據語言語法規則分析文檔結構來構建解析樹。詞法分析器知道如何去除不相關的字符,如空格和換行符。

從源文檔到解析樹的過程:

從源文檔到解析樹的過程

解析過程是迭代的,解析器通常會詢問詞法分析器新令牌,並嘗試將令牌與語法規則之一相匹配。

如果規則匹配,則與令牌相對應的節點將被添加到解析樹中,並且解析器將要求另一個令牌。

如果沒有規則匹配,解析器將在內部存儲令牌,並繼續請求令牌,直到找到與所有內部存儲的令牌匹配的規則。

如果沒有找到規則,則解析器將引發異常。 這意味着文檔是無效的幷包含語法錯誤。

編譯

很多時候,解析樹不是最終產品。解析通常用於翻譯 -——將輸入文檔轉換爲另一種格式。這個例子就是編譯。編譯器就是將源代碼編譯成機器碼。這個過程的第一步就是將源代碼解析成解析樹,然後再把解析樹轉換成機器代碼文檔。

下面是編譯流程:

編譯流程

解析示例

在前面,我們爲一個數學表達式創建了一個解析樹,下面,讓我們嘗試定義一個簡單的數學語言來了解一下解析過程。

詞彙:我們的語言可以包括整數,加號和減號。

語法

  1. 語言語法構建塊是表達式,術語和操作。
  2. 我們的語言可以包含任意數量的表達式。
  3. 表達式定義爲“術語”,後跟“操作”,後跟另一術語。
  4. 操作是加號或減號。
  5. 術語是整數標記或表達式。

讓我們來分析一下輸入的“2+3-1”。

與規則匹配的第一個子字符串是“2”,根據規則5,它是一個“術語”,與規則第二個匹配的是“2+3”——符合規則3,一個“術語”後跟“操作”,後跟另一個“術語”。下一個匹配是在輸入結束之後。“2+3-1”是一個表達式,因爲我們已經知道了“2+3”是一個“術語”,而“術語”後跟一個“操作”,再跟一個“術語”是符合規則的。而“2++”將不會匹配任何一條規則,因此是無效的輸入。

詞彙和語法的正式定義

詞彙通常由正則表達式表達。

例如,我們的語言可以被定義爲:

INTEGER :0|[1-9][0-9]*
PLUS : +
MINUS: -

語法通常以稱爲BNF的格式定義。我們的語言將被定義爲:

expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression

我們說一種語言可以由常規解析器解析,如果其語法是上下文無關語法。上下文無關語法的直觀定義是可以在BNF中完全表達的語法。正式定義請參見:這裏

解析器的類型

有兩種基本的解析器——自頂向下的解析器和自下而上的解析器。直觀的解釋是,自頂向下的解析器會看到語法的高級結構,並嘗試匹配其中的一個。底層解析器從輸入開始,並逐漸將其轉換爲語法規則,從低級別規則開始,直到滿足高級規則。

讓我們看看兩種類型的解析器將如何解析我們的例子:

自上而下的解析器將從較高級別的規則開始——它會“2+3”定義成一個表達式。把“2+3-1”定義爲另一個表達式(識別表達式的過程演變與其他規則匹配,但起點是最高級規則)。

自下而上的解析器將掃描輸入,直到匹配規則,然後將匹配的輸入與規則替換。這個過程將會繼續,直到輸入結束。被匹配的表達式將會被放到解析棧裏。

stack input
2+3-1
term +3-1
trem operation 3-1
expression -1
expression operation 1
expression

這種類型的自下而上的解析器被稱爲移位減少解析器,因爲輸入向右移動(想象一個指針首先指向輸入開始並向右移動),並逐漸減少語法規則。

自動生成解析器

這裏有可以爲您生成解析器的工具,它們被稱爲解析器生成器(generator)。你可以把你的語言的語法——詞彙和語法規則,輸送給它們,它們會自動生成一個解析器。創建一個解析器需要對解析有深刻理解,並且也不容易用手創建一個優化的解析器。所以解析器生成器非常有用。

Webkit使用兩個很有名的解析器生成器——用於創建詞法解析器的Flex和用於創建解析器的Bison。Flex輸入是包含令牌的正則表達式定義的文件,Bison的輸入是BNF格式的語言語法規則。

關於解析器的介紹就到這裏了,下一篇文章將會像大家介紹解析HTML的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章