4-解析-解析器
解析器根據解析語法的順序不同可分為兩類。
自上而下解析器:從語法高層結構開始出發,嘗試從中找到匹配的結構。用點人話說就是解析器先匹配高階的語法部分,然後慢慢降級匹配。
還是我們上述的例子(2+3-1),解析器將 2 + 3 標記為表示式,2 + 3 - 1標記為表示式,而不是先標記為項。
自下而上解析器:又名移位歸約解析器,從語法的底層規則觸發,將輸入內容逐步轉化為語法規則,直至滿足高層語法規則。
同樣的例子,解析器將輸入的內容,找到對應的匹配規則,將匹配的內容替換成對應的底層規則(term、operation),again again 直到輸入內容的結尾(This will go on until the end of the input)。
雖說解析的過程還是比較死板的,無非就是規則的匹配,但是如果自己手寫一個解析不僅要求自己對應解析過程要有這深刻理解,同時還要將第一版寫好的解析器優化好整個處理流程,這樣還是有些難度的,那麼有一種可以僅僅需要我們輸入對應語言的語法(詞彙和語法規則)的工具就能生成對應解析器,這一定是一種神器吧~(注:留意手寫和生成的前置條件)。
據說 webkit 渲染引擎就使用兩種非常著名的解析器生成器( Flex 和 Bison )。
Flex: 並不是前端的 CSS噢。該生成器建立的就是詞法分析器(lexer),對應輸入就是一個包含正規表示式定義的 token 檔案。
Bison:建立的自下而上的解析器(parse),其需要的輸入則是使用 NBF 格式的語法規則。
因為需要使用 BNF格式去書寫語法,則證明適用於 context free grammer的語言。而 webkit 中 CSS 解析器就是由 Bison 生成;而 firefox 中CSS解析器是由人工手寫,其主要的邏輯是將CSS 檔案轉化為 StyleSheet 物件,而物件中包含對應的 CSS 規則。
那能不能 Bison 建立一個 HTML 解析器呢?沒有可能,因為 HTML 語法規則並不是 context free grammer 型別,所以無法使用 BNF 格式書寫語法,嚴格的說常規解析 CSS 和 JavaScript的解析器並不能解析 HTML文件。
HTML 格式可以由DTD (Document Type Definition) 定義,讓我想起來 XML 和 HTML 很像語言層面都是標記語言,XML 也是有 DTD 和 XML Schema 定義的,而且 XML 中有一個 HTML 的變體: XHTML。那麼 HTML 解析器能不能解析 HTML呢?
還是不行,為什麼呢?想必 XML 而言,HTML 語法規則更加包容,容許開發者省略某些隱式新增的標記,有時還能省略一些起起始或是結束標籤等等。這一方面讓 HTML 流行的原因之一,同時導致了 HTML 語法較難定義,所以無法使用常規解析器去解析。
那 HTML 解析器到底是什麼樣子哩~