编译原理 实验2 DFA的运行

DFA的运行

一、 实验目的

1.理解有穷自动机的作用;

2.利用状态图和状态表表示有穷自动机;

3.以程序实现有穷自动机的运行过程;

4.利用状态表和有穷自动机的运行原理编制程序,使得程序能够识别一个输入串是否为一个有效的符号串。具体可以选择下面之一:无符号定点实数,无符号正偶数,自然数,整数,十六进制数,或其他自己定义的符号串。

二、 实验环境

操作系统:window xp

编写环境:visual c++

编写语言:c语言

三、 实验内容

1.简单介绍你所设计的有穷自动机。(要求必须完成无符号正偶数的有穷自动机)

无符号正偶数 正规式

a:1 3 5 7 9

b:2 4 6 8

c:0

(a|b)(a|b|c)*(b|c)|b

2.画出有穷自动机的状态表

3.状态图:

状态表: 0 1 2

0 1 2 -1

1 1 3 3

2 1 3 3

3 1 3 3

3.测试数据和结果。

(修改下表中的内容。要注意输入数据的代表性)


组号


输入数据


结果


1


1#


不接受


2


0#


不接受


3


2#


接受


4


01#


不接受


5


02#


不接受


6


9000#


接受


7


+2#


不接受


8


-2#


不接受


9


9999#


不接受


10


1.25#


不接受


11


-1.12#


不接受


12


122.#


不接受

四、 实验结果

五、 实验小结

附录:源代码

//正规式 (a|b)(a|b|c)*(b|c)|b
#include <cstdio>
#include <cstring>
using namespace std;
char a[1000];
int dp[4][3] = {
	1, 2, -1,
	1, 3, 3,
	1, 3, 3,
	1, 3, 3,
};
bool Q[4] = {0, 0, 1, 1};
bool run()
{
	int s = 0;
	for(int i = 0; a[i] != '#'; i++)
	{
		if(a[i] == '1' || a[i] == '3' || a[i] == '5' || a[i] == '7' || a[i] == '9')
			s = dp[s][0];
		else if(a[i] == '2' || a[i] == '4' || a[i] == '6' || a[i] == '8')
			s = dp[s][1];
		else if(a[i] == '0')
			s = dp[s][2];
		else
			return false;
		if(s == -1)
			return false;
	}
	if(Q[s])
		return true;
	return false;
} 
int main()
{
	printf("请输入一个数\n");//输入的字符串以#结尾
	while(1)
	{
		 
		scanf("%s", a);
		if(run())
			printf("接受\n");
		else
			printf("不接受\n"); 
	}
	return 0;
时间: 2024-12-26 05:10:09

编译原理 实验2 DFA的运行的相关文章

哈工大软件学院编译原理实验1——词法分析

这次实验被"过来人"们定位非常easy,实验内容例如以下: ----------------------------------------------------------------------------------- 对例如以下工作进行展开描写叙述 (1) 给出语言的词法规则描写叙述 · 标识符.keyword.整常数.字符常数.浮点常数 · 单界符:+,-,×,;,- · 双界符:/*,:=,>=,<=,!=,- · 凝视 (2) 针对这样的单词的状态转换图和程

编译原理实验代码(词法分析,语法分析,中间代码生成)

花了一天写出的程序没有顾及很多层面,但对于理解基本的实验道理和交上实验还是有点帮助的.代码实现了基于有限自动机的词法分析,采用递归下降分析法和EBNF文法实现语法分析并生成中间代码. lexAnalysis.h /* * lexAnalysis.h * * Created on: 2014-12-2 * Author: liuqiushan */ #ifndef LEXANALYSIS_H_ #define LEXANALYSIS_H_ #include <stdio.h> #include

编译原理 实验3 语法分析

语法分析 一. 实验目的 算术表达式的文法可以是(你可以根据需要适当改变): E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确. 二. 实验环境 操作系统:window xp 编写环境:visual c++ 编写语言:c语言 三. 实验内容 程序输入/输出示例: 如参考C语言的运算符.输入如下表达式(以分号为结束)和输出结果: (1)10; 输出:正确 (2)1+2; 输出:正确 (3)(1+2)/3+4-(5+6/7); 输出:正

吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】

一.实验要求 实验二 基于预測方法的语法分析程序的设计 一.实验目的 了解预測分析器的基本构成及用自顶向下的预測法对表达式进行语法分析的方法,掌握预測语法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的基于预測方法的语法分析过程. 2.依据预測分析原理设计一个基于预測方法的语法分析程序. 三.实验要求 对给定文法G[S]: S->AT       A->BU     T->+AT|$      U->*BU|$    B->(S)|m 当中,$表示空串. 1.推断上

编译原理-NFA构造DFA

本题摘自北邮的编译原理与技术. 首先,根据此图构造状态转换表 表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达的节点,同理,Ib表示由状态数组经过一个b可以到达的节点. 当然,有些人可能觉得{B,5,1}和{5,1,3}看作两个状态不合理,他们之间不是有交集嘛,实际上他们之间并无交集,因为输入a后,{B,5,1}能到达的新节点是3,之所以要写成{5,1,3},可能是要兼顾逻辑吧>_> 再仔细观察第一行,既

编译原理实验二:LL(1)语法分析器

一.实验要求 不得不想吐槽一下编译原理的实验代码量实在是太大了,是编译原理撑起了我大学四年的代码量... 这次实验比上次要复杂得多,涵盖的功能也更多了,我觉得这次实验主要的难点有两个(其实都是难点...): 1. 提取左公因子或消除左递归(实现了消除左递归) 2. 递归求First集和Follow集 其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下面我贴出实验的一些关键代码和算法思想. 二.基于预测分析表法的语法分析 2.1 代码结构 2.1.1  Grammar类    功

编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任务的程序叫语法分析程序或语法分析器. 二. 所实现的语义分析和代码生成程序能处理什么语句 (1)简单变量的声明语句 (2)表达式语句 (3)if语句. (4)while语句 (5)for语句 (6)write语句 (7)read语句 (8)do语句. (9)处理过程调用和返回 三.实验过程 ①用VC

编译原理 - 实验四 - yacc基本使用(bison)

一.介绍 只要在Unix环境中写过程序,必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一个Lex,Bison则是GNU版本的YACC,在此我们将统一称呼这些程序为Lex和YACC,所以我们将用Flex和Bison来尝试下我们的实例. 二.准备工作(win7) ①  下载flex和bison并安装到D:\GnuWin32(尽量是根目录) ②    由于我们使用的flex和bison都是GNU的工具,所以

编译原理实验:java实现语法分析器

实验方法:递归下降分析法基本思想是,对文法中的每个非终结符编写一个函数,每个函数的功能是识别由该非终结符所表示的语法成分.因此需要分别构造 E,E’,T,T’,F 函数来执行自己的识别功能,根据文法的内容顺序决定函数的识别功能. java程序实现: import java.util.Scanner; public class GrammarAnalysis { static char[] s = new char[100]; static int sing; static int i; //用来