1203正规式转换为有穷自动机
1 #include<stdio.h>2 #include <ctype.h>3 #define ok 14 #define error 05 #define MAXREGLUARLONG 406 #define MAXSTATELONG 40 7 #define MAXCAHRSLONG 40 8 typedef int state;9 int iCurrentState=0; //初态以1开始10 int iPreState=0;11 int iLastForkState=0;12 int iForkState=0;13 int iMaxState=0;14 char cRegluarSting[MAXREGLUARLONG]; //输入的正规式字符串15 char cCharSet[MAXCAHRSLONG]; //字符集16 int iStateMatrix[MAXSTATELONG][MAXCAHRSLONG]; //状态转换矩阵17 state vStoreRegluarSting()//把字符串读入一个缓冲区中18 {19 scanf("%s",cRegluarSting);20 return ok;21 }22 state vPreProcessRegluarSting()23 //对字符串进行预处理,去掉字符串里面的对分析不产生影响24 {25 int i=0;26 while(cRegluarSting[i]!='\0')27 {28 if(cRegluarSting[i]=='*')29 {30 int j=i+1;31 while(cRegluarSting[j-1]!='\0')32 { 33 cRegluarSting[j-1]=cRegluarSting[j++]; 34 }35 }36 i++;37 }38 return ok;39 }40 void vConstructStateMatrix(char cChar,int istate)//构造状态转换矩阵41 {42 int i;43 for(i=0;cCharSet[i]!='\0';i++)44 if(cChar==cCharSet[i])45 break;46 cCharSet[i]=cChar;47 iStateMatrix[iPreState][i]=istate;48 }49 void vAanalyseRegluarSting()//对字符串进行从左到右的分析与处理50 {51 int i=0;52 for(i=0;cRegluarSting[i]!=0;i++)53 {54 if(cRegluarSting[i]=='(') //NFA出现开始分叉情况55 {56 int iTheFirstl=0;57 int iCharNumBeforl=0;58 iForkState=iCurrentState;59 while(cRegluarSting[i]!=')')60 { 61 i++;62 if(isalpha(cRegluarSting[i]))63 {64 if(cRegluarSting[i+1]==')')65 iCurrentState=iLastForkState;66 else67 iCurrentState++;68 iCharNumBeforl++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);69 iPreState=iCurrentState;70 if(iCurrentState>iMaxState)71 iMaxState=iCurrentState;72 }73 if(cRegluarSting[i]=='|')74 {75 iPreState=iForkState;76 if(iTheFirstl==0)77 {78 iLastForkState=iCurrentState; 79 iTheFirstl++;80 }81 if(iCharNumBeforl==1&&cRegluarSting[i+2]=='|')82 iCurrentState=iForkState;83 iCharNumBeforl=0;84 }85 if(cRegluarSting[i]==')')86 {87 iPreState=iForkState=iLastForkState;88 iCurrentState=iMaxState;89 }90 }91 }92 else93 { 94 if(isalpha(cRegluarSting[i]))95 {96 iCurrentState++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);97 iPreState=iCurrentState;98 if(iCurrentState>iMaxState)99 iMaxState=iCurrentState; 100 } 101 } 102 } 103 } 104 void vPrintfStateProjectFunction() 105 { 106 int icCharSetPointer; 107 int iPreStatePointer; 108 for 109 (iPreStatePointer=0;iPreStatePointer<MAXSTATELONG;iPreStatePointer++) 110 for(icCharSetPointer=0;icCharSetPointer<MAXSTATELONG;icCharSetPointer++) 111 if(iStateMatrix[iPreStatePointer][icCharSetPointer]>0) printf("&(%d,%c)=%d\n",iPreStatePointer,cCharSet[icCharSetPointer],iStateMatrix[iPreStatePointer][icCharSetPointer]); 112 } 113 void vPrintfNfa()//输出NFA 114 { 115 int iStateNumble; 116 int i=0; 117 printf("NFA的形式为:(S,$,&,S0,F)\n\n以下为NFA的具体集合内容:\n\n"); 118 printf("字符集$为:{"); 119 while(cCharSet[i]!=0) 120 if(cCharSet[i+1]==0) 121 printf("%c",cCharSet[i++]); 122 else 123 printf("%c,",cCharSet[i++]); 124 printf("}\n"); 125 printf("\n状态集S为:{"); 126 for (i=0;i<=iMaxState;i++) { 127 if(i==iMaxState) 128 printf("%d",i); 129 else 130 printf("%d,",i); 131 } 132 printf("}\n\n"); 133 vPrintfStateProjectFunction(); 134 printf("\n初态集S0为:{0}\n\n"); 135 printf("终态集F为:{%d}",iMaxState); 136 } 137 void main() 138 { 139 vStoreRegluarSting(); 140 vPreProcessRegluarSting(); 141 vAanalyseRegluarSting(); 142 vPrintfNfa(); 143 }
![](/assets/blank.gif)
![](/assets/blank.gif)
转载于:https://www.cnblogs.com/RSTART/p/5017474.html
1203正规式转换为有穷自动机相关推荐
- 正规式转换为NFA代码实现
问题引入 正规式是一种编译原理课程中经常提到的描述文法的语法规则,与正则表达式有相同之处,但并不是同一个概念.有效的正规式的字母表∑ = { a − z , A − Z } . 所有的正规式中的符号以 ...
- byyl - 【词法分析】正规式
目录 什么是正规式? 正规式表示什么? 正规式与之对应的正规集 正规式转正规文法 正规文法转正规式 -------------------------------- 识别正规集的工具 DFA及表示 N ...
- 正规式到最小化DFA
整体的步骤是三步: 一.先把正规式转换为NFA(非确定有穷自动机) 二.在把NFA通过"子集构造法"转化为DFA 三.在把DFA通过"分割法"进行最小化 一.正 ...
- 【编译原理】词法分析(正规式与自动机)
文章目录 一·单词的形式化描述工具 二·有穷自动机(有限自动机) 三· 正规式和有穷自动机的等价性 四· 正规文法和有穷自动机的等价性 一·单词的形式化描述工具 ▶ 正规文法 即3型文法,是一个四元式 ...
- 编译原理——正规式、NFA转换构造DFA、DFA的化简
一.DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边: NFA的初态可以具有多个,DFA的初态是唯一的: 比如 ...
- 词法分析(五):正规式与有限自动机
词法分析概述 唉,不想学习,老是想起别的事情 这篇博客讲的是正规式和有限自动机的等价性, 为NFA写出等价的正规式,为一个正规式构造等价的NFA 有了NFA与正规式的关系,就把正规式和前面所述串接起来 ...
- 有回路的有穷自动机转化为正规式的方法
在网上,大多数在介绍将有穷自动机转化正规式的方法的文章,都只列了如下三条: 其实,只要这三条就可以了.但是大家可能会碰到下面这种有穷自动机而不知道怎么办: 不错,这个自动机是一个回路,与上面那三种图都 ...
- 编译原理 | 由正规式构造确定的有穷自动机DFA
词法分析: 由正规式构造确定的有穷自动机DFA 解题方法 1. 先由正规式构造转换系统 规则见下图: 2. 再由转换系统构造确定有穷自动机DFA (1) 求 Ia 假定 I 是转换图状态集 K 一个子 ...
- 有穷自动机到正规式的转换
有穷自动机到正规式的转换 将转换图的概念加以拓广,令其中的每条弧都可以用一个正规式标记,具体方法如下. 首先,在 M 的转换图上添加两个结点: X 结点和 Y 结点,从 X 结点用 ε 连线连接到 M ...
最新文章
- 多系统交互中DBA该确认的一些事情
- jquery实现点击浏览器后退,上一页面自动刷新
- spring boot参数为日期的查询
- 福步怎么自定义头像_苹果手机怎么截屏 苹果手机截屏方法有几种?原来还可以这么操作...
- python之metaclass
- java 问题排查_JAVA问题排查笔记
- Android---手动创建线程与GUI线程同步(三)
- SAP UI5:how to connect mock data
- oracle维护常用SQL语句(查看系统表和视图)
- bash: shasum: command not found
- day08面向对象+
- Iframe和Frame中实现cookie跨域的方法(转载)
- 【渝粤教育】国家开放大学2018年秋季 2780T遗传与育种 参考试题
- 9. Doctrine2
- 计算机编程 设计入门,计算机编程入门图文教程_计算机程序设计教程,计算机编程入门教程-其它文档类资源...
- 我常用的Windows软件
- docke网络之bridge、host、none
- 实用的 Python 自动化办公技巧
- 手机拍照技巧(一:校园拍摄)
- CoherenceModel官网翻译
热门文章
- tableau使用_使用Tableau探索墨尔本房地产市场
- 为什么银行没有厕所?内急了怎么办!
- mysql 层_mysql三层体系
- python range函数怎么表示无限_Python for循环与range函数的使用详解
- mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~
- 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
- 华为2014校园招聘的机试题目
- 【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现
- 【caffe-matlab】权重以及特征图的可视化
- Flask--WebSocket