用兩百行_JavaScript_創造你自己的編程語言

全文鏈接

解析器是一種超級有用的軟件庫。從概念上簡單的說,它們的實現很有挑戰性,並且在計算機科學中經常被認爲是黑魔法。在這個系列的博文中,我會向你們展示爲什麼你不需要成爲哈利波特就能夠精通解析器這種魔法。但是爲了以防萬一帶上你的魔杖吧!

我們將探索一種叫做 Ohm 的新的開源庫,它使得搭建解析器很簡單並且易於重用。在這個系列裏,我們使用 Ohm 去識別數字,構建一個計算器等等。在這個系列的最後你將已經用不到 200 行的代碼發明了一種完整的編程語言。這個強大的工具將讓你能夠做到一些你可能過去認爲不可能的事情。

爲什麼解析器很困難?

解析器非常有用。在很多時候你可能需要一個解析器。或許有一種你需要處理的新的文件格式,但還沒有人爲它寫了一個庫;又或許你發現了一種古老格式的文件,但是已有的解析器不能在你的平臺上構建。我已經看到這樣的事發生無數次。 Code 在或者不在, Data 就在那裏,不增不減。

從根本上來說,解析器很簡單:只是把一個數據結構轉化成另一個。所以你會不會覺得你要是鄧布利多校長就好了?

解析器歷來是出奇地難寫,所面臨的挑戰是絕大多數現有的工具都很老,並且需要一定的晦澀難懂的計算機科學知識。如果你在大學裏上過編譯器課程,那麼課本里也許還有從上世紀七十年傳下來的技術。幸運的是,解析器技術從那時候起已經提高了很多。

典型的,解析器是通過使用一種叫作形式語法formal grammar的特殊語法來定義你想要解析的東西來創造的,然後你需要把它放入像 Bison 和 Yacc 的工具中,這些工具能夠產生一堆 C 代碼,這些代碼你需要修改或者鏈接到你實際寫入的編程語言中。另外的選擇是用你更喜歡的語言親自動手寫一個解析器,這很慢且很容易出錯,在你能夠真正使用它之前還有許多額外的工作。

想像一下,是否你關於你想要解析的東西的語法描述也是解析器?如果你能夠只是直接運行這些語法,然後僅在你需要的地方增加一些掛鉤hook呢?那就是 Ohm 所可以做到的事。

Ohm 簡介

Ohm 是一種新的解析系統。它類似於你可能已經在課本里面看到過的語法,但是它更強大,使用起來更簡單。通過 Ohm, 你能夠使用一種靈活的語法在一個 .ohm 文件中來寫你自己的格式定義,然後使用你的宿主語言把語義加入到裏面。在這篇博文裏,我們將用 JavaScript 作爲宿主語言。

Ohm 建立於一個爲創造更簡單、更靈活的解析器的多年研究基礎之上。VPRI 的 STEPS program (pdf) 使用 Ohm 的前身 Ometa 爲許多特殊的任務創造了專門的語言(比如一個有 400 行代碼的平行製圖描繪器)。

Ohm 有許多有趣的特點和符號,但是相比於全部解釋它們,我認爲我們只需要深入其中並構建一些東西就行了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章