一起寫個簡單的解釋器(2)(3)(4)

一起寫個簡單的解釋器(2)

第二版代碼,已加中文註釋。github

  1. 處理輸入字符串中的空白字符;
  2. 處理輸入中的多位整數;
  3. 兩整數相減(第一版只能相加);

成爲一個你所使用的工具或框架的專家固然重要,但瞭解背後的原理也是極爲重要的。正如拉爾夫·沃爾多·愛默生所說:

“如果你僅僅學習方法,那麼你將被方法所束縛。但是如果你學習原理,你將能夠設計自己的方法。”

與第一版代碼相比,最主要的變化有:

  1. get_next_token 方法稍微重構了一點。pos 指針的自增邏輯放到了一個獨立的 advance 方法。
  2. 增加了兩個方法:skip_whitespace 方法用來忽略空白字符,integer 方法用來處理輸入中的多位整數。
  3. 修改了 expr 方法,在識別 INTEGER -> PLUS -> INTEGER 短語的基礎上,識別 INTEGER -> MINUS -> INTEGER 短語。在成功識別相應短語後,這個方法現在也能夠解釋加法和減法了。

練習

  1. 什麼是 lexeme ?
  2. 找出 token 流中的結構的過程叫什麼?換句話說,從 token 流中識別出特定短語的過程叫什麼?
    3.解釋器(編譯器)中做 parsing(語法分析)的部分的名稱是什麼?

解答

  1. lexeme 就是組成 token 的字符序列。

  2. 找到 token 流中的結構的過程,換句話說,識別 token 流中的短語的過程稱之爲 parsing(語法分析)。試圖識別(parsing)token 流中的 INTEGER -> PLUS -> INTEGER 或 INTEGER -> MINUS -> INTEGER 短語。

  3. 解釋器或編譯器中用以完成這樣的工作的部分,稱之爲 parser(語法分析器)。

一起寫個簡單的解釋器(3)

第三版代碼,已加中文註釋。github

語法圖

語法圖是什麼?語法圖是指表示一種程序設計語言語法規則的示意圖。本質上,一個語法圖直觀地顯示了在你的程序設計語言中,允許使用哪些語句和不允許使用哪些語句。

語法圖的兩個主要目的:

它們以圖表的形式表示一種程序設計語言的規範(語法)。
它們可以幫助你編寫解析器,你可以通過遵循簡單的規則將一個圖表映射成代碼。

新版本計算器的源代碼,該計算器可以處理包含整數和任意數量加法和減法運算符的有效的算術表達式。

expr 方法有一個可以執行 0 次或者多次的 while 循環。在循環中,parser 根據 token 進行判斷(是一個加號還是減號)。然而 parser 本身並不會解釋所有東西:識別到表達式,不做什麼處理。如果它識別不到,它會拋出一個語法錯誤。在 expr 中添加 interpreter 代碼,因爲 interpreter 需要求表達式的值,因此修改 term 方法使之返回一個整數值,修改 expr 方法使之在適當的地方執行加法和減法並且返回解釋的結果。

一起寫個簡單的解釋器(4)

第四版代碼,已加中文註釋。github

上下文無關文法

另一種被廣泛使用的、用於指定一種程序設計語言語法的表示法。它叫做上下文無關文法(簡稱文法)或者 BNF(Backus-Naur Form 巴科斯-諾爾範式)。

下面是使用文法的幾個原因:

  1. 文法以簡明的方式說明一種程序設計語言的語法。不像語法圖,文法十分簡潔。你將會看到我在未來的文章中越來越多地使用文法。
  2. 文法可以用作很好的文檔。
  3. 即使你從零開始編寫你的解析器,文法也是一個很好的起點。通常,你可以通過遵循一系列簡單的規則將文法轉換成代碼。
  4. 有一組工具叫做解析器生成器,它接收一段文法作爲輸入,並且根據那段文法自動地生成一個解析器。我會在系列後面的文章中討論那些工具。

下面是描述像“7 * 4 / 2 * 3”(它只是衆多可以由文法生成的表達式之一)這樣的算術表達式的一段文法:

expr : factor((mul|div)factor)*
factor : INTEGER

一段文法由一系列規則(rule)組成,也稱爲 產生式(productions)。在我們的文法中有兩條規則。

一條規則由一個非終結符(稱爲產生式的頭或者左邊)、一個冒號和一系列終結符,如’(‘、 ‘|’ 、’)’、非終結符(稱爲產生式的主體或者右邊)組成。

上面介紹的文法中,像 MUL、DIV 和 INTEGER 這樣的標記稱爲終結符(terminals),像 expr 和 factor 這樣的變量稱爲非終結符(non-terminals)。

第一條規則左邊的非終結符符號稱爲開始符號(start symbol)。在我們的文法例子中,開始符號是 expr。

發佈了52 篇原創文章 · 獲贊 51 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章