現代瀏覽器的工做原理【二】

3.解析和DOM樹建設正則表達式

3.1 通常解析
express

因爲解析在渲染引擎中是一個很重要的過程,咱們將更加深入的講解。讓咱們開始一個有關解析的簡要介紹。工具

解析文檔意味着將其轉換成一些有意義的結構----代碼能夠理解和使用。解析的結果一般是一個樹的節點表示文檔的結構,它被稱爲解析樹或語法樹。
優化

範例 - 解析表達式2 + 3 - 1,能夠返回此樹:
spa


圖5:數學表達式樹節點
翻譯

3.1.1 文法指針

解析是基於文檔所遵循的語法規則 ---- 所寫文檔的語言或格式。每次解析你能夠的格式必須具備肯定性的詞彙和語法規則的語法。這就是所謂的上下文無關文法。人類的語言是沒有這樣的語言,所以不能用傳統的解析技術解析。
code

3.1.2 詞法分析器 - 組合orm

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

詞法分析是分解成記號輸入的過程。記號是語言詞彙 ---- 收集的有效的積木。在人類語言中,它將包括全部的在該語言字典中出現的詞彙。

句法分析採用的是語法規則。

分析器一般把要作的工做分解爲兩個部分----詞法分析(有時也叫作記號分析)負責分紅輸入有效的記號;解析器負責分析文檔的結構,根據語言的語法規則,構造解析樹。詞法分析器知道如何去掉無關的字符,例如空格和換行符。


圖6:從源文件解析的樹

解 析過程是迭代的。解析器一般會要求詞法分析器一個新的記號,嘗試用語法規則來匹配記號。若是規則匹配,一個節點對應的記號將被添加到該解析樹,解析器會請 求另外一個記號。若是沒有匹配的規則,解析器將內部存儲記號,並不斷請求記號,直到在全部內部存儲的記號中找到一個規則匹配的。若是發現沒有規則,解析器將 拋出一個異常。這意味着該文件是無效的,幷包含語法錯誤。

3.1.3 翻譯

解析樹不少時候,是否是最終產品。解析中常用翻譯 ---- 轉換爲另外一種格式的輸入文件。編譯就是一個例子。編譯器的源代碼編譯成機器代碼首先解析成語法樹,而後翻譯成機器代碼文件樹。


圖7:編譯流程

3.1.4 解析示例

在圖5中,咱們創建了一個數學表達式的解析樹。讓咱們試着定義一個簡單的數學語言和解析過程。

詞彙:咱們的語言能夠包括整數,加號和減號。

語法:

一、語言語法構造塊是表達式、 條件和操做。

二、咱們的語言能夠包含任意數量的表達式。

三、表達式定義爲一個"術語"跟着"操做"跟着另外一個術語

四、操做是加號或減號

五、術語是一個整數標記或表達式

讓咱們來分析 2+3-1這個輸入。

與 規則相匹配的第一個子字符串是 2,根據規則 #5 是一個術語。第二種匹配是 2 + 3 ,這個匹配是第三個規則-----一個術語後跟着一個操做再跟着另外一個術語。下一個匹配,將只會在輸入結束時命中。2+3-1是一個表達式,由於咱們已經 知道 2+3 是一個術語,因此咱們必須術語後跟着操做再跟着另外一個術語。2++ 不會與任何規則相匹配,所以是無效的輸入。

3.1.5 詞彙和語法的正式定義

詞彙是一般由正則表達式表示。例如,咱們的語言常常會作以下的定義:

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

如你所見,整數已經定義爲一個正則表達式。

語法一般被稱爲BNF 格式定義。咱們的語言將定義以下:

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

咱們說一種語言若是是一個上下文無關語法,則能夠經過有規律的分析器解析其語法。上下文無關文法的直觀的定義是能夠徹底在BNF 表示法表示的語法。正式的定義請參閱上下文無關文法維基百科的文章

3.1.6 解析器的類型

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

讓咱們看看這兩種類型的解析器將如何解析咱們的示例:自上而下的解析器將開始從更高級別規則 — — 它將肯定 2 + 3 做爲表達式。它而後將標識 2 + 3-1 做爲表達式 (肯定表達式的過程演變匹配其餘規則,但起點是最高級別規則)。

自下而上的解析器會掃描輸入,而後將替換匹配輸入規則,直到匹配規則,這將繼續下去,直到輸入的結束,部分匹配的表達式放置在解析堆棧上。

Stack Input

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

這種自下而上的解析器的稱爲轉移減小分析器,,由於其向右移動的輸入 (想象一下一個指針,指向首先輸入開始和向右移動) 和語法規則逐漸減小。

3.1.7 自動生成解析器

有 些能夠爲您生成的解析器的工具,他們被稱爲解析生成器。你給它們您的語言的語法 — — 它的詞彙和語法規則 — — 他們生成工做解析器。建立一個解析器須要深刻了解的解析和其不容易用手建立一個優化的解析器,所以解析生成器可能很是有用。Webkit 使用兩個衆所周知的解析生成器-Flex 建立分析器 和Bison建立一個詞法分析器(您可能會遇到他們的名字 Lex 和 Yacc)。Flex 的輸入是一個包含正則表達式定義的標記的文件.Bison的輸入是 BNF 格式的語言語法規則。

相關文章
相關標籤/搜索