Skip to content

Latest commit

 

History

History
13 lines (7 loc) · 1.27 KB

README.md

File metadata and controls

13 lines (7 loc) · 1.27 KB

R2 解释器

最开始想从头开始自己写一个简单的解释器,大概像 R2 这样的,<怎样写一个解释器>(http://www.yinwang.org/blog-cn/2012/08/01/interpreter)。 可以看出实现非常简单,不过很好的解释了闭包是怎么回事。在尝试用 JS 实现时发现,JS 并不支持模式匹配,虽有提案以及对应的库 z,但是相比来说还是不够强大,还是需要很多的逻辑检测。

开始尝试用正则匹配,很快发现不大行的通,最后还是老老实实从词法分析开始着手,词法分析倒是很简单,语法分析这几条规则也不麻烦,LL 自顶向下分析足够应付(没有左递归),不过还是稍显啰嗦。 这儿只是假定输入符合语法,直接递归解析生成 AST。毕竟现实中有大把的工具可以直接得到 AST,这儿就没花太多功夫在上面。

最后解释执行,这儿主要是为了演示闭包的实现,可以看出闭包无非是上下文和函数的组合,这儿的上下文是函数定义的上下文,进一步可以将其放到函数示例上 fn[context] = context 这样子的话,我们就可以说函数就是闭包呀。 Context 实现不大一样,这儿是用链式方式链接起来。