嗯,学计算机的
Posted on 十二月 25th, 2008 in 杂碎 | 3 Comments »
东方卫报6月28日讯 昨天早晨,站在秦淮区法院法庭内的谭磊(化名)始终低着头一言不发,等待判决。4个多月前,饥饿难忍的他冲进一家超市,用啤酒瓶砸向收银员,想抢钱买东西充饥。而一年前,他刚刚从大学毕业,获得了计算机专业本科文凭。
http://www.xici.net/b103826/d54528484.htm
东方卫报6月28日讯 昨天早晨,站在秦淮区法院法庭内的谭磊(化名)始终低着头一言不发,等待判决。4个多月前,饥饿难忍的他冲进一家超市,用啤酒瓶砸向收银员,想抢钱买东西充饥。而一年前,他刚刚从大学毕业,获得了计算机专业本科文凭。
http://www.xici.net/b103826/d54528484.htm
小学的时候就人们就穿那种印个北京申奥标志再“2008”的衣服,当时觉得可是神奇的遥遥无期的。2008就是传说中的2008。然而时间就是这样,一下子来一下子去,不打招呼的。2008,又怎么说好呢,雪灾,藏.独,地震,俯卧撑,奥运,经济危机,一件接一件太多的大事情,我不想说太多。然而出于生命的尊严,对遇难的人再次默哀。
我小人物只想写自己的2008。
1月~6月 就在那个王八池子里继续呆着,期间读过了《麦田里的守望者》《肖申克的救赎》《不能承受的生命之轻》和《圣经》,听过了蔡健雅和linkin park,除此之外还真没什么好回忆的。总结我的高中三年,便是失败的三年,见识了不少人,也算是世面吧。反正该过去的已经过去,一切与老子无关了。
6月6日(还是7日?) 去高考。考完了试跟同学上了半个通宵的网,聊了半个通宵,把《肖申克》送给了这个同学。然后收拾了下行李,在宿舍里顺了两盘孙燕姿的盗版磁带,回家走人。
~7月 50快钱买了一个拍子,办了张乒乓俱乐部的会员卡,与那里的老头子们打,备受打击。没买吉他。在家宅着,晚上跟妈一起出去散步。与小伟FC炉子聊天,发觉自己落下了太多,一步跟不上步步跟不上。接触了php,在beck君的指点下玩了下codeIgniter,用豆瓣的css写了个留言板。入手了梦游的空间,搭了个僵尸站。学会了俯卧撑的初级技巧。貌似小学到高中的小朋友们都赶上了素质教育的春风,都放了假,县里的新华书店压根找不着地方站。读过了《时间旅行者的妻子》和《追风筝的人》,说实在的,在家里读书还真不是状态。
~7月的某天 看到学校上了齐鲁晚报,第二天去学校取档案(貌似还有个毕业典礼?)。回家。
~也是7月的某天 用电话查了成绩(成绩查询的页面真他妈烂!)。貌似568,二本。
~还是7月的某天 去学校填志愿。老子终于再也不用钻你这座王八池子了。
8月的某天 录了。
8月~9月 宅。乒乓。散步。看了开.幕式,觉得一直那里在跳的白衣MM们很可怜。 用codeigniter写了一个疏漏百出的bbs程序和一个todo-list,受够了罪。自己用php从头开始写了一个blog程序,然后重构了下代码。记得如果一切正常,这个程序可以在一个页面中调用80次sql,还没有缓存。倒是对php的编程方式有了个认识。看了闭.幕式。网购了本《设计模式》。济南的姐姐送了我一本《the ruby way》。偶尔拉出了两个球,之前一直不学不会。其实晚上的空气很不好。发现放假前的宏伟计划一件都没实现,管他的。决定写blog。
9月~10月 开学。教官很年轻。阅兵的时候貌似感冒了,没去。入手魅族m6。坐公交车去另个校区报了学校的网站。加了14个社团,里面一帮脑残。没报学生会,里面脑残更多。
10月 跟某老乡一起坐车回家。结果她晕了一路车,没搭上讪。
~7日 在家里继续宅。貌似写了一个feedmash,也算是代码重用吧。
10月~11月 发了图书卡,翻了很多书。《了不起的盖茨比》是经典。被安排去改uchome,orz。用了乌龟的那个svn ,除了commit之外啥都不会。听andelf说函数式貌似很牛逼,翻了下传说中的sicp的前几章,很是神奇。与小伟通了电话。一天一集南方公园。在课堂上装逼,但我不是最能装的。
11月~12月 一天一集南方公园。一个星期坐两次公交车去西校区的工作室。看了很多死人小说,就是那种第一页就让主人公死掉的故事。在学校旁边一个基.督徒的书店里买了本中英对照的圣经。必逃大学生发展导论,军事理论。 硬着头皮看了几本米兰昆德拉。入了函数式的门。对编程有了新的认识。开始译《learn you a haskell for great good》。与李峰通了电话。
12月~ 一天一集南方公园,不过kenny貌似不死了。工作室里几十口子人聚了一次会。安排了一个话剧,不过某种原因到现在还没排练。闲着就YY。豆瓣上记录的已读书目达到98。写了年度总结。
简单试用了下racc,感觉很是不爽。没找到合适的词法分析工具,于是就先用正则过一遍,再交给racc再过一遍,此不爽之一;由于ruby中$1,$2都是变量,为了避免冲突在这里改成了val[0],val[1],$$变成了result,多打不少字先不说,可读性是非常的差,此不爽之二;vim的代码高亮对它不起作用,嵌入代码会别扭的很,此不爽之三。
牢骚完毕,步入正题。racc作为ruby下的语法分析并代码生成工具,可以使用类似yacc的语法来生成文本分析代码。它需要取一组token,按照bnf范式读出其中的内容,用你自己内嵌的代码来分析它。从取token开始,在yacc貌似是通过yylex()来取得token,而这个yylex函数可以用lex按照正则表达式自动生成。很遗憾,没找到ruby下对应的词法分析工具。不过还好,还有正则表达式可以使用,将token先取出来放到一个array中再让racc一次取一个,也就意味着词法分析和语法分析得分步进行,而不能像yacc+lex那般紧密。
按照这个文档里的说法,racc会生成一个继承自Parser的类,这个类中含有一个next_token的抽象方法,你可以继承这个类以提供它的实现,作为词法分析和语法分析的接口,与yacc的yylex函数类似。
如下是语法文件代码,参考自http://bbs.chinaunix.net/viewthread.php?tid=879956 :
class MyParser token #声明token NUMBER #这里只有一个token,在词法分析器使用符号表示,即:NUMBER prechigh #运算符优先级 nonassoc UMINUS #负号与减号相同,这里用另一个符号注明 left '*' '/' #左结合,表示1+2+3这个表达式应该这样算:(1+2)+3,即先取左边后取右边 left '+' '-' preclow rule #描述语法,BNF范式 exp: '(' exp ')' { result = val[1] } | exp '+' exp { result = val[0].to_f + val[2].to_f } | exp '-' exp { result = val[0].to_f - val[2].to_f } | '-' exp = UMINUS { result = -val[1].to_i } | exp '*' exp { result = val[0].to_f * val[2].to_f } | exp '/' exp { result = val[0].to_f / val[2].to_f } | NUMBER end
保存为parser.y, 执行racc parser.y,然后racc就会生成一个名为parser.tab.rb的文件,里面有一个名为MyParser的类,你可以继承或者修改这个类。
感谢ruby的面向对象机制,你可以在另个文件中直接修改这个类
require 'parser.tab.rb' class MyParser def parse(text) @tokens = get_tokens text do_parse end def next_token #词法分析和语法分析的接口 @tokens.shift end def get_tokens(text) #词法分析 reg=/+|*|-|/|d+|(|)/ #正则表达式 tokens=[] text.scan(reg) do |t| tokens < < case t when /d+/ #如果是数字,这个token就是:NUMBER [:NUMBER,t] else [t,t] #我也不知道为什么非得这样 end end return tokens end end
测试代码如下:
parser = MyParser.new p parser.parse(ARGV[0])
保存为test.rb
如下是运行效果:
$ ruby test.rb "12/(1+9)-3"
-1.8update@dec13th孤陋寡闻了,其实过一遍文本是完全可以的,见这里,使用了$`,不过感觉怪怪的~看来要对正则加深理解才行!
前段时间由于没找到传说中的《龙之书》,草草翻了下《编译原理及实战》中对yacc和lex用法的简单介绍,的确是很神奇的东西。
由于是在win32下,而且对C不甚熟悉,心想在ruby中应该也有类似yacc的工具吧,google了一下,找到了racc,于是天真地下了来,里面有个setup.rb,运行之,提示在system(“nmake”)处出现错误。翻了下它的目录,里面有一堆.c文件(为啥没有纯ruby的cc,囧),然后到网上找到了nmake.exe,扔进windows文件夹之后又提示缺少cl.exe,找到cl.exe后又弹出了个alert,提示缺少MSPDB41.DLL,折腾。根据shiningray老师的说法,这几个文件貌似都是windows platform sdk那一套,而且据说在windows下编译成功的概率会很低,得,装cygwin。
在gougou上可以搜到不少cygwin的下载地址,但若是处于编译软件目的话,还是推荐下载那个600m的cygwin,里面的devel包要全。下载完毕,解压,安装。先设置一个root目录,在cygwin下这就是/,c d e f 盘则在/cygdrives之下,然后选择包的目录(解压文件夹即可),一路next。
貌似这个包的ruby版本比较低?到ruby-lang.org下载个ruby源代码,解压,./configure make make install一路搞定,回到racc的源代码目录,执行
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
quote:在运行ruby时可能会有
/usr/bin/ruby: no such file to load — ubygems (LoadError)
的错误提示,执行
unset RUBYOPT
即可
好的,racc安装成功
Administrator@NEWS-4643EE5FFC /cygdrive/e/test
$ racc
racc: no grammar file given
Usage: racc [options]
Options:
-g,–debug output parser for user level debugging
-o,–output-filefile name of output [ .tab.rb]
-e,–executableinsert #! line in output (‘ruby’ to default)
-E,–embedded output file which don’t need runtime
-l,–no-line-convert never convert line numbers (for ruby< =1.4.3)
-c,--line-convert-all convert line numbers also header and footer
-a,--no-omit-actions never omit actions
-v,--verbose create.output file
-O,–log-filefile name of verbose output [ .output]
-C,–check-only syntax check only
-S,–output-status output status time to time
–version print version and quit
–runtime-version print runtime version and quit
–copyright print copyright and quit
racc的文档不多,不过无非也就是yacc在ruby下的翻版,参考一下这个文档再加一点yacc方面的资料应该就足够了