标题:[原创]RegExp DEMO version -- [2]最核心函数代码(中) -- int dealState( ...
只看楼主
rabbit5455
Rank: 2
等 级:论坛游民
帖 子:123
专家分:25
注 册:2004-4-14
 问题点数:0 回复次数:0 
[原创]RegExp DEMO version -- [2]最核心函数代码(中) -- int dealState(SymbolT
===============================================
新版本所有链接如下:
RegExp DEMO version -- [1]正则表达式 TO NFA表格 -- 词法分析代码
RegExp DEMO version -- [2]最核心函数代码(上) -- int dealState(SymbolType symboltype)
RegExp DEMO version -- [2]最核心函数代码(中) -- int dealState(SymbolType symboltype)
RegExp DEMO version -- [2]最核心函数代码(下) -- int dealState(SymbolType symboltype)
RegExp DEMO version -- [3][regexp.h]最核心数据类型
===============================================

case START_REGEXP:
printf("debug: start scan the regexp:\n\t\"%s\"\n", g_strRegExp);
/*做一次状态机开始操作*/
case AND_MACHINE_BEGIN:
/*开始一个子状态机,左括号: '('*/
pmnew = newMachine(NULL, NULL, g_scan_pos, -1, '.', NULL);
pmnew->state_start = newState(); /*状态机开始状态*/
pmnew->state_end = newState(); /*状态机开始状态*/
/*将开始状态与当前状态连接*/
appendStateTable(g_st, pmnew->state_start); /*添加到状态表格*/
setdestState(g_st->curState, g_st->eleCount, pmnew->state_start);
g_st->curState = pmnew->state_start; /*移动到新的状态*/

/*调用这一个状态机,将它的断点,运算模式压入堆栈*/
pushMachine(g_mstk, pmnew);
break; /*AND_MACHINE_BEGIN -- 结束*/
case OR_MACHINE_BEGIN:
/*开始一个或运算子状态机(字母表),左括号: '['*/
pmnew = newMachine(NULL, NULL, g_scan_pos, -1, '|', NULL);
pmnew->state_start = newState(); /*状态机开始状态*/
pmnew->state_end = newState(); /*状态机开始状态*/
/*将开始状态与当前状态连接*/
appendStateTable(g_st, pmnew->state_start); /*添加到状态表格*/
setdestState(g_st->curState, g_st->eleCount, pmnew->state_start);
g_st->curState = pmnew->state_start; /*移动到新的状态*/

/*调用这一个状态机,将它的断点,运算模式压入堆栈*/
pushMachine(g_mstk, pmnew);

getSymbol();
/*处理子状态机的否定模式*/
if (g_symbol_type == NOT_OP) {
g_mstk->topM->not_mode = '^';
getSymbol(); /*继续下一个符号*/
}
/*初始化*/
for (OR_MACHINE_i=0; OR_MACHINE_i<sizeof(g_ele_ary); OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
while (g_symbol_type != OR_MACHINE_END && g_symbol_type != END_REGEXP) {
switch (g_symbol_type) {
case INPUT_ELE:
g_ele_ary[(int)g_symbol_charvalue] = 1;
/*下面处理一下[a-z]这种形式*/
g_lastchar = g_symbol_charvalue; /*备份开始元素*/
/*检查下一个元素是不是LETTER_RANGE*/
getSymbol();
if (g_symbol_type == LETTER_RANGE) {
/*是一个连接符,检查下一个字符是不是INPUT_ELE*/
getSymbol();
if (g_symbol_type == INPUT_ELE) {
/*已经找到一个完整连接符语法,填充这个字母表范围*/
OR_MACHINE_i = (g_lastchar<g_symbol_charvalue) ? (int)g_lastchar : (int)g_symbol_charvalue;
if (g_lastchar<=g_symbol_charvalue) {
g_lastchar = g_symbol_charvalue;
}
for (; OR_MACHINE_i<=(int)g_lastchar; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
} else {
/*连接符后面找不到INPUT_ELE*/
/*忽略这个错误的连接符语法,继续循环*/
continue;
}
} else {
/*不是一个连接符*/
continue;
}
break;
case DOT:
for (OR_MACHINE_i=0; OR_MACHINE_i<(int)'\n'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
for (OR_MACHINE_i=(int)'\n' + 1; OR_MACHINE_i<=sizeof(g_ele_ary); OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
break;
case NUMBER:
for (OR_MACHINE_i=(int)'0'; OR_MACHINE_i<=(int)'9'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
break;
case NOT_NUMBER:
for (OR_MACHINE_i=0; OR_MACHINE_i<=(int)'0'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
for (OR_MACHINE_i=(int)'9' + 1; OR_MACHINE_i<=sizeof(g_ele_ary); OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
break;
case AZaz09_:
for (OR_MACHINE_i=(int)'A'; OR_MACHINE_i<=(int)'Z'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
for (OR_MACHINE_i=(int)'a'; OR_MACHINE_i<=(int)'z'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
for (OR_MACHINE_i=(int)'0'; OR_MACHINE_i<=(int)'9'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 1;
}
g_ele_ary[(int)'_'] = 1;
break;
case NOT_AZaz09_:
for (OR_MACHINE_i=0; OR_MACHINE_i<(int)'0'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
for (OR_MACHINE_i=(int)'9' + 1; OR_MACHINE_i<(int)'A'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
for (OR_MACHINE_i=(int)'Z' + 1; OR_MACHINE_i<(int)'_'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
for (OR_MACHINE_i=(int)'_' + 1; OR_MACHINE_i<(int)'a'; OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
for (OR_MACHINE_i=(int)'z' + 1; OR_MACHINE_i<sizeof(g_ele_ary); OR_MACHINE_i++) {
g_ele_ary[OR_MACHINE_i] = 0;
}
break;
case ALL_SPACE:
for (OR_MACHINE_i=0; OR_MACHINE_i<sizeof(g_ele_ary); OR_MACHINE_i++) {
if (OR_MACHINE_i==' ' || OR_MACHINE_i=='\n'
|| OR_MACHINE_i=='\r' || OR_MACHINE_i=='\t'
|| OR_MACHINE_i=='\f' || OR_MACHINE_i=='\v') {
g_ele_ary[OR_MACHINE_i] = 1;
}
}
break;
case NOT_ALL_SPACE:
for (OR_MACHINE_i=0; OR_MACHINE_i<sizeof(g_ele_ary); OR_MACHINE_i++) {
if (OR_MACHINE_i==' ' || OR_MACHINE_i=='\n'
|| OR_MACHINE_i=='\r' || OR_MACHINE_i=='\t'
|| OR_MACHINE_i=='\f' || OR_MACHINE_i=='\v') {
;
} else {
g_ele_ary[OR_MACHINE_i] = 1;
}
}
break;
default:
}

getSymbol();
}
if (g_symbol_type == END_REGEXP) {
dealState(OR_MACHINE_END);
g_symbol_type = END_REGEXP;
}
return 0; /*通知调用者不必再getSymbol(),这里还有一个未处理*/
break; /*AND_MACHINE_BEGIN -- 结束*/

[此贴子已经被作者于2007-6-3 0:14:58编辑过]

搜索更多相关主题的帖子: DEMO RegExp int STRONG SymbolT 
2007-06-02 23:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-144419-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.516184 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved