一个简易的语法分析器

写一个Parser其实是很简单的一件事情.你之所以会觉得困难,是因为你对这个东西并没有足够深入的了解.又或者说,你被龙书上那堆深奥的理论吓到了.

如果你某一天头脑发热,想写一个Parser了,我推荐给你一些好东西,首先是轮子哥的博客http://www.cppblog.com/vczh/archive,我是看了他写的三篇关于正则表达式的实现的文章,撸了一个正则表达式引擎之后,突然一下子知道了Parser应该怎么写了,然后才开始深入Parser的学习的.

然后是一本书< Parsing Technology -- A practical Guide >,这本书确实写得非常棒,但是该书的第二版添加了很多我们用不到的东西,你看第一版就可以了,虽然是1990年出版的,但是方法我们现在还在大规模使用(Parsing界基本上进展缓慢).有意思的是,这本书上基本上没有代码,也基本上没有公式,这对初学者可能是一个障碍,但是对于老鸟来说,是一大福音,其实在我还是一个菜鸟的时候,我也很疑惑,为什么数据结构或者算法书上的代码要用伪码来表示,为什么不直接上具体的c++代码,不是更方便我们理解吗?后来逐渐明白了,编程语言可能会过时,但是算法一般来说不会过时,用具体的语言来实现基本上属于细枝末节的东西,而且不同的实现之间效率什么的千差万别,用具体的语言来描述代码的话,会给初学者一种钦定的感觉,好像书上的代码总是最好的,可是作者真的敢保证自己写的具体代码一定是最好的吗?所以算法的描述,作者最好能够不去管具体编程语言实现的那些细枝末节的东西,只要将最核心的东西–怎么做,讲清楚即可,至于如何实现,一千个读者,有一千种实现.当然,这对初学者很不友好.

我基本上是对照这这本书,撸了一堆的Parser,LL(1), LR(1), LALR(1), LR(0),你准备实现这些Parser的时候,最好能够具备扎实的编程基本功.即使写不出来,也不要过分气馁,我其实刚拿到这本书的时候,头也很大,先是看了前几章,开头的第一个CYK Parsing Method就折腾得我够呛的了,我花了1~2个星期实现了一个CYK,然后感觉这本书难度有点大,所以我就将这个玩意丢了半年左右,今年过来不知道发了什么疯,自己定下了目标,一定要实现一个简易版的yacc,然后又翻出了这本书,一边读,一边实现,才发现,后面的算法比前面的CYK简单多了,原来这本书是个下马威啊,用了2~3周的时间,一直读到了LALR(1)的实现,读到了这里,我发现,够了,这些知识已经足够实现一个简易版的yacc了.所以我就开始写了.

刚开始的时候,我以为这个玩意会写几个月,后来缩减到了一个月,然后现在的话,一不小心就写完了,也就是说,我基本上花了2~3周就已经将最核心的功能实现了.所以也不算太难.至少对于我来说,如果你是一个初学者的话,不要拿这个进度和自己对比,虽然我写这个东西只花了这么长的时间,但是在此之前,我是做了很多积累的,所以这个对比没有任何意义.

并不是一个很正式的项目,我也只是写着来帮助理解Parser原理,以及练手用的,一个简易的实现了LALR(1)tinyYacc :https://github.com/lishuhuakai/TinyYACC

上面的实现大概只有2000行左右,因为我尽量简化了一些细枝末节的东西,也没有过分追求速度,总之我写得再快(当然,水平暂时还不够),也不会有人用我这个半成品投入实际生产,所以实际上代码还是很好理解的,如果你认真读了上面推荐的那本书的话.

好了,其实到了这里,我持续了一个多月的Parser之旅已经告一段落了,这篇文章算是一个多月的总结吧,我可真是奢侈啊,拿一个多月的空闲时间来写这些没有什么卵用的Parser.

接下来准备开始好好写一下自己的标准库了(stl在某些方面并不好用),虽然代码质量远远比不上stl,但是最起码用起来得心应手啊,同时也可以用来练手,还有,准备开始刷题,准备找工作了.

日子过得真是快啊.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值