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 }

转载于:https://www.cnblogs.com/RSTART/p/5017474.html

1203正规式转换为有穷自动机相关推荐

  1. 正规式转换为NFA代码实现

    问题引入 正规式是一种编译原理课程中经常提到的描述文法的语法规则,与正则表达式有相同之处,但并不是同一个概念.有效的正规式的字母表∑ = { a − z , A − Z } . 所有的正规式中的符号以 ...

  2. byyl - 【词法分析】正规式

    目录 什么是正规式? 正规式表示什么? 正规式与之对应的正规集 正规式转正规文法 正规文法转正规式 -------------------------------- 识别正规集的工具 DFA及表示 N ...

  3. 正规式到最小化DFA

    整体的步骤是三步: 一.先把正规式转换为NFA(非确定有穷自动机) 二.在把NFA通过"子集构造法"转化为DFA 三.在把DFA通过"分割法"进行最小化 一.正 ...

  4. 【编译原理】词法分析(正规式与自动机)

    文章目录 一·单词的形式化描述工具 二·有穷自动机(有限自动机) 三· 正规式和有穷自动机的等价性 四· 正规文法和有穷自动机的等价性 一·单词的形式化描述工具 ▶ 正规文法 即3型文法,是一个四元式 ...

  5. 编译原理——正规式、NFA转换构造DFA、DFA的化简

    一.DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边: NFA的初态可以具有多个,DFA的初态是唯一的: 比如 ...

  6. 词法分析(五):正规式与有限自动机

    词法分析概述 唉,不想学习,老是想起别的事情 这篇博客讲的是正规式和有限自动机的等价性, 为NFA写出等价的正规式,为一个正规式构造等价的NFA 有了NFA与正规式的关系,就把正规式和前面所述串接起来 ...

  7. 有回路的有穷自动机转化为正规式的方法

    在网上,大多数在介绍将有穷自动机转化正规式的方法的文章,都只列了如下三条: 其实,只要这三条就可以了.但是大家可能会碰到下面这种有穷自动机而不知道怎么办: 不错,这个自动机是一个回路,与上面那三种图都 ...

  8. 编译原理 | 由正规式构造确定的有穷自动机DFA

    词法分析: 由正规式构造确定的有穷自动机DFA 解题方法 1. 先由正规式构造转换系统 规则见下图: 2. 再由转换系统构造确定有穷自动机DFA (1) 求 Ia 假定 I 是转换图状态集 K 一个子 ...

  9. 有穷自动机到正规式的转换

    有穷自动机到正规式的转换 将转换图的概念加以拓广,令其中的每条弧都可以用一个正规式标记,具体方法如下. 首先,在 M 的转换图上添加两个结点: X 结点和 Y 结点,从 X 结点用 ε 连线连接到 M ...

最新文章

  1. 多系统交互中DBA该确认的一些事情
  2. jquery实现点击浏览器后退,上一页面自动刷新
  3. spring boot参数为日期的查询
  4. 福步怎么自定义头像_苹果手机怎么截屏 苹果手机截屏方法有几种?原来还可以这么操作...
  5. python之metaclass
  6. java 问题排查_JAVA问题排查笔记
  7. Android---手动创建线程与GUI线程同步(三)
  8. SAP UI5:how to connect mock data
  9. oracle维护常用SQL语句(查看系统表和视图)
  10. bash: shasum: command not found
  11. day08面向对象+
  12. Iframe和Frame中实现cookie跨域的方法(转载)
  13. 【渝粤教育】国家开放大学2018年秋季 2780T遗传与育种 参考试题
  14. 9. Doctrine2
  15. 计算机编程 设计入门,计算机编程入门图文教程_计算机程序设计教程,计算机编程入门教程-其它文档类资源...
  16. 我常用的Windows软件
  17. docke网络之bridge、host、none
  18. 实用的 Python 自动化办公技巧
  19. 手机拍照技巧(一:校园拍摄)
  20. CoherenceModel官网翻译

热门文章

  1. tableau使用_使用Tableau探索墨尔本房地产市场
  2. 为什么银行没有厕所?内急了怎么办!
  3. mysql 层_mysql三层体系
  4. python range函数怎么表示无限_Python for循环与range函数的使用详解
  5. mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~
  6. 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
  7. 华为2014校园招聘的机试题目
  8. 【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现
  9. 【caffe-matlab】权重以及特征图的可视化
  10. Flask--WebSocket