解析-理論剖析

白霽發表於2019-02-20

4-解析-理論剖析

其實我們很明白「解析」到底做了什麼,說白了就一句話咯:「將原始碼轉化機器碼」。難道不好奇轉化這一流程中到底涉及到什麼環節嗎?

首先,我們展上述的那句話——「將原始碼轉化機器碼」。

在瀏覽器中,大多數解析是文件,整個過程就是努力將文件轉化為程式碼可以理解和使用的結構,對應輸出的結果是對應文件結構的節點樹,我們通常叫它為解析樹或語法樹。

感覺理解上可能還會有點問題,我們舉個例子,解析 2 + 3 -1 這個表示式,通過解析會輸出這樣的語法樹:

2+3-1表示式的語法樹

整個解析過程都是基於文件的語法規則去處理的,而每種可以解析的格式都有確定的語法,又由連續的單詞和語法規則組成,這樣的語法我們叫做 context free grammer,而人類語言不屬於此類範疇(所以不不能用常規的解析技術)。這樣看來對應的解析還是比較刻板的過程,只是匹配語法然後轉化的過程。

那解析過程可以分幾個階段呢?

解析過程分為兩個階段 lexical analysissyntax analysis

lexical analysis 階段:整個過程是將輸入的文件,轉化有效的 tokens。這裡想將 tokens 理解為人類語言中單詞。

syntax analysis階段:該階段就是將上階段的產物應用語法規則,產出語法樹。

上述的過程是基於對應的載體作用的分別是詞法分析器(lexer)和解析器(parse)。

詞法分析器:將輸入文件轉化為有效的標記,能識別和剔除無效的字元。

解析器:將有效的標記轉化解析樹。

詞法-語法-樹

整個解析過程是迴圈的,parse 會不斷向 lexer 索要 token,然後嘗試去尋找對應的語法規則去擊中,如擊中則將 token 對應的 node 節點新增到 parse tree 上;若沒有擊中,先儲存到內部;然後繼續索要 token 去擊中語法,直到將所有的 token 全部與語法規則擊中為止,如果沒有就引發異常,這說明文件存在異常,因存在語法錯誤。

而解析為語法樹並沒有完成將原始碼轉化為機器碼的步驟,還差最後一步就是翻譯。而翻譯過程也是同時解析過程進行,可以理解為下面的流程圖:

parse-translate

詳細講一下開始的例子: 2 + 3 -1 表示式。該表示式包含整數、加號和減號。

而對應數學計算語法如下:

  1. 構成語言的語法單位是表示式、項和運算子。
  2. 我們用的語言可以包含任意數量的表示式。
  3. 表示式的定義是:一個「項」接一個「運算子」,然後再接一個「項」。
  4. 運算子是加號或減號。
  5. 項是一個整數或一個表示式。

那解析一下表示式咯:匹配語法規則的第一個子串是 2,而根據第 5 條語法規則,這是一個項。匹配語法規則的第二個子串是 2 + 3,而根據第 3 條規則(一個項接一個運算子,然後再接一個項),這是一個表示式。下一個匹配項已經到了輸入的結束。2 + 3 - 1 是一個表示式,因為我們已經知道 2 + 3 是一個項,這樣就符合「一個項接一個運算子,然後再接一個項」的規則。2 + + 不與任何規則匹配,因此是無效的輸入。

而在計算機中對應詞彙都是有正則表示,所以上述表示式的詞彙用正則表達為:

INTEGER: 0|[1-9][0-9]*
PLUS: +
MINUS: -
複製程式碼

因為大多數解析的語法符合 context free grammer ,所以採用 BNF (巴科斯正規化)規則。BNF 是由約翰·巴科斯(John Backus)和彼得·諾爾(Peter Naur)首先引入的用來描述計算機語言語法的符號集。語法規則為

<符號> ::= <使用符號的表示式>
複製程式碼

上述例子可定義為:

expression :=  term  operation  term
operation :=  PLUS | MINUS
term := INTEGER | expression
複製程式碼

上述僅僅是解析的整個理論過程,而其載體便是解析器,那解析器有哪些種類呢?

下一篇文章

解析-解析器

相關文章