用了一下PLY(Python Lex Yacc)
这次是做一个Pascal的词法分析的实验作业,题目要求比较简单,自己做的时候也比较偷懒,保留字都没写全,这个东西写多了其实挺费体力的。
PLY(python-lex-yacc)框架还是很好用的。
一开始打算用ruby写,好不容易弄懂了ruby-lex的使用,可是却由于生成的ruby代码不完全,不能解释通过。
由于ruby-lex的机制是调用了本地lex操作命令,生成中间c代码,所以或许问题出我的本地
flex上,或许也是项目本身的问题吧。
介于ruby-lex项目已经多年没有人维护了,所以就没一直折腾下去了。
然后想到x8x的Aurum,Aurum is a LALR(n) parser generator written in Ruby.
作为parser当然也包括lexical的分析过程。但下午写的时候x8x不在线,又没有文档,对比example,遇到问题还是甚多,故放弃了。
不过用DSL写出的正规和EBNF着实漂亮。
例如:
_terminals (string(';') | string("\n")).one_or_more
argument argument, '+', argument {argument.s_exp = [:call, argument1.s_exp, :+,
[:array, argument2.s_exp]]}
接着想到linux chen以前的建议,说lisp做lexical analyzer挺方便。决定用lisp写,找到cl-lexer框架,可怜没有文档,例子都通过不。
就如此折腾了很久。
最后觉得还是用python的lexical analyzer写了,python在complier领域的支持比ruby要丰富很
多,很快找到了全面的文档和例子,于是一小会而就搞定了。
经过此次后感觉ruby社区里大都是web,DSL的项目,而python的社区覆盖领域相对更丰富些
。
附源码
pascal_ply.py
测试数据data
VAR x , y : INT ;
BEGIN
PROCEDURE main ( );
BEGIN
a := 10 ;
b := a + 20 ;
END
END