正则表达式解析 -- 词法分析部分[这个是老版本了]

作者在 2007-05-19 09:24:00 发布以下内容

最近一直努力的学习编译原理,对于里面提到的“自动机”好好理解了一下,

还感受了一下lex和yacc的强大功能,真是厉害啊 。。。

我的兄弟伦子小朋友想写一个8086的编译解释工具(类似一个虚拟机)。

我对于CPU的理解很简单,它首先可以看成一个数字电路,可以用数字逻辑的方式

来理解,而数字逻辑便是状态机了,状态机会动了,也就是“自动机”了,

“确定的有穷自动机(DFA)”模型与真实的CPU应该是一码子事情了,

而(DFA)对应了一条“正规文法”,

“正规文法”对应了一个“正则表达式”,

“正则表达式”可以转化为一个“不确定的有穷自动机(NFA)”,

(NFA)可以转化为(DFA),呵呵 。。。

累了,想去睡觉去了 。。。

怎么看来看去,就是个圈啊 。。。

呵呵:“正则表达式” == (DFA)

这几天一直都在分析正则表达式的词法,语法 。。。

把正则表达式的词法分析图画了出来,代码在后面

(图片比较大,点击查看大图,那样清楚

正则表达式计算模型

代码也写好了,如下:

 

 /*词法分析,取得一个符号*/
SymbolType getSymbol() {
    char *cc = &g_symbol_charvalue;
    char tmp; /*临时变量*/
    *cc = g_strRegExp[++g_scan_pos];
    if ((*cc>='0' && *cc<='9') || (*cc>='a' && *cc<='z') || (*cc>='A' && *cc<='Z')) {
        return g_symbol_type=INPUT_ELE;
    }
    /*正则表达式结尾*/
    if (*cc == NULL) {return g_symbol_type=END_REGEXP;}
    if (*cc == '(') {return g_symbol_type=AND_MACHINE_BEGIN;}
    if (*cc == ')') {return g_symbol_type=AND_MACHINE_END;}
    if (*cc == '[') {return g_symbol_type=OR_MACHINE_BEGIN;}
    if (*cc == ']') {return g_symbol_type=OR_MACHINE_END;}
    if (*cc == '|') {return g_symbol_type=BACKTRACE;}
    if (*cc == '^') {return g_symbol_type=NOT_OP;}
    if (*cc == '.') {return g_symbol_type=DOT;}
    /*转义字符*/
    if (*cc == '\\') {
        *cc = g_strRegExp[++g_scan_pos];
        if (*cc == 'd') {return g_symbol_type=NUMBER;}
        if (*cc == 'D') {return g_symbol_type=NOT_NUMBER;}
        if (*cc == 'f') {*cc = '\f'; return g_symbol_type=INPUT_ELE;}
        if (*cc == 'n') {*cc = '\n'; return g_symbol_type=INPUT_ELE;}
        if (*cc == 'r') {*cc = '\r'; return g_symbol_type=INPUT_ELE;}
        if (*cc == 't') {*cc = '\t'; return g_symbol_type=INPUT_ELE;}
        if (*cc == 'v') {*cc = '\v'; return g_symbol_type=INPUT_ELE;}
        if (*cc == 's') {return g_symbol_type=ALL_SPACE;}
        if (*cc == 'S') {return g_symbol_type=NOT_ALL_SPACE;}
        if (*cc == 'w') {return g_symbol_type=AZaz09_;}
        if (*cc == 'W') {return g_symbol_type=NOT_AZaz09_;}
        /*16进制*/
        if (*cc == 'x') {
            tmp = g_strRegExp[++g_scan_pos];
            if (tmp>='0

C语言 | 阅读 1549 次
文章评论,共0条
游客请输入验证码