显示标签为“lisp”的博文。显示所有博文
显示标签为“lisp”的博文。显示所有博文

星期三, 六月 06, 2007

用了一下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

星期五, 四月 27, 2007

Emacs下安装elisp包的常用方法


比较小型的elisp文件,一般可以直接下载到.el文件,放到你的elisp文件目录。
然后修改.emacs文件

;;把引号内的替换成你的.el文件所在目录就可以了,所有目录下的.el和.elc文件都在require范围之内。
(add-to-list 'load-path "~/.elisp/enable-lisp/")

接着
;;把'后的替换成你的.el文件
(require 'php-mode)

这样就基本设置好了,大部分功能都会加载了。


对于大型的elisp包,你下载到的一般是一个压缩包,比如.tar.gz或者.zip。
1.先解压
2.编译
前几天配过一个tramp。最近装多了以后,发现方法都大同小异。
$./configure --with-contrib --with-emacs
$make
$make DESTDIR=/tmp install


然后把目标被编译到了/tmp,一般有两个文件夹,一个是site-lisp,另一个是texi或者叫info。
3.加载
site-lisp的加载方法还是采用上面提到的
;;把引号内的替换成你的.el文件所在目录就可以了,所有目录下的.el和.elc文件都在require范围之内。
(add-to-list 'load-path "~/.elisp/tramp/lisp")


texi的加载方法(其实texi的加载不是必要的,他主要是一些帮助文件)
(add-to-list 'Info-default-directory-list "~/.elisp/tramp/texi/")


然后require就好了。
最后推荐
$make clean