2008年9月25日星期四






首先阅读Boost源码剖析之:容器赋值-assign

咋一看这段代码,
std::vector<int> i_v;

i_v += 1, 2, 3, 4, 5;
按常理来说是执行i_v+=1, 后面的2,3,4,5是不跟i_v搭界的。但是在这里就不同了。

首先i_v+=1, 这段要实现就必须重载+=操作符号。实现的代码大概是这样的。
template<class V, class A, class V2>

void operator+=(std::vector<V,A>& c, V2 v)

{

    return c.push_back(v);

}
然后是要解决逗号的问题。 按照文章中的解释是,std::cout<< 1 << 2 << 3; 此处的<<和assign中的逗号其实是一个道理。

接下来是解决输入2的问题。 如果上一步的操作返回为空,就不行了,这样的话就连接不起来了。如果返回std::vector对象呢,则中间缺少操作符。所以要对上面的重载操作做一些手术,人工添加个()重载操作,这样就多一层函数的嵌套。
template<class V, class A, class V2>
void operator+=(std::vector<V,A>& c, V2 v)
{
    return push_back(c)(v);
}

push_back返回的类具有()重载操作,可以这样实现:
template< class C >
class_has_op// 具有()重载操作, 构造函数中都保存vector
push_back( C& c )
{
return make_class_has_op(c);
}
class  class_has_op
{
   operator()(V2 v)
  {
     this.push_back(v);
  }
}

到这里才发现这样的方法行不通!!
// assignment.cpp : Defines the entry point for the console application.
//

// #define ASSIGN_LIB
#include "stdafx.h"
#include <vector>
#include <map>
#include <string>

using namespace std;
#ifdef ASSIGN_LIB
    #include "boost/assign/std/vector.hpp"
    #include "boost/assign/list_inserter.hpp"
    using namespace boost::assign;
#endif

#ifndef ASSIGN_LIB

template<typename C1>
class list_inserter
{
public:
    C1& c_;
    list_inserter(C1& c) : c_(c)
    {
    }
    template<class T>
    void operator()(T r)//这里存在问题,连接不上!!没有返回list_inserter对象
    {
        c_.push_back(r);
    }
};

template<class C1>
list_inserter<C1>
make_list_inserter(C1 &c)
{
    return list_inserter<C1>(c);
}

template <typename C >
list_inserter<C>
push_back(C& c)
{
    return make_list_inserter(c);
}
template <typename V, typename A, typename V2>
list_inserter<std::vector<V, A>>
operator+=(std::vector<V, A>&c, V2 a)
{
    return push_back(c)(a);
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> i_v;
    i_v += 2;
   
#ifdef ASSIGN_LIB
    i_v += 1, 2, 3, 4, 5;
    printf("%d", i_v.size());
    map<string, int> months;
    insert(months)
        ("January", 31)("February", 28);
#endif
    return 0;
}



为完整解决上面的问题,list_inserter还需要实现逗号的重载类和一个封装好的FUNCTION函数,该函数的功能是计算结果,然后有list_inserter返回本身的对象。




2008年9月24日星期三






    最近准备在完成了正则表达式引擎之后,好好的读一下Boost.spirit 的源代码。
可惜前面一项工作不知道什么时候完成呢。需要设计好的数据结构,使用合理的算法,清晰的思路来解决。
MS Blogger没法写过多的代码,否则就上传不了。。。工作还有许多啊

在网上找到一些资料,还没看呢
http://www.cs.princeton.edu/courses/archive/spr05/cos126/lectures/


2008年9月16日星期二
















最近计划做一个正则表达式引擎, 第一步是将正则表达式解析成需要的树形数据结构。

首先了解一下正则表达式的语法:








2008年9月9日星期二

2.3 The Chomsky hierarchy of grammars and languages
自动机理论: 形式语言和形式文法
乔姆斯基层级文法语言极小自动机
类型 0无限制递归可枚举图灵机
n/a(无公用名)递归判定器
类型 1上下文有关(content-sensitive)上下文有关线性有界
n/a附标附标嵌套堆栈
n/a树-邻接适度上下文有关嵌入下推
类型 2上下文无关(content-free)上下文无关非确定下推
n/a确定上下文无关确定上下文无关确定下推
类型 3正则(Regular grammars)正则有限
每个语言或文法范畴都是其直接上面的范畴的真子集

这里涉及到几个概念:上下文无关文法 ,BNF (Backus-Naur Form)(巴克斯-诺尔范式)经常用来表达上下文无关文法。 这里还要补充一个类型4 Finite-choice grammars.在该文法的右边不存在非终结符。
    



2008年9月6日星期六

This is first test page edit by google docs ,and post to google blogger.

Google Docs's edit function is power than gogole blogger. So I'll edit in docs then post to blogger. 

2008年9月5日星期五

今天用了大半天调试了一个BUG, 是这样的:

Command not processed, because id is 0x1798
Data Abort: Thread=82d07480 Proc=801e6610 'gwes.exe'
AKY=00004009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=82d8c904 Proc=801e6610 'gwes.exe'
AKY=00002009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=837e24a8 Proc=801e6610 'gwes.exe'
AKY=00000049 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.

最后调试出来是在::PostMessage(HWND_BROADCAST, WM_COMMAND, wparam, lparam);
(这边我传递的lparam不是0,而是RADIO msg.)
后出错的,在GOOGLE了之后,貌似WM_COMMAND的lparam本来是控件ID。
具体原因还要进一步研究。

ps:LL语法分析做的太慢了!. 完了之后结合ParsingTechs书,做一个正则表达式引擎,当然呀在条件允许的情况下了。


2008年9月2日星期二

这是使用google 自己的浏览器写的文章,确实不错,简单实用!其他功能还要研究研究,不知道有没有广告过滤功能.
最近要做的事:
1. LL(1)文法分析
2. SLR 语法分析
代码地址在:https://scompiler.googlecode.com/svn/trunk/

需要完成的函数:
消除左递归
first, follow, select 集构造
LL SLR 语法分析表


换个新地方。初次看起来这里比CSDN好多了!