全文連接git
解析器是一種超級有用的軟件庫。從概念上簡單的說,它們的實現頗有挑戰性,而且在計算機科學中常常被認爲是黑魔法。在這個系列的博文中,我會向大家展現爲何你不須要成爲哈利波特就可以精通解析器這種魔法。可是爲了以防萬一帶上你的魔杖吧!github
咱們將探索一種叫作 Ohm 的新的開源庫,它使得搭建解析器很簡單而且易於重用。在這個系列裏,咱們使用 Ohm 去識別數字,構建一個計算器等等。在這個系列的最後你將已經用不到 200 行的代碼發明了一種完整的編程語言。這個強大的工具將讓你可以作到一些你可能過去認爲不可能的事情。編程
解析器很是有用。在不少時候你可能須要一個解析器。或許有一種你須要處理的新的文件格式,但尚未人爲它寫了一個庫;又或許你發現了一種古老格式的文件,可是已有的解析器不能在你的平臺上構建。我已經看到這樣的事發生無數次。 Code 在或者不在, Data 就在那裏,不增不減。數據結構
從根本上來講,解析器很簡單:只是把一個數據結構轉化成另外一個。因此你會不會以爲你要是鄧布利多校長就行了?編程語言
解析器從來是出奇地難寫,所面臨的挑戰是絕大多數現有的工具都很老,而且須要必定的晦澀難懂的計算機科學知識。若是你在大學裏上過編譯器課程,那麼課本里也許還有從上世紀七十年傳下來的技術。幸運的是,解析器技術從那時候起已經提升了不少。ide
典型的,解析器是經過使用一種叫做形式語法formal grammar的特殊語法來定義你想要解析的東西來創造的,而後你須要把它放入像 Bison 和 Yacc 的工具中,這些工具可以產生一堆 C 代碼,這些代碼你須要修改或者連接到你實際寫入的編程語言中。另外的選擇是用你更喜歡的語言親自動手寫一個解析器,這很慢且很容易出錯,在你可以真正使用它以前還有許多額外的工做。工具
想像一下,是否你關於你想要解析的東西的語法描述也是解析器?若是你可以只是直接運行這些語法,而後僅在你須要的地方增長一些掛鉤hook呢?那就是 Ohm 所能夠作到的事。ui
Ohm 是一種新的解析系統。它相似於你可能已經在課本里面看到過的語法,可是它更強大,使用起來更簡單。經過 Ohm, 你可以使用一種靈活的語法在一個 .ohm 文件中來寫你本身的格式定義,而後使用你的宿主語言把語義加入到裏面。在這篇博文裏,咱們將用 JavaScript 做爲宿主語言。spa
Ohm 創建於一個爲創造更簡單、更靈活的解析器的多年研究基礎之上。VPRI 的 STEPS program (pdf) 使用 Ohm 的前身 Ometa 爲許多特殊的任務創造了專門的語言(好比一個有 400 行代碼的平行製圖描繪器)。orm
Ohm 有許多有趣的特色和符號,可是相比於所有解釋它們,我認爲咱們只須要深刻其中並構建一些東西就好了。