/*输出StateTable,测试用*/void showStateTable(pStateTable pst) { pState tmp; pStateCollectionEle pscele; printf("debug: ################### there is the NFA table basic info: #######################\n"); printf("debug: StateCount = %d\n", pst->stateCount); printf("head->%x\tcur...
/*##############################################*//*####### *函数实现* ######################*//*##############################################*//*状态*/pState newState() { pState pS = NULL; pS = (pState)malloc(sizeof(State)); if (pS != NULL) { pS->destStateCollection =...
这里是[regexp.h]的全部代码,所有的数据结构和针对他们的操作函数都在这里了,总揽一下哈: 终结符类型 状态 新建,销毁,置目标状态,克隆 状态集合的元素(相当于一条弧线:输入元素和目标状态) 新建,销毁,克隆 状态集合 新建,销毁,克隆,追加一个状态元素 状态表格 新建,销毁,克隆,追加一个状态,用于调试的showStateTable() 状态机 新建,销毁 ...
case REPEAT_RANGE_M_MORE: /*(A{m,})*/ pst_needed = repeatMachine_needed(g_repeat_m-1, pmnew); if (pst_needed != NULL) { g_st = joinStateTable(g_st, pst_needed); ...
case END_REGEXP: while_notfinish = 0; /*一会儿退出循环*/ printf("debug: end scan the regexp:\n\t\"%s\"\n", g_strRegExp); /*做一次状态机结束操作*/ case OR_MACHINE_END: if (symboltype == OR_MACHINE_END) { ...
case END_REGEXP: while_notfinish = 0; /*一会儿退出循环*/ printf("debug: end scan the regexp:\n\t\"%s\"\n", g_strRegExp); /*做一次状态机结束操作*/ case OR_MACHINE_END: if (symboltype == OR_MACHINE_END) { ...
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<=sizeo...
case OR_MACHINE_BEGIN: /*开始一个或运算子状态机(字母表),左括号: '['*/ pmnew = newMachine(NULL, NULL, g_scan_pos, -1, '|', NULL); pmnew->state_start = newState(); /*状态机开始状态*/ ...
case START_REGEXP: printf("debug: start scan the regexp:\n\t\"%s\"\n", g_strRegExp); /*做一次状态机开始操作*/ case AND_MACHINE_BEGIN: /*开始一个子状态机,左括号: '('*/ pmnew = newMachine(NULL, NULL, g_s...
case BACKTRACE: /*将当前状态与子状态机的结束状态连接*/ setdestState(g_st->curState, (int)g_st->eleCount, g_mstk->topM->state_end); /*将当前状态回退到子状态机的头部,开始一个新的分支*/ g_st->curState = g_mstk->topM->state_start; break; ...
这个函数是状态机的执行部分,他根据getSymbol()函数返回的一个词,来决定正则状态机的行为。下面我来对这其中的一些细节做一下解释:======================================
[1] 在这个DEMO版本中,输入被看作是字节流,像一个汉字会被解析成两个INPUT_ELE, 例如:"王"会被解析为 "\xCD\xF5"。[2] 我的一个比较重要的概念是“子状态机”,被“()”和“[]”包围的都是“子状态机”, 将括号以这种方式独立出来处理,可以很方便的进行各种运算(重复,或,连接)[3] 在[regexp.h]中定义的Machi...
[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次循...
最近想做一个正则表达式的解析工具,目前已经完成了正则表达式向NFA(不确定有穷自动机)表格的转换代码。源代码包在这里下载:====================================== 源代码zip包:regexp.zip======================================我再跟几个帖子把核心代码贴出来一部分:供各位赏玩 。。。readME文件如下:===================================作者:王旭华泰山学院E-MAIL:qfhuazi@163.comQQ: 471600163文件:regexp-win.ex...
最近一直努力的学习编译原理,对于里面提到的“自动机”好好理解了一下,
还感受了一下lex和yacc的强大功能,真是厉害啊 。。。
我的兄弟伦子小朋友想写一个8086的编译解释工具(类似一个虚拟机)。
我对于CPU的理解很简单,它首先可以看成一个数字电路,可以用数字逻辑的方式
来理解,而数字逻辑便是状态机了,状态机会动了,也就是“自动机”了,
“确定的有穷自动机(DFA)”模型与真实的CPU应该是一码子事情了,
而(DFA)对应了一条“正规文法”,
“正规文法”对应了一个“正则表达式”,
“正则表达式”可以转化为一个“不确定的有穷自动机(NFA)”,
(NFA)可以转化为...
这是我的一个帖子,最近我有看了一遍这份代码,感觉还是比较不错,至少是我自己当时的真实水平啊 。。。
纪念一下下 。。。
帖子链接如下:[原创]学生信息管理C语言DOS环境运行[源代码]
替同学写了作业,如下,我同学说看不懂啊 。。。
就添加了很详细的注释,大家有兴趣的就看看吧 。。。==================================================== 代码在第二个,三个帖子中贴出来了,太长了,一个帖子不够用====================================================题目分...