正规式NFADFAMFA的转换教学教材.docx

上传人:b****3 文档编号:961687 上传时间:2022-10-14 格式:DOCX 页数:70 大小:275.76KB
下载 相关 举报
正规式NFADFAMFA的转换教学教材.docx_第1页
第1页 / 共70页
正规式NFADFAMFA的转换教学教材.docx_第2页
第2页 / 共70页
正规式NFADFAMFA的转换教学教材.docx_第3页
第3页 / 共70页
正规式NFADFAMFA的转换教学教材.docx_第4页
第4页 / 共70页
正规式NFADFAMFA的转换教学教材.docx_第5页
第5页 / 共70页
点击查看更多>>
下载资源
资源描述

正规式NFADFAMFA的转换教学教材.docx

《正规式NFADFAMFA的转换教学教材.docx》由会员分享,可在线阅读,更多相关《正规式NFADFAMFA的转换教学教材.docx(70页珍藏版)》请在冰豆网上搜索。

正规式NFADFAMFA的转换教学教材.docx

正规式NFADFAMFA的转换教学教材

 

正规式、NFA、DFA、MFA的转换

计算机专业软件类课程实验报告

课程名称:

编译原理

实验题目:

正规式、NFA、DFA、MFA的转换

实验小组成员:

实验小组组长:

任课教师:

专业名称:

计算机科学与技术

班级名称:

计科1班

实验起止时间:

2014-5-19~2014-5-29

 

一、实验目的

1、理解什么是正规式

2、理解NFA、DFA、MFA的概念;

3、掌握正规式和NFA之间的等价变换;

4、掌握NFA和DFA之间的等价变换;

5、掌握DFA和MFA之间的等价变换;

6、了解程序设计语言Java的语言机制。

2、实验内容

程序的流程图如下所示:

1、根据用户输入的表达式,验证是否为合法的正规式

2、根据正规式,将其转换为NFA

3、根据NFA,将其转换为DFA

4、根据DFA,将其转换为MFA

3、实验需求

1、正规式验证

对输入的表达式能够做出正确的判断,如果是合法的正规式,则激活正规式转为NFA的功能;如果不是合法的正规式,则会弹出消息框进行提示

2、正规式转为NFA

对经过验证的正规式,根据算法,将其转换为NFA,得出开始符号集、终结符号集以及符号集,并激活NFA转为DFA的功能;也可以点击打开按钮,选择一个格式符合规范的NFA文件,同时激活NFA转为DFA的功能;也可以对得到的NFA进行保存

3、NFA转为DFA

对第一个文本框中的NFA,根据算法,将其转换为DFA,得出开始符号集、终结符号集以及符号集,并激活DFA转为MFA的功能;也可以点击打开按钮,选择一个格式符合规范的DFA文件,同时激活DFA转为MFA的功能;也可以对得到的DFA进行保存

4、DFA转为MFA

对第二个文本框中的DFA,根据算法,将其转换为MFA,得出开始符号集、终结符号集以及符号集;也可以点击打开按钮,选择一个格式符合规范MFA文件;也可以对得到的MFA进行保存

4、主要数据结构介绍

1、自定义一个JavaBean,这个类里只有三个属性,节点的开始符号,接受符号,终结符号,并有他们的get()、set()方法,将类名定义为Node

2、整个程序涉及到的NFA、DFA、MFA都存放在ArrayList中,每次通过迭代器Iterator进行迭代

3、在正规式转为NFA时,将创建一个开始符号栈和一个终结符号栈,分别用来存储开始符号和终结符号

4、在NFA转换为DFA时,创建一个对象数组Object[][2],每个数组单元第一列为ArrayList,存放的是节点号,第二列是一个Boolean,标记该状态T是否被访问过

5、在DFA转换为MFA时,创建一个对象数组Object[],每个数组单元为ArrayList,存放的是每次划分的节点信息

5、主要模块算法介绍

1、正规式验证

将输入的正规式使用toCharArray()转换成一个一个字符,然后对字符进行处理,主要是验证左右括号是否匹配正确,以及”|”,”.”,”*”等符号位置是否合法,输入的表达式中是否含有非法字符

2、正规式转为NFA

对经过验证的正规式进行一个字符一个字符的判断,其中”*”的优先级最高,其次是”.”,最后是”|”。

在转换过程中,构造两个栈,一个栈是开始符号栈,用来存放创建的开始符号,一个是终结符号栈,用来存放创建的终结符号。

通过对”|”,”.”,”*”优先级的的不同,对两个栈进行不同的处理,将产生的结点存入ArrayList

3、NFA转为DFA

将从第一个文本框中读出的NFA节点信息存入ArrayList,由迭代器进行迭代,算法的流程如下图所示:

开始

求开始状态闭包

标记F令它为集合C中的唯一成员

集合C中存在尚未被标记子集

标记T

对子集T中的每个输入字母求U=Ia子集

将U加入C中

结束语

4、DFA转为MFA

化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表,这种方法称为“分割法”。

具体过程是:

(1)将M的所有状态分成两个子集——终态集和非终态集;

(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;

(3)重复第

(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。

这时DFA的状态被分成若干个互不相交的子集。

(4)从每个子集中选出一个状态做代表即可得到最简的DFA。

6、程序实现环境及使用说明

本次实验采用Eclipse进行代码的编写、编译及运行;

编写语言为java语言;

程序的运行环境为jdk1.8;

系统为windows 8.1

7、实验测试用例设计说明

1、正规式验证

(1)输入”\”,这是一个错误的输入

(2)输入”ab|b”,这是一个正确的输入

2、正规式转为NFA

(1)输入”ab|b”,这是一个不含闭包的例子

(2)输入”(a*|b)*”,这是一个含有闭包的例子

3、NFA转为DFA

(1)输入”ab|b”,这是一个不含闭包的例子

(2)输入”(a*|b)*”,这是一个含有闭包的例子

4、DFA转为MFA

(1)输入”ab|b”,这是一个不含闭包的例子

(2)输入”(a*|b)*”,这是一个含有闭包的例子

八、实验结果测试情况

9、小组对实验结果的自我评价

通过这次实验,我对正规式、NFA、DFA、MFA有了一定的了解,进一步的巩固了这部分的知识。

懂得了他们之间转化的原理。

在编程过程中,遇到了不少的问题,在同学的帮助下,问题一步一步的得到了解决。

同时,实验期间,老师也对程序进行了测试评价,发现了一些错误,比如,在将正规式转为NFA时,连接运算符与或运算符之间的处理出现了一些问题;还有,在最后将DFA转为MFA时,在MFA中出现了没有对相同的两项进行冗余处理。

这些问题也在实验后期进行了一一解决。

由于编程能力和时间的不足,这个转换器还有待完善,可能还有没有测试出来的错误。

对于出错处理也考虑得不够周到。

望老师多多指教。

十、任课教师对实验结果的评分

源码

FrameView.java

packageview;

importjava.awt.BorderLayout;

importjava.awt.Event;

importjava.awt.FileDialog;

importjava.awt.FlowLayout;

importjava.awt.Font;

importjava.awt.GridLayout;

importjava.awt.ScrollPane;

importjava.awt.datatransfer.Clipboard;

importjava.awt.datatransfer.DataFlavor;

importjava.awt.datatransfer.StringSelection;

importjava.awt.datatransfer.Transferable;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.event.KeyEvent;

importjava.awt.event.MouseAdapter;

importjava.awt.event.MouseEvent;

importjava.awt.event.WindowAdapter;

importjava.awt.event.WindowEvent;

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileReader;

importjava.io.FileWriter;

importjava.io.IOException;

importjavax.swing.JDialog;

importjavax.swing.JFrame;

importjavax.swing.JMenu;

importjavax.swing.JMenuBar;

importjavax.swing.JMenuItem;

importjavax.swing.JOptionPane;

importjavax.swing.JPanel;

importjavax.swing.JPopupMenu;

importjavax.swing.JTextArea;

importjavax.swing.KeyStroke;

importjavax.swing.event.DocumentEvent;

importjavax.swing.event.DocumentListener;

importjavax.swing.event.UndoableEditEvent;

importjavax.swing.event.UndoableEditListener;

importjavax.swing.undo.UndoManager;

publicclassFrameViewextendsJFrameimplementsActionListener,

DocumentListener,UndoableEditListener{

JFramef=newJFrame("词法分析器");

ScrollPanejspa=newScrollPane();

ScrollPanejspb=newScrollPane();

ScrollPanejspc=newScrollPane();

JPopupMenupop=newJPopupMenu();

JTextAreata=newJTextArea();

JTextAreatb=newJTextArea();

JTextAreatc=newJTextArea();

JPanelpa=newJPanel();

JPanelpb=newJPanel();

JOptionPanejop=newJOptionPane();

UndoManagerum=newUndoManager();

JMenuBarbar=newJMenuBar();

JMenufile=newJMenu("文件");

JMenuedit=newJMenu("编辑");

JMenuanalysis=newJMenu("词法分析");

JMenuhelp=newJMenu("帮助");

JMenuItemopen=newJMenuItem("打开");

JMenuItemsave=newJMenuItem("保存");

JMenuItemsaveNew=newJMenuItem("另存为");

JMenuItemexit=newJMenuItem("退出");

JMenuItemback=newJMenuItem("撤销");

JMenuItemcut=newJMenuItem("剪切");

JMenuItemcopy=newJMenuItem("复制");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1