[regexp.c]中主要函数声明和源代码
下面是主要的函数声明:
======================================
SymbolType getSymbol(); /*词法分析函数,返回一个符号的类型和它的值*/
int dealState(SymbolType symboltype); /*处理输入状态*/
void repeat_needed(int m, int eleindex); /*{m,n}生成必选的m次循环状态表*/
void repeat_optional(int n, int eleindex); /*{m,n}生成可选的n次循环状态表*/
pStateTable repeatMachine_needed(int m, pMachine pm); /*A{m,n}生成必选的m次循环状态表*/
pStateTable repeatMachine_optional(int n, pMachine pm); /*A{m,n}生成可选的n次循环状态表*/
int getASCII(char c); /*得到c的ASCII码*/
====================================
下面是语法解析的驱动部分,用了一个while来驱动这个自动机来运做,
里面对状态的具体处理都放在了函数dealState()中,注释很详细就不多说了 。。
========================================
/*核心解析函数: 语法分析部分*/
int regexp_main() {
/*初始化 g_st & g_mstk*/
g_st = newStateTable(256); /*0-255, 256是epsilon(空)*/
appendStateTable(g_st, newState()); /*开始状态*/
g_st->curState = g_st->head;
g_mstk = newMachineStack(); /*堆栈空*/
g_scan_pos = -1;
g_symbol_type = START_REGEXP;
while_notfinish = 1; /*表达式扫描循环条件,在END_REGEXP中会置0*/
while (while_notfinish) {
if (dealState(g_symbol_type) == 1) {
/*下一个符号,在前面的switch()中,
有些预先读取一个词的分枝会用continue语句会跳过这里*/
getSymbol();
}
}
/*输出StateTable,测试用*/
showStateTable(g_st);
destroyStateTable(g_st);
destroyMachineStack(g_mstk);
/*
printf("debug: press anykey to continue ...\n");
getch();
*/
return 0;
}
=======================================
这里是词法分析的函数,他从一个正则表达式中读区一个特定的词,并返回类型,
具体的功能各位看代码吧,不算复杂,我的文档还没有整理完毕。
这里面的枚举类型:SymbolType(在[regexp.h]中)的定义也一块贴出来了,以便各位参考。
=======================================
typedef enum SymbolType_enum {
UNKNOWN = 0,
END_REGEXP,
START_REGEXP,
INPUT_ELE,
REPEAT_ZERO_MORE, REPEAT_ZERO_ONCE, REPEAT_ONCE_MORE,
REPEAT_RANGE_MN, REPEAT_RANGE_M, REPEAT_RANGE_M_MORE,
AND_MACHINE_BEGIN, AND_MACHINE_END,
OR_MACHINE_BEGIN, OR_MACHINE_END,
NOT_OP, DOT, BACKTRACE,
NUMBER, NOT_NUMBER,
&n
- rabbit5455: 是,在泰安浪潮的科技园, 那里的环境挺好 。。 我由于其他原因,没有去里面实习工作
- rabbit5455:是[emot]1[/emot]
- rabbit5455:我不是,我和我女友通过了全部四轮面试,笔试, 最后发现,我们的时间太紧张,他们要求的一个月1...