從零開始寫個編譯器吧 - Parser 語法分析器

Parser(語法分析器)的編寫相對於 Tokenizer (詞法分析器)要複雜得多,所以,在編寫以前可能也會鋪墊得更多一些。固然,本系列旨在「寫出」一個編譯器,因此理論方面只會簡單介紹 tao 語言所涉及的部分。
以前的幾章中,我純手寫了tao 語言的 Tokenizer。但若是我準備也純手寫一個 Parser,那將是很是麻煩且繁瑣的一件事情。實際上,就在在寫出這篇文章以前,我已完成了 Parser 的編寫,並測試穩當,所以我能夠在此面對各位得出這個結論。數據結構

我將使用這麼一種方式「製造」出 Parser:工具

  1. 將 tao 語言的全部語法細節描述出來,即定義 tao 語言。
  2. 寫一個能」根據定義,生成 tao 語言的 Parser「的程序。

若是以上描述有些讓人困惑,那我舉個通俗點的例子吧:測試

假如我想要製做一雙鞋子,一般的方案是,我會買好材料,並把鞋子作出來。但還有另外一種方案,我先畫出鞋子的設計圖,再造一臺能依照設計圖造出鞋子的機器,而後把設計圖交給機器,再發動機器,獲得鞋子spa

在」製造鞋子的世界「中,除非我要開鞋廠,不然若我僅僅想造雙鞋子,那麼前一個方案顯然更好。但在」製造編譯器的世界「中,卻與直覺相反,當語言自己足夠複雜的時候,後一種方案比前一種方案要方便得多。設計

至此,我須要一個能讀懂 tao 語言的定義,並根據定義生成 Parser 的一個程序。這種程序咱們稱之爲 Compiler-compiler 。這樣的程序(或稱工具)有不少現成的可供選擇(包括在 Java 平臺上可用的),但既然我這個系列叫作《從零開始寫個編譯器吧》,那顯然若是我用現成的工具,那是犯規行爲。編譯器

  • 所以,我還要寫一個 Compiler-compiler 出來才行。

那麼,讓我先貼一張圖,以描述我將會寫出的 Compiler-compiler 的工做原理吧。編譯

4169a92a3c42060aa326d13892175708_b.jpg

Compiler-compiler 會將 tao 語言的定義編譯成某種數據結構,而這種數據結構是 Parser 初始化的參數。Parser 只有得到了這種數據結構才能正常工做。class

當 Parser 初始化以後,它會讀取 Tokenizer 生成的 Token 序列,並同時經過解釋 Compiler-compiler 生成的數據結構,最後生成 Syntax Tree。原理

至此,在編寫 Parser 的章節中,我必須完成以下三個任務。語法

  1. 定義 tao 語言的語法細節,並挑選一個合適的形式描述出來。
  2. 編寫一個 Compiler-compiler,它能編譯 tao 語言的定義,並生成某種數據結構。
  3. 編寫一個 Parser,它經過解釋 Compiler-compiler 生成的數據結構,將 Token 序列編譯成 Syntax Tree。
相關文章
相關標籤/搜索