正规式NFADFAMFA的转换文档格式.docx
《正规式NFADFAMFA的转换文档格式.docx》由会员分享,可在线阅读,更多相关《正规式NFADFAMFA的转换文档格式.docx(68页珍藏版)》请在冰豆网上搜索。
也可以点击打开按钮,选择一个格式符合规范的NFA文件,同时激活NFA转为DFA的功能;
也可以对得到的NFA进行保存
3、NFA转为DFA
对第一个文本框中的NFA,根据算法,将其转换为DFA,得出开始符号集、终结符号集以及符号集,并激活DFA转为MFA的功能;
也可以点击打开按钮,选择一个格式符合规范的DFA文件,同时激活DFA转为MFA的功能;
也可以对得到的DFA进行保存
4、DFA转为MFA
对第二个文本框中的DFA,根据算法,将其转换为MFA,得出开始符号集、终结符号集以及符号集;
也可以点击打开按钮,选择一个格式符合规范MFA文件;
也可以对得到的MFA进行保存
四、主要数据结构介绍
1、自定义一个JavaBean,这个类里只有三个属性,节点的开始符号,接受符号,终结符号,并有他们的get()、set()方法,将类名定义为Node
2、整个程序涉及到的NFA、DFA、MFA都存放在ArrayList<
Node>
中,每次通过迭代器Iterator<
进行迭代
3、在正规式转为NFA时,将创建一个开始符号栈和一个终结符号栈,分别用来存储开始符号和终结符号
4、在NFA转换为DFA时,创建一个对象数组Object[][2],每个数组单元第一列为ArrayList<
String>
,存放的是节点号,第二列是一个Boolean,标记该状态T是否被访问过
5、在DFA转换为MFA时,创建一个对象数组Object[],每个数组单元为ArrayList<
,存放的是每次划分的节点信息
五、主要模块算法介绍
将输入的正规式使用toCharArray()转换成一个一个字符,然后对字符进行处理,主要是验证左右括号是否匹配正确,以及”|”,”.”,”*”等符号位置是否合法,输入的表达式中是否含有非法字符
对经过验证的正规式进行一个字符一个字符的判断,其中”*”的优先级最高,其次是”.”,最后是”|”。
在转换过程中,构造两个栈,一个栈是开始符号栈,用来存放创建的开始符号,一个是终结符号栈,用来存放创建的终结符号。
通过对”|”,”.”,”*”优先级的的不同,对两个栈进行不同的处理,将产生的结点存入ArrayList<
中
将从第一个文本框中读出的NFA节点信息存入ArrayList<
,由迭代器进行迭代,算法的流程如下图所示:
化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表,这种方法称为“分割法”。
具体过程是:
(1)将M的所有状态分成两个子集——终态集和非终态集;
(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;
(3)重复第
(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。
这时DFA的状态被分成若干个互不相交的子集。
(4)从每个子集中选出一个状态做代表即可得到最简的DFA。
六、程序实现环境及使用说明
本次实验采用Eclipse进行代码的编写、编译及运行;
编写语言为java语言;
程序的运行环境为jdk1.8;
系统为windows
8.1
七、实验测试用例设计说明
(1)输入”\”,这是一个错误的输入
(2)输入”ab|b”,这是一个正确的输入
(1)输入”ab|b”,这是一个不含闭包的例子
(2)输入”(a*|b)*”,这是一个含有闭包的例子
八、实验结果测试情况
九、小组对实验结果的自我评价
通过这次实验,我对正规式、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("
复制"
JMenuItempaste=newJMenuItem("
粘贴"
JMenuItemdel=newJMenuItem("
删除"
JMenuItemall=newJMenuItem("
全选"
JMenuItemlexical=newJMenuItem("
JMenuItemnfadfamfa=newJMenuItem("
NFA_DFA_MFA"
JMenuItemsHelp=newJMenuItem("
查看帮助"
JMenuItemabout=newJMenuItem("
关于"
JMenuItemback1=newJMenuItem("
JMenuItemcut1=newJMenuItem("
JMenuItemcopy1=newJMenuItem("
JMenuItempaste1=newJMenuItem("
JMenuItemdel1=newJMenuItem("
JMenuItemall1=newJMenuItem("
FileDialogopenDia=newFileDialog(f,"
FileDialog.LOAD);
FileDialogsaveDia=newFileDialog(f,"
FileDialog.SAVE);
AboutFileprompta;
Filefe;
Clipboardclipboard=null;
booleanisSave,change,isLine;
Stringselect;
publicFrameView(){
isSave=false;
change=false;
isLine=true;
setup();
f.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventwe){
if((isSave==false)&
&
(change==true)){
Promptdg=newPrompt(f,"
true);
}else
System.exit(0);
}
});
ta.setFont(newFont("
宋体"
0,20));
ta.setLineWrap(true);
tb.setEditable(false);
tc.setEditable(false);
pack();
f.setBounds(300,100,750,550);
f.setVisible(true);
}
publicvoidsetup(){
setLayout(newBorderLayout());
f.setJMenuBar(bar);
jspa.add(ta);
jspb.add(tb);
jspc.add(tc);
pb.setLayout(newGridLayout(2,1));
pb.add(jspb);
pb.add(jspc);
pa.setLayout(newGridLayout(1,2));
pa.add(jspa);
pa.add(pb);
f.add(pa);
bar.add(file);
bar.add(edit);
bar.add(analysis);
bar.add(help);
file.add(open);
file.add(save);
file.add(saveNew);
file.addSeparator();
file.add(exit);
edit.add(back);
edit.addSeparator();
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(del);
edit.add(all);
analysis.add(lexical);
analysis.add(nfadfamfa);
help.add(sHelp);
help.add(about);
pop.add(back1);
pop.addSeparator();
pop.add(cut1);
pop.add(copy1);
pop.add(paste1);
pop.add(del1);
pop.add(all1);
open.setMnemonic('
O'
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
Event.CTRL_MASK));
save.setMnemonic('
S'
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
saveNew.setMnemonic('
A'
saveNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
Event.SHIFT_MASK));
exit.setMnemonic('
X'
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
back.setMnemonic('
Z'
back.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
cut.setMnemonic('
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
copy.setMnemonic('
C'
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
paste.setMnemonic('
V'
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
del.setMnemonic('
L'
del.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
all.setMnemonic('
all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
lexical.setMnemonic('
lexical.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,
nfadfamfa.setMnemonic('
N'
nfadfamfa.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
sHelp.setMnemonic('
H'
sHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
about.setMnemonic('
B'
about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
back1.setMnemonic('
back1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
cut1.setMnemonic('
cut1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
copy1.setMnemonic('
copy1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
paste1.setMnemonic('
paste1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
del1.setMnemonic('
del1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
all1.setMnemonic('
all1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
open.addActionListener(this);
save.addActionListener(this);
saveNew.addActionListener(this);
exit.addActionListener(this);
back.addActionListener(this);
cut.addActionListener(this);
copy.addActionListener(this);
paste.addActionListener(this);
del.addActionListener(this);
all.addActionListener(this);
lexical.addActionListener(this);
nfadfamfa.addActionListener(this);
about.addActionListener(this);
sHelp.addActionListener(this);
back1.addActionListener(this);
cut1.addActionListener(this);
copy1.addActionListener(this);
paste1.addActionListener(this);
del1.addActionListener(t