全文连接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 有许多有趣的特色和符号,可是相比于所有解释它们,我认为咱们只须要深刻其中并构建一些东西就好了。