解析-解析器

4-解析-解析器

解析器根據解析語法的順序不一樣可分爲兩類。前端

自上而下解析器:從語法高層結構開始出發,嘗試從中找到匹配的結構。用點人話說就是解析器先匹配高級的語法部分,而後慢慢降級匹配。web

仍是咱們上述的例子(2+3-1),解析器將 2 + 3 標記爲表達式,2 + 3 - 1標記爲表達式,而不是先標記爲項。正則表達式

自下而上解析器:又名移位歸約解析器,從語法的底層規則觸發,將輸入內容逐步轉化爲語法規則,直至知足高層語法規則。工具

一樣的例子,解析器將輸入的內容,找到對應的匹配規則,將匹配的內容替換成對應的底層規則(term、operation),again again 直到輸入內容的結尾(This will go on until the end of the input)。post

4-bottom-top

雖然說解析的過程仍是比較死板的,無非就是規則的匹配,可是若是本身手寫一個解析不只要求本身對應解析過程要有這深入理解,同時還要將初版寫好的解析器優化好整個處理流程,這樣仍是有些難度的,那麼有一種能夠僅僅須要咱們輸入對應語言的語法(詞彙和語法規則)的工具就能生成對應解析器,這必定是一種神器吧~(注:留意手寫和生成的前置條件)。優化

聽說 webkit 渲染引擎就使用兩種很是著名的解析器生成器( Flex 和 Bison )。firefox

Flex: 並非前端的 CSS噢。該生成器建立的就是詞法分析器(lexer),對應輸入就是一個包含正則表達式定義的 token 文件。3d

Bison:建立的自下而上的解析器(parse),其須要的輸入則是使用 NBF 格式的語法規則。cdn

由於須要使用 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 解析器究竟是什麼樣子哩~

下一篇文章

解析-HTML解析器

相關文章
相關標籤/搜索