作者在 2007-06-02 21:33:00 发布以下内容
这个函数是状态机的执行部分,
他根据getSymbol()函数返回的一个词,来决定正则状态机的行为。
下面我来对这其中的一些细节做一下解释:
======================================
===============================================
他根据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] 先说这么多吧,有什么问题,可以先看代码,实在看不懂的可以问我。
例如:"王"会被解析为 "\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);
 
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);
 
文章评论,共0条