RegExp DEMO version -- [2]词法分析代码

作者在 2007-06-02 21:06:00 发布以下内容

[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
C语言 | 阅读 1116 次
文章评论,共0条
游客请输入验证码