RegExp DEMO version -- [3]核心函数(1)dealState()

作者在 2007-06-02 21:33:00 发布以下内容
这个函数是状态机的执行部分,
他根据getSymbol()函数返回的一个词,来决定正则状态机的行为。

下面我来对这其中的一些细节做一下解释

======================================

[1] 在这个DEMO版本中,输入被看作是字节流,像一个汉字会被解析成两个INPUT_ELE,
      例如:"王"会被解析为 "\xCD\xF5"。
[2] 我的一个比较重要的概念是“子状态机”,被“()”和“[]”包围的都是“子状态机”,
      将括号以这种方式独立出来处理,可以很方便的进行各种运算(重复,或,连接)
[3] 在[regexp.h]中定义的Machine结构中,记录着一个子状态机的很多属性,如下:
       开始状态,结束状态 --- 将这个子状态机看成一端口网络,
                                       这样在进行运算时可以采用和INPUT_ELE相同的处理方式;
       开始位置,结束位置 --- 这个保留,目前还没有使用;
       连接模式,否定模式 --- 这个目前只是用到了“否定模式”,
                                       这些都是为以后更加强大的功能做铺垫的;
[4] 字节流的输入元素范围是[0-255],输入元素[256]代表“空”,在编译原理中叫“epsilon”;
[5] 在字母表的处理方法:char g_ele_ary[256];     /*用来做字母表有效置1,否则置0*/
      大家都是程序员,用代码来说明最直接不过了;
      [abc]     --- 将g_ele_ary['a'],g_ele_ary['b'],g_ele_ary['c'] 置 1,其余置 0;
      [^abc]   --- 将g_ele_ary['a'],g_ele_ary['b'],g_ele_ary['c'] 置 0,其余置 1;
      在OR_MACHINE_END状态时,遍历字母表,如果是否定模式就将g_ele_ary[]中为 0 的加入NFA表格;
      否则,将g_ele_ary[]中为 1 的加入NFA状态表格;
[6] 重复运算的实现方法:* + ?比较好办,在两个状态之间加上合适的epsilon弧线就可以了;
      {m} {m, } {m,n}这个不好办,目前的方法是模仿宏扩展,克隆m或n个被重复对象;
      m被称为repeat_needed,n被称为repeat_optional,对于INPUT_ELE和MACHINE分别编写了函数;
[7] 先说这么多吧,有什么问题,可以先看代码,实在看不懂的可以问我。

===============================================

/*状态机输入响应部分,定义了各个状态的具体行为*/
int dealState(SymbolType symboltype) {
     int OR_MACHINE_i;
         switch (symboltype) {
             case DOT:
             case NUMBER:
             case NOT_NUMBER:
             case AZaz09_:
             case NOT_AZaz09_:
             case ALL_SPACE:
             case NOT_ALL_SPACE:

                 /*模拟输入字母表中的每个元素*/
                                 pmnew = newMachine(NULL, NULL, g_scan_pos, -1, '|', NULL);
     
C语言 | 阅读 1253 次
文章评论,共0条
游客请输入验证码