正规文法转化DFA
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char p[30][30];//存放文法
char q[30][30];
int line=0;
int n;
int i,j;
int count=0;
int k,t=0;
int flag=0;
int l,m=0;
char VN[30]={'\0'};//存放非终结符号
char VT[30]={'\0'};//存放终结符号
printf("请输入规则个数");
scanf("%d",&n);
line=n;
for(i=0;i<30;i++)//给字符串数组p,q全部赋值为'\0'
for(j=0;j<30;j++)
{
p[i][j]='\0';
q[i][j]='\0';
}
printf("请输入文法:\n");
for(i=0;i<line;i++)
{
scanf("%s",p[i]);
}
//把字符分为终结符和非终结符
l=0;
m=0;
for(i=0;i<line;i++)
{
for(j=0;j<30&&(p[i][j]!='\0');j++) { //非终结符放入数组VN中
if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))
{
flag=0;
for(t=0;VN[t]!='\0';t++)
{
if(VN[t]==p[i][j])
{
flag=1;break;
}
}
if(flag==0)
{
VN[l]=p[i][j];
l++;
}
}
//终结符放在数组VT中
if(p[i][j]<='Z'&&p[i][j]>='A')
{
flag=0;
for(t=0;t<30&&(VT[t]!='\0');t++)
{
if(VT[t]==p[i][j])
{
flag=1;
break;
}
}
if(flag==0)
{
VT[m]=p[i][j];
m++;
}
}
}
}
//把规则右部分分离,放入数组q中
count=0;
k=0;
for(i=0;i<line;i++)
{
for(j=4;j<30&&(p[i][j]!='\0');j++)
{
if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
{
q[count][k]=p[i][j];
k++;
}
else
{
count++;
k=0;
}
}
count++;
k=0;
}
//判断是确定的还是非确定的有穷状态自动机,并进行前半部分打印
//判断依据:q数组中每一行字符串是否相同
flag=0;
for(i=0;i<count;i++)
{
for(j=i+1;j<count;j++)
{
if(strcmp(q[i],q[j])==0)
{
flag=1;
break;
}
}
}
if(flag==1)
{
printf("是非确定的有穷状态自动机,即NFA\n\n");
printf("构造的有穷状态自动机为:\n");
printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n");
}
else
{
printf("是确定的有穷状态自动机,即DFA\n\n\n");
printf("构造的有穷状态自动机为:\n");
printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n");
}
printf("其中,\nK={S");
for(i=0;i<30&&(VT!='\0');i++)
{
printf(",%c",VT[i]);
}
printf("}\n");
printf("E={");
for(i=0;i<30&&(VN[i]!='\0');i++)
{
printf("%c ",VN[i]);
}
printf("}\n");
//分离文法
k=0;
count=0;
for(i=0;i<line;i++)
{
j=4;
while(p[i][j]!='\0')
{
if(k<4)
{
q[count][k]=p[i][k];
k++;
}
else
{
if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
{
q[count][k]=p[i][j];
k++;
j++;
}
if(p[i][j]=='l')
{
count++;
k=0;
j++;
}
}
}
count++;
k=0;
}
printf("\n");
//打印M后部分
printf("M:\n");
l=0;
while(VN[l]!='\0')
{
printf("M(S,%c)={",VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!='\0');j++)
{
if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
printf("\n");
l=0;k=0;
while(VT[k]!='\0')
{
l=0;
while(VN[l]!='\0')
{
printf("M(%c,%c)={",VT[k],VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!='\0');j++)
{
if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
k++;
printf("\n");
}
system("pause");
}
正规文法转化DFA的更多相关文章
- 第九次作业 DFA最小化,语法分析初步
1.将DFA最小化:教材P65 第9题 Ⅰ {1,2,3,4,5} {6,7} {1,2}b={1,2,3,4,5} 3,4}b={5} {6,7} Ⅱ {1,2}{3,4}{5} {6,7} 2.构 ...
- 把自动机用作 Key-Value 存储
以前只有代码,最近简单写了一点文档: google code 上的链接(总是最新) 自动机是什么 DFA 的最小化 将 DFA 用做字典 无环DFA (ADFA, Acyclic DFA) 编译 内存 ...
- 有穷自动机(NFA、DFA)&正规文法&正规式之间的相互转化构造方法
在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将 不确定的有穷自动机 ...
- 如何将 不确定的有穷自动机(NFA) 转化为 确定的有穷自动机(DFA) 并将DFA最简化
一.从NFA到DFA的转换 例如下图: DFA的每个状态都是一个由NFA中的状态构成的集合,即NFA状态集合的一个子集 r =aa*bb*cc* 二.从带有ε-边的NFA到DFA的转换 r=0*1*2 ...
- 编译原理-DFA与正规式的转化
- 湖大OJ-实验C----NFA转换为DFA
实验C----NFA转换为DFA Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit us ...
- 利用子集构造法实现NFA到DFA的转换
概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...
- 使用DFA算法对敏感词进行过滤
项目目录结构如下: 其中resources资源目录中: stopwd.txt :停顿词,匹配时间直接过滤. wd.txt:敏感词库. 1.WordFilter敏感词过滤类: package com.s ...
- 简单的词法设计——DFA模拟程序
实验一.简单的词法设计--DFA模拟程序 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 DFA 模 ...
随机推荐
- 【EXCEL】簡単に重複探し
下記のような表があって.重複があるかどうか探すのが大変と思いますが. 簡単に重複探す方法を紹介します. Step1.重複を探す(例えこちらでは項目)を選択します. Step2.メニューで 条件付き書式 ...
- 20155206 2016-2017-2 《Java程序设计》第1周学习总结
20155206 2016-2017-2 <Java程序设计>第1周学习总结 第一,二章学习内容总结 第一章 java基本知识 Java的三种技术架构: JAVAEE:Java Platf ...
- 20155331 丹增旦达 2006-2007-2 《Java程序设计》第二周学习总结
20155331 丹增旦达 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一 ,类型.变量与运算符 一.数据类型 1, 分类: 基本数据类型 byte:字节 ...
- 20155333 2016-2017-2 《Java程序设计》第一周学习总结
<java程序设计>第一周学习总结 学习目标 •了解java基础知识 •了解JVM.JRE与JDK,并下载.安装.测试JDK •了解PATH.CLASSPATH.SOURCEPATH的作用 ...
- Spring SimpleJdbcOperations 批量更新
1.控制台代码 import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowM ...
- 回顾RAC安装过程中对ASM的处理
1 首先建立好节点间共享的磁盘,要注意从各节点看到的磁盘的序号.名称一致. 2 通过某一个节点,对共享磁盘进行格式化. 3 在Grid Infrastructure 中, 有一个为OCR选择存储介质的 ...
- 【MYSQL用户创建报错】ERROR 1396 (HY000): Operation CREATE USER failed for 'user1'@'%'
原文参考自:http://blog.csdn.net/u011575570/article/details/51438841 1.创建用户的时候报错ERROR 1396 (HY000): Operat ...
- html查漏补缺之meta标签
什么是meta标签? meta标签是html标记head区的一个关键标签,它位于HTML文档的<head>和<title>之间(有些也不是在<head>和<t ...
- idea 临时文件
idea可以直接创建一个 scratch file (mac os快捷键 cmd+shift+n) 在里面可以自由的编辑文档, 配合vim使用很方便, 我使用的频率还比较高. 大概是这样的. 这个临时 ...
- P,V操作及同步互斥实例
无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...