自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (8)
  • 收藏
  • 关注

原创 nothing else left on those streets

二零零八年时我在北京,开始工作的第六个年头,以为自己开始遇到了整个生活的一部分。当时我在三环西边上班,马甸附近的一片老小区中租了一个小房子,离公司不远,每天下班后无事可做,经常长时间的凝视着房间里快要散架的简易衣柜无端感怀,有时对着厨房里的自来水管说两句,水有回音,久之就觉得无趣,只好趁天黑坐着,独自面对宇宙巨大无边的冷漠。那时的我处在20~30这一黄金岁月的中段,全然不知美好的时光正飞快

2013-04-30 14:11:21 496

原创 血拼到底

为减少能源消耗和尾气排放,弥补当前公共交通运力的不足,将出租车目前闲置的运力最大程度的利用,我们推出一种"实时共享出租车拼车系统",小名"二公共". (小狼提供命名) 基本构想: 如果出租车运行路线如下: |              |            |              |            | A ------- 

2009-08-25 00:30:00 1199

原创 boost.spirit -- action

7       actionaction是用来解析完成以后执行某种动作的类,所有的action类使用起来的形式为parser[action]。 一望而知,parser类必定实现了一个operator[]。这个函数实现在基类parser中,被所有的parser继承。         template         actionDerivedT, ActionT> 

2006-08-11 13:00:00 1825

原创 boost.spirit -- subrules

本章内容稍后提供。 

2006-08-11 12:58:00 1312

原创 boost.spirit -- grammar

5       grammargrammar是rule集合的一个封装,用于把一些相关的rule组合到一起,组成一个文法类。 就实现上来说:grammar本身只是一个接口;我们必须定义一个子类,符合grammar的接口定义。(类似于parser) 5.1    grammar规范 要想成为一个合格的grammar,必须满足一下条件。 struct my_gra

2006-08-11 12:57:00 2572 1

原创 boost.spirit -- rule

4       rule4.1    what rule?rule本身是一个parser,rule对象可以作为所有parser的容器。 4.2    why rule? 当你创建了一个复合parser对象,比如:a | b >> c >> *(d >> f)它本身的结果type你很难写出来,应该是:sequence, sequence , kleene_star

2006-08-11 12:56:00 2304

原创 boost.spirit -- directives

3       directives指示器(directives)的作用是改变parser的行为,实际上,大多数directives是通过改变scanner的行为来实现这一点。 3.1    directives.operator[](ParseT)指示器(directives)使用时都是一个形式:directive[parser]directives分为两部分:direc

2006-08-11 12:52:00 1432

原创 boost.spirit -- scanner

2       scanner2.1    scanner classes structure  scanner类是一个符号流扫描器,提供对输入符号流的读取,迭代,是否末尾的判断。scanner提供的方法:operator* (读取当前符号)operator++ (移动到下一个符号)at_end (是否到了当前符号流的末尾?)scanner本身并不实现这

2006-08-10 11:54:00 1784

原创 boost.spirit -- parser

1       parserlocation: spirit/core/parser.hpp parser只提供一个解析类的基本框架,本身并不进行任何解析工作。所有具体的解析工作都是由子类进行。 parser 本身提供一个协议(规范),来标明子类(实际解析类)应该做哪些工作,才能成为一个合格的parser。 1.1    parser规范 1.  继承自

2006-08-10 11:15:00 2176

原创 boost.spirit --- 一个非常精巧的LL文法Parser(1)

boost.spirit,是boost库的一个部分,是一个LL文法解析器,支持EBNF表达式。boost.spirit 本身是一套设计非常精巧的结构,由一系列完全正交的功能模块组成,除去核心的Parser,你可以感觉不到任何其他外围模块的存在。boost.spirit 又一次的将C++ 的各个语言特性威力发挥到极致,尤其对templates的运用令人眼花缭乱,目不暇接,继承了boost

2006-08-10 11:13:00 3468 15

原创 haha!

虽然作为一个传统的C++程序员,一贯喜欢卖弄C++的阴暗晦涩的语言细节;但我目前似乎越来越不喜欢用C++来编程了。尤其作为应用类程序来说,C++所处的层次仍然太低了,程序的可读性也不高。我需要的语言,就是在当我思考业务领域相关的问题的时候,不能被语言设施的障碍所打断。程序代码就是软件的设计说明书,而且是唯一准确的说明书。(无论如何,非形式化的描述语言也不可能比形式化的语言准确),这要求,程序代码是

2006-05-20 15:37:00 1336 1

原创 试用Google Web Toolkit(2)

把GWT中sample目录中的KitchenSink按(1)中的步骤建立一个eclipse工程projectCreator -eclipse KitchenSinkapplicationCreator -eclipse KitchenSink com.google.gwt.sample.kitchensink.client. KitchenSink在把sample/KitchenSink/com/

2006-05-20 14:18:00 1904

原创 试用Google Web Toolkit (1)

http://code.google.com/webtoolkit/前几天网上闲逛,发现一个好东西,google自己开发的Web工具组件库,包括UI,AJAX等等。细看了一下,发现真是个好东西。老实说,本来我对GUI的开发是没什么兴趣的,尤其是拼凑HTML和JAVASCRIPT代码,简直是一场噩梦。但是在这里,你可以统统把他们扔到JAVA(爪哇)国去。如果你是一个JAVA程序员又象我一样讨厌哪些零

2006-05-20 13:26:00 1796

原创 关于编译技术和语言理论的书籍

>我是看这本书入门的,内容很简单,实现了一个tiny的微型语言,各个理论分支浅尝辄止。>这本书我同时买了英文影印和中文版,对于喜欢的书大都这样;毋庸多言,每个喜欢编译技术或是计算机科学的人都会读过它。>差不多是lcc完全注释,非常详细,也非常易懂。我买的是英文原版,花了近500RMB,刚拿到的时候好一阵兴奋,可是差不多半年后,它毫无征兆的从中断裂开来,并且在随后的日子里时不时飞散出零碎的几页。>这

2005-12-29 13:35:00 2471 3

原创 How To Build a Yacc Series

必须要承认,写文章的工作比写代码难的多。 How To Build a Yacc Series的代码全部列举完,目前我能做的就是把以前写好的代码按某些预定的步骤copy&paste, 而要解释他们还需要至少3倍以上的时间。重构的方法论认为,一项工作,无论开始的方法有多么糟糕,先完成它,然后改进它。写文档也可以这么干。

2005-12-28 01:57:00 1812 1

原创 How To Build a Yacc?(14)

既然已经生成了DFA,按照之前的描述写出shift_reduction算法就不是什么了不起的工作了。class Compiler  def initialize(rule_file, src_file)    @yacc = Yacc.new(rule_file)    @lex = ExtendLex.new(src_file)    @parse_stack = Array.new  end 

2005-12-28 01:49:00 1584 1

原创 How To Build a Yacc?(13)

实际上,有了上面的准备后,计算DFA的算法很清楚:class DFA   SHIFT = 1  REDUCE = 2  ERROR = 3  ACCEPT = 4    def initialize()    @state_set = Array.new        @current_state = 0        @max_state = 0    @action_table = Hash.

2005-12-28 01:44:00 1374

原创 How To Build a Yacc?(12)

生成DFA的第1步,计算first集合和follow集合。first_set和follow_set都是一个hast set结构,这个hash的key是一个 vocab,而value是一个集合,用一个array表示,这与普通的hash不同,因此写了一个HashDup的module,其中重写了hash的store方法,用来满足上述要求:###### hashdup.rb ###########modu

2005-12-28 01:41:00 1300

原创 How To Build a Yacc?(11)

分析完rule_file, 最后一个关键的步骤是生成DFA。这是一个比较复杂的过程,首先我们要建立一个Item结构,这样才能构造状态(states)item 应该是一个rule和一个相关的position(当前识别位置)组成。class TestCompiler   def test_item    rule = Rule.parse("function_decl := /      functi

2005-12-28 01:30:00 1209

原创 How To Build a Yacc?(10)

将Vocab和Rule功能组合起来作为一个RuleParser类来提供分析rule_file的功能是个不错的主意,因为对这两个类而言并没有太大的重用的意义,只不过是为了将错误的出现尽可能的控制在局部。class TestCompiler   def test_rule_parser    create_rule_file    p = RuleParser.new("rulefile")    a

2005-12-28 01:06:00 1245

原创 How To Build a Yacc?(9)

考虑该怎么样设计Yacc类。显然,Yacc面临的第1个问题就是分析rule_file的内容。Yacc类本身不应该实现这个功能,因为还有一个功能是生成DFA,这是两个没有多大关系的功能,按照SRP(单一职责原则),不应该在一个类里实现。按照这个设计原则,很容易做出的决定,需要一个类Vocab识别rule_file定义的所有符号(TERMINAL,NONTERMINAL,EOF,START_SYMBO

2005-12-28 00:53:00 1305

原创 How To Build a Yacc?(8)

搞定lex后,很显然,我们要将它加入到Compiler中。class Compiler  def initialize(rule_file, src_file)    @lex = ExtendLex.new(src_file)  end   def run       return true   end end要想在run里面真正的干点事,就需要一个shift-reduction算法来识别sr

2005-12-26 11:11:00 1362

原创 How To Build a Yacc?(7)

代码,还是代码! 要完成一个这样相对复杂的功能,是需要写一些代码,不过我保证,他最终将比你想象的少的多。 我对Lex类还有些不尽满意,实际上,我更希望lex.get_token_string能取得当前符号流中的任何一个符号,而不仅仅是当前的一个符号。。 lex = Lex.new(src) lex.get_next_token assert ( lex.get_token_stri

2005-12-19 17:51:00 1204

原创 How To Build a Yacc?(6)

显然,Compiler至少分为两个明显的部分:一部分是读入源代码,将其转换成符号流,一部分是读入语法规则文件,生成DFA。 先来讨论字符流转换成符号流的部分,由于这部分不是讨论的重点,就利用了目前已经相当通用的技术lex。 如果要想在ruby环境中利用lex工具生成的c代码,只有把c代码封装成ruby的扩展库。 lex怎么工作的? 首先编写一个lex的输入文件: // prog.l %{

2005-12-19 17:42:00 1324

原创 How To Build a Yacc?(5)

现在是时候来讨论How To Build a Yacc?(1)中的最初提出的问题了。。 如何判断一段代码是否符合预定义的syntax rules,毫无疑问:用你的眼睛和大脑配合也能完成这个任务,或许你还需要一张白纸,以计算syntax rules生成的DFA和stack。但是在有计算机的情况下,谁还会用人脑去代替计算机呢? 用计算机来实现这个功能,有了上面的讨论后,一切似乎很明了:读入synt

2005-12-19 17:41:00 1335

原创 How To Build a Yacc?(4)

有了DFA,接下来的事情好办多了,只要写一个DFA识别算法就完了,通常我们把这个算法称为移进-规约算法(shift-reduction)。借助一个stack来描述shift-reduction:1) 初始时,stack存放初始状态S12) 取符号流中下一个符号(token),在DFA中查找是否有边S1(token) --> SX,如果有,将符号(token)移进stack, 并

2005-12-19 17:40:00 1230

原创 How To Build a Yacc?(3)

在(2)中,我们阐述了一个简单高效的分析方法,最终产生一个文法的最左推导(即每次优先扩展左边的NONTERMINAL) 但是递归下降算法有些许局限性,比如:对于两个不同的NONTERMINAL,如果他们的FIRST集合有交集的话,就会产生歧义,很显然,当目前的符号分别属于两个不同的NONTERMINAL的FIRST集合时,就无法决定采用哪个产生式了。 我们来考虑另外一种分析方法,与递归下降相反

2005-12-19 17:38:00 1553

原创 How To Build a Yacc?(2)

如何识别一段代码是否符合定义的文法? 如上面的例子: function foo(kick, so, by); 首先,技术上来说,代码文本是一段字符流,f, u, n, c....,而我们文法识别的最小级别是符号(token), 所以需要将其转化为符号流,这个功能可以很容易的用lex实现,这个步骤不是讲述重点,不加详细叙述。 最直接的识别方法,以function_decl文法为例,我们从符号流

2005-12-19 17:36:00 1347

原创 How To Build a Yacc?(1)

Yacc 是什么?编译器的编译器。简单来说,Yacc读入一套语法定义规格(syntax rules), 然后分析一段代码(source code), 判断代码是否符合定义好的syntax rules。语法定义规格是由形式化的BNF表达式来定义;目前大多数语言都可以用它来定义。一个BNF表达式由一个NONTERMINAL(非终结符)和它的产生式组成,产生式可以是终结符(T

2005-12-19 17:34:00 1733 1

原创 为什么需要程序评论家?

       我所说的程序评论,与程序评测不一样;关注的重点不再是程序完成的功能,运行的速度,系统资源的占用,人机界面的观感;它更为倚重的是:程序原始代码所表现的形式美,韵律美与逻辑美.简而言之,源代码表现一切.如果程序设计也与艺术堪可比拟的话,无疑,源代码是这门艺术的最好载体.程序评论为程序设计的发展打通另一条出路,程序将不一定总向着更快,更高,更强的方向,程序评论将更关注程序本

2005-08-23 17:57:00 1218

原创 阅读lcc(2)

41 编译器的一般结构1.1 规范流程编译技术之所以在计算机科学领域内成为一个实践相对成熟的技术,很大程度上是因为几乎所有的编译器都遵循着一个严格的流程,而且在流程的每个部分都有完整的理论框架和足够多的实现工具.这使得每个编译器在设计的时候考虑的仅仅是在每个步骤中选择什么样的技术来实现.这给编译器的设计者留出了足够多的时间去关注语言特性本身的设计.就现代编译器来说,一段源代码最终转换为一段目标机器

2005-08-05 22:52:00 2544 1

原创 阅读lcc (1)

1. why lcc?工作上的事少了,稍有闲暇,决定强迫自己重拾对技术的热情;由于一直以来都在心不在焉的学编译技术,所以先找个合适的编译器来看看吧.为什么选择lcc ?  原来是要打定主意啃该死的gcc, 不过那太庞大了,为了避免半途而废,还是找个小规模的,lcc颇合我意,再加上有>助阵,心里多少有几分把握.如果有>在手边阅读lcc会事半功倍,因为lcc的代码几乎没有注释,真见鬼; 估计是这样做是

2005-08-03 21:06:00 3291 4

原创 GOD is a DJ

先知教会我们知识,但不赐予我们力量;上帝创造我们身体,但不注入我们生命

2004-06-23 21:54:00 1426

原创 NB OS Release 1.0 Message

新写的操作系统,基本模块都已经搞定,不过名字还没想好,暂时代号叫NB吧。主要竞争对手是Microsoft的下一代操作系统Longhorn.公开部分核心源代码,想来你们也看不懂,无所谓;顺便提一下,所有源代码都是用我新发明的语言MFC(当然不是Microsoft的MFC,而是Mother Fucking Cool)写的。Module Kernel{ members

2004-06-23 21:50:00 1197

原创 Midnigth In A Perfect World

做一个程序员,这真是让人腻烦的一件事儿。 没有足够的才华供我支配---这让我觉得恼火,甚至嫉妒,你瞧,他们是多么有思想! “当爱情要来的时候,你躲都躲不掉”,我挺喜欢这句话,我都觉得自己是否躲的姿态太逼真了,要不然怎么那些丑丫头都不敢靠近呐。 我又一次的买了很多书,这可是我故做深沉的前提,我躺在沙发上瞪大着眼睛看着它们,不时还露出会心的微笑,好象我真的看懂了一样。

2004-06-23 21:48:00 1212

Linux.System.Programming.pdf (linux系统编程)

权威的linux系统编程的指导 设计文件系统,共享内存,进程间通讯

2009-08-23

Essential.Linux.Device.Drivers.chm

这个书比linux设备驱动程序更全面,内容更丰富

2009-05-17

HadoopMapReduceArch.pdf

introduce to hadoop mapreduce framework

2008-12-28

Gcc核心源代码.pdf

Gcc核心源代码 gcc 源代码分析 结构分析

2008-12-28

面向模式的软件体系结构 Vol.2

Pattern-Oriented Software Architecture Vol.2.pdf 面向模式的软件体系结构 Vol.2

2008-09-16

面向模式的软件体系结构 Vol.1

Pattern-Oriented Software Architecture Vol.1 - A System of Patterns.pdf 面向模式的软件体系结构

2008-09-16

gfs-sosp2003.pdf

google file system ssdfdf

2008-09-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除