有室友的毕业设计是做程序切片相关的,需要对代码做解析;指导老师建议他们用Python为实现语言,所以看来是需要找点适合Python使用的parsing library。解析源码这种事情正好是我熟悉的领域,就自告奋勇说看看能不能帮上啥忙。不过听说要解析的源语言或许是C++我就冒冷汗……||||||
手写parser真是太痛苦了,虽然我已经做了很多次但我还是不想建议室友也重复我的痛苦。特别是像C++那么复杂的语言 =v=
总之调查一下有些什么可选项,先记在这边再说。
有点想推荐用ANTLR来生成lexer和parser,因为ANTLRWorks用于编写词法和语法规则相当方便。Jython的解析器就是用ANTLR来生成的,ANTLR官网首页上甚至有Python之父Guido van Rossum的赞词:
Guido van Rossum 写道
I'm actually really liking ANTLR! I have a pretty darn good velocity with...
Python用来做internal DSL总觉得有点硬(语法层面上)然而又不够硬(类型层面上)。说语法硬主要是Python库能对语法做的定制余地不大,而且Python社区也比较喜欢统一的做事方式;说类型不够硬是指静态类型语言能够通过精巧的类层次/API设计来在编译时对fluent API做“语法检查”,而Python的变量没有类型所以fluent API要是写错了也得到运行时才能发现。嘛,静态/动态方面的观点总是有争议的,我这里纯粹是自己的感觉,没有想说服别人的意思。Boo用于internal DSL就比Python来得方便,多得语法宏。
呵呵,事实上我自己在写的一个库也是用fluent API来表达语法规则的;跟pyparsing一样,我也是重载了+来表示顺序结构、|来表示选择结构,等;但那样的代码出现在C#里我就没觉得很奇怪。呃诶……
可视化工具里除了ANTLRWorks之外我也很喜欢新的Oslo的Intellipad,不过Oslo的运行时依赖于.NET Framework,算了,不用来推荐给室友。据说Oslo team的人用MGrammar写过VB和C#的语法?呵呵,it's got all the potentials, let's just wait and see what comes out of it.
还有些别的语法编辑器不过貌似要收费……呜,收费的暂时无视。
今天先记这么多。要是有时间的话手写个简单的词法分析器作为例子也可以……不过现在我想睡觉了
P.S. Python自己的编译器是如何实现的呢?可以关注一下PEP-339的描述。是一个典型的LL(1)解析器解析出AST之后,生成CFG然后生成bytecode。