正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換_第1頁
正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換_第2頁
正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換_第3頁
正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換_第4頁
正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

計(jì)算機(jī)專業(yè)軟件類課程實(shí)驗(yàn)報(bào)告課程名稱:編譯原理實(shí)驗(yàn)題目:正規(guī)式、NFA、DFA、MFA的轉(zhuǎn)換實(shí)驗(yàn)小組成員:實(shí)驗(yàn)小組組長:任課教師:專業(yè)名稱:計(jì)算機(jī)科學(xué)與技術(shù)班級名稱:計(jì)科1班實(shí)驗(yàn)起止時(shí)間:2014-5-19~2014-5-29一、實(shí)驗(yàn)?zāi)康?、理解什么是正規(guī)式2、理解NFA、DFA、MFA的概念;3、掌握正規(guī)式和NFA之間的等價(jià)變換;4、掌握NFA和DFA之間的等價(jià)變換;5、掌握DFA和MFA之間的等價(jià)變換;6、了解程序設(shè)計(jì)語言Java的語言機(jī)制。實(shí)驗(yàn)內(nèi)容程序的流程圖如下所示:根據(jù)用戶輸入的表達(dá)式,驗(yàn)證是否為合法的正規(guī)式2、根據(jù)正規(guī)式,將其轉(zhuǎn)換為NFA3、根據(jù)NFA,將其轉(zhuǎn)換為DFA4、根據(jù)DFA,將其轉(zhuǎn)換為MFA實(shí)驗(yàn)需求正規(guī)式驗(yàn)證對輸入的表達(dá)式能夠做出正確的判斷,如果是合法的正規(guī)式,那么激活正規(guī)式轉(zhuǎn)為NFA的功能;如果不是合法的正規(guī)式,那么會(huì)彈出消息框進(jìn)行提示正規(guī)式轉(zhuǎn)為NFA對經(jīng)過驗(yàn)證的正規(guī)式,根據(jù)算法,將其轉(zhuǎn)換為NFA,得出開始符號集、終結(jié)符號集以及符號集,并激活NFA轉(zhuǎn)為DFA的功能;也可以點(diǎn)擊翻開按鈕,選擇一個(gè)格式符合標(biāo)準(zhǔn)的NFA文件,同時(shí)激活NFA轉(zhuǎn)為DFA的功能;也可以對得到的NFA進(jìn)行保存NFA轉(zhuǎn)為DFA對第一個(gè)文本框中的NFA,根據(jù)算法,將其轉(zhuǎn)換為DFA,得出開始符號集、終結(jié)符號集以及符號集,并激活DFA轉(zhuǎn)為MFA的功能;也可以點(diǎn)擊翻開按鈕,選擇一個(gè)格式符合標(biāo)準(zhǔn)的DFA文件,同時(shí)激活DFA轉(zhuǎn)為MFA的功能;也可以對得到的DFA進(jìn)行保存DFA轉(zhuǎn)為MFA對第二個(gè)文本框中的DFA,根據(jù)算法,將其轉(zhuǎn)換為MFA,得出開始符號集、終結(jié)符號集以及符號集;也可以點(diǎn)擊翻開按鈕,選擇一個(gè)格式符合標(biāo)準(zhǔn)MFA文件;也可以對得到的MFA進(jìn)行保存主要數(shù)據(jù)結(jié)構(gòu)介紹自定義一個(gè)JavaBean,這個(gè)類里只有三個(gè)屬性,節(jié)點(diǎn)的開始符號,接受符號,終結(jié)符號,并有他們的get()、set()方法,將類名定義為Node整個(gè)程序涉及到的NFA、DFA、MFA都存放在ArrayList<Node>中,每次通過迭代器Iterator<Node>進(jìn)行迭代在正規(guī)式轉(zhuǎn)為NFA時(shí),將創(chuàng)立一個(gè)開始符號棧和一個(gè)終結(jié)符號棧,分別用來存儲(chǔ)開始符號和終結(jié)符號在NFA轉(zhuǎn)換為DFA時(shí),創(chuàng)立一個(gè)對象數(shù)組Object[][2],每個(gè)數(shù)組單元第一列為ArrayList<String>,存放的是節(jié)點(diǎn)號,第二列是一個(gè)Boolean,標(biāo)記該狀態(tài)T是否被訪問過在DFA轉(zhuǎn)換為MFA時(shí),創(chuàng)立一個(gè)對象數(shù)組Object[],每個(gè)數(shù)組單元為ArrayList<String>,存放的是每次劃分的節(jié)點(diǎn)信息主要模塊算法介紹正規(guī)式驗(yàn)證將輸入的正規(guī)式使用toCharArray()轉(zhuǎn)換成一個(gè)一個(gè)字符,然后對字符進(jìn)行處理,主要是驗(yàn)證左右括號是否匹配正確,以及”|”,”.”,”*”等符號位置是否合法,輸入的表達(dá)式中是否含有非法字符2、正規(guī)式轉(zhuǎn)為NFA對經(jīng)過驗(yàn)證的正規(guī)式進(jìn)行一個(gè)字符一個(gè)字符的判斷,其中”*”的優(yōu)先級最高,其次是”.”,最后是”|”。在轉(zhuǎn)換過程中,構(gòu)造兩個(gè)棧,一個(gè)棧是開始符號棧,用來存放創(chuàng)立的開始符號,一個(gè)是終結(jié)符號棧,用來存放創(chuàng)立的終結(jié)符號。通過對”|”,”.”,”*”優(yōu)先級的的不同,對兩個(gè)棧進(jìn)行不同的處理,將產(chǎn)生的結(jié)點(diǎn)存入ArrayList<Node>中3、NFA轉(zhuǎn)為DFA將從第一個(gè)文本框中讀出的NFA節(jié)點(diǎn)信息存入ArrayList<Node>,由迭代器進(jìn)行迭代,算法的流程如下列圖所示:開始開始求開始狀態(tài)閉包標(biāo)記F令它為集合C中的唯一成員集合C中存在尚未被標(biāo)記子集標(biāo)記T對子集T中的每個(gè)輸入字母求U=Ia子集將U參加C中結(jié)束語是否DFA轉(zhuǎn)為MFA化簡DFA的根本思想是指導(dǎo)它的狀態(tài)分成一些互不相交的子集,每一個(gè)子集中的狀態(tài)都不是等價(jià)的,不同子集中的狀態(tài)可以由某個(gè)輸入串來區(qū)別,最后將不能區(qū)別的每個(gè)子集用一個(gè)狀態(tài)來做代表,這種方法稱為“分割法”。具體過程是:〔1〕將M的所有狀態(tài)分成兩個(gè)子集——終態(tài)集和非終態(tài)集;〔2〕考察每一個(gè)子集,假設(shè)發(fā)現(xiàn)某子集中的狀態(tài)不等價(jià),將其劃分為兩個(gè)集合;〔3〕重復(fù)第〔2〕步,繼續(xù)考察已得到的每一個(gè)子集,直到?jīng)]有任何一個(gè)子集需要繼續(xù)劃分為止。這時(shí)DFA的狀態(tài)被分成假設(shè)干個(gè)互不相交的子集。〔4〕從每個(gè)子集中選出一個(gè)狀態(tài)做代表即可得到最簡的DFA。程序?qū)崿F(xiàn)環(huán)境及使用說明本次實(shí)驗(yàn)采用Eclipse進(jìn)行代碼的編寫、編譯及運(yùn)行;編寫語言為java語言;程序的運(yùn)行環(huán)境為jdk1.8;系統(tǒng)為windows8.1實(shí)驗(yàn)測試用例設(shè)計(jì)說明正規(guī)式驗(yàn)證輸入”\”,這是一個(gè)錯(cuò)誤的輸入輸入”ab|b”,這是一個(gè)正確的輸入正規(guī)式轉(zhuǎn)為NFA輸入”ab|b”,這是一個(gè)不含閉包的例子輸入”(a*|b)*”,這是一個(gè)含有閉包的例子NFA轉(zhuǎn)為DFA〔1〕輸入”ab|b”,這是一個(gè)不含閉包的例子〔2〕輸入”(a*|b)*”,這是一個(gè)含有閉包的例子DFA轉(zhuǎn)為MFA〔1〕輸入”ab|b”,這是一個(gè)不含閉包的例子〔2〕輸入”(a*|b)*”,這是一個(gè)含有閉包的例子八、實(shí)驗(yàn)結(jié)果測試情況小組對實(shí)驗(yàn)結(jié)果的自我評價(jià)通過這次實(shí)驗(yàn),我對正規(guī)式、NFA、DFA、MFA有了一定的了解,進(jìn)一步的穩(wěn)固了這局部的知識。懂得了他們之間轉(zhuǎn)化的原理。在編程過程中,遇到了不少的問題,在同學(xué)的幫助下,問題一步一步的得到了解決。同時(shí),實(shí)驗(yàn)期間,老師也對程序進(jìn)行了測試評價(jià),發(fā)現(xiàn)了一些錯(cuò)誤,比方,在將正規(guī)式轉(zhuǎn)為NFA時(shí),連接運(yùn)算符與或運(yùn)算符之間的處理出現(xiàn)了一些問題;還有,在最后將DFA轉(zhuǎn)為MFA時(shí),在MFA中出現(xiàn)了沒有對相同的兩項(xiàng)進(jìn)行冗余處理。這些問題也在實(shí)驗(yàn)后期進(jìn)行了一一解決。由于編程能力和時(shí)間的缺乏,這個(gè)轉(zhuǎn)換器還有待完善,可能還有沒有測試出來的錯(cuò)誤。對于出錯(cuò)處理也考慮得不夠周到。望老師多多指教。十、任課教師對實(shí)驗(yàn)結(jié)果的評分源碼FrameView.javapackageview;importjava.awt.BorderLayout;importjava.awt.Event;importjava.awt.FileDialog;import;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("復(fù)制"); JMenuItempaste=newJMenuItem("粘貼"); JMenuItemdel=newJMenuItem("刪除"); JMenuItemall=newJMenuItem("全選"); JMenuItemlexical=newJMenuItem("詞法分析器"); JMenuItemnfadfamfa=newJMenuItem("NFA_DFA_MFA"); JMenuItemsHelp=newJMenuItem("查看幫助"); JMenuItemabout=newJMenuItem("關(guān)于"); JMenuItemback1=newJMenuItem("撤銷"); JMenuItemcut1=newJMenuItem("剪切"); JMenuItemcopy1=newJMenuItem("復(fù)制"); 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.addSeparator();edit.addSeparator();edit.add(all);edit.addSeparator();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.addSeparator();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, Event.CTRL_MASK));saveNew.setMnemonic('A');saveNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.SHIFT_MASK));exit.setMnemonic('X');exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.SHIFT_MASK));back.setMnemonic('Z');back.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK));cut.setMnemonic('X');cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));copy.setMnemonic('C');copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));paste.setMnemonic('V');paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));del.setMnemonic('L');del.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));all.setMnemonic('A');all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK));lexical.setMnemonic('L');lexical.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, Event.CTRL_MASK));nfadfamfa.setMnemonic('N');nfadfamfa.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK));sHelp.setMnemonic('H');sHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.SHIFT_MASK));about.setMnemonic('B');about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, Event.SHIFT_MASK));back1.setMnemonic('Z');back1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK));cut1.setMnemonic('X');cut1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));copy1.setMnemonic('C');copy1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));paste1.setMnemonic('V');paste1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));del1.setMnemonic('L');del1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));all1.setMnemonic('A');all1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK));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(this);all1.addActionListener(this);ta.getDocument().addDocumentListener(this);ta.getDocument().addUndoableEditListener(this);ta.addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEventme){if(me.getButton()==me.BUTTON3){pop.show(ta,me.getX(),me.getY()); } } }); }publicvoidopenFile(){openDia.setVisible(true); StringdirPath=openDia.getDirectory(); StringfileName=openDia.getFile();if(dirPath==null||fileName==null)return;ta.setText("");fe=newFile(dirPath,fileName);try{ BufferedReaderin=newBufferedReader(newFileReader(fe)); Stringline=null;while((line=in.readLine())!=null)ta.append(line+"\r\n");in.close();ta.setCaretPosition(0); }catch(IOExceptionioe){ System.err.println(ioe); } }publicvoidsaveFile(){if(fe==null){saveDia.setVisible(true); StringdirPath=openDia.getDirectory(); StringfileName=openDia.getFile();if(dirPath==null||fileName==null)return;ta.setText(""); Filefe=newFile(dirPath,fileName); }isSave=true;change=false;try{ BufferedWriterout=newBufferedWriter(newFileWriter(fe)); Stringtext=ta.getText();out.write(text);out.flush();out.close(); }catch(IOExceptionioe){ System.err.println(ioe); } }publicvoidundoableEditHappened(UndoableEditEventue){um.addEdit(ue.getEdit()); }publicvoidchangedUpdate(DocumentEvente){change=true; }publicvoidinsertUpdate(DocumentEvente){change=true; }publicvoidremoveUpdate(DocumentEvente){change=true; }publicvoidactionPerformed(ActionEventae){if(ta.getText().equals(""))change=false;if(ae.getSource()==open){ openFile();change=false; }if(ae.getSource()==save){if(isSave==false) saveFile(); }if(ae.getSource()==saveNew){ saveFile(); }if(ae.getSource()==exit){if((isSave==false)&&(change==true)){ Promptdg=newPrompt(f,"詞法分析器",true); }else System.exit(0); }if(ae.getSource()==back||ae.getSource()==back1){if(um.canUndo()){um.undo(); } }if(ae.getSource()==cut||ae.getSource()==cut1){try{clipboard=getToolkit().getSystemClipboard();select=ta.getSelectedText();if(select.length()!=0){ StringSelectiontext=newStringSelection(select);clipboard.setContents(text,null);ta.replaceRange("",ta.getSelectionStart(),ta.getSelectionEnd()); } }catch(Exceptione){ System.err.println(e); } }if(ae.getSource()==copy||ae.getSource()==copy1){try{clipboard=getToolkit().getSystemClipboard();select=ta.getSelectedText();if(select.length()!=0){ StringSelectiontext=newStringSelection(select);clipboard.setContents(text,null); } }catch(Exceptione){ System.err.println(e); } }if(ae.getSource()==paste||ae.getSource()==paste1){ Transferablecontents=clipboard.getContents(this); DataFlavorflavor=DataFlavor.stringFlavor;if(contents.isDataFlavorSupported(flavor))try{ Stringstr;str=(String)contents.getTransferData(flavor);ta.insert(str,ta.getCaretPosition()); }catch(Exceptione){ System.err.println(e); } }if(ae.getSource()==del||ae.getSource()==del1){ta.replaceSelection(null); }if(ae.getSource()==all||ae.getSource()==all1){ta.selectAll(); }if(ae.getSource()==lexical){lexical.setEnabled(false); }if(ae.getSource()==nfadfamfa){try{ NDMdialogdialog=newNDMdialog("NFA_DFA_MFA");dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);dialog.setVisible(true); }catch(Exceptione){e.printStackTrace(); } }if(ae.getSource()==sHelp){jop.setBounds(300,300,250,150);jop.showMessageDialog(null,"無法啟動(dòng)“Windows幫助和支持”","查看",jop.ERROR_MESSAGE); }if(ae.getSource()==about){ AboutFileaf=newAboutFile(f,"詞法分析器",true); } }publicstaticvoidmain(String[]args){ FrameViewfv=newFrameView(); }}Prompt.javapackageview;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.FlowLayout;importjava.awt.Frame;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JLabel;importjavax.swing.JPanel;publicclassPromptextendsJDialogimplementsActionListener{ JButtonok=newJButton("保存"); JButtonno=newJButton("不保存"); JButtoncancel=newJButton("取消");publicPrompt(Frameparent,Stringtitle,Booleand){super(parent,title,true); addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){ dispose(); } }); JLabellb=newJLabel("是否需要將更改保存?",JLabel.CENTER); setLayout(newBorderLayout()); setBackground(Color.WHITE); JPanelpl=newJPanel(); add("South",pl); add("Center",lb);pl.setLayout(newFlowLayout());pl.setBackground(Color.LIGHT_GRAY);pl.add(ok);pl.add(no);pl.add(cancel);ok.setBackground(Color.WHITE);no.setBackground(Color.WHITE);cancel.setBackground(Color.WHITE); setBounds(450,300,250,150);ok.addActionListener(this);no.addActionListener(this);cancel.addActionListener(this); setVisible(true); }publicvoidactionPerformed(ActionEvente){if(e.getSource()==ok){ FrameViewmy=newFrameView();my.saveFile(); }if(e.getSource()==no) System.exit(0);if(e.getSource()==cancel)this.dispose(); }}AboutFile.javapackageview;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Frame;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextArea;publicclassAboutFileextendsJDialogimplementsActionListener{publicAboutFile(Frameparent,Stringtitle,Booleank){super(parent,title,true); addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){ dispose(); } }); JPanelpla=newJPanel(); JPanelplb=newJPanel(); JLabellba=newJLabel("感謝老師和各位隊(duì)友的幫助",JLabel.CENTER); JLabellbb=newJLabel("版權(quán)人:崔立志",JLabel.CENTER); JLabellbc=newJLabel("出版日期:2014年",JLabel.CENTER);lba.setOpaque(true); setLayout(newBorderLayout()); setBackground(Color.WHITE);plb.setLayout(newGridLayout(3,1));plb.add(lba);plb.add(lbb);plb.add(lbc); add("South",pla); add("Center",plb); JButtonconfirm=newJButton("確定");pla.add(confirm); JTextAreat=newJTextArea();t.setEditable(false); setBounds(490,300,250,150);confirm.addActionListener(this); setVisible(true); }publicvoidactionPerformed(ActionEvente){ dispose(); }}NDMdialog.javapackageview;importjava.awt.BorderLayout;importjava.awt.FileDialog;importjava.awt.FlowLayout;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JFileChooser;import;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.border.EmptyBorder;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;importjavax.swing.JLabel;importjavax.swing.JTextField;importjava.awt.GridLayout;importjavax.swing.JTextArea;import;import;importjava.awt.ScrollPane;import;importjavax.swing.SwingConstants;import;importjava.awt.Color;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjavax.swing.border.TitledBorder;importoperation.DFAtoMFA;importoperation.ExpressiontoNFA;importoperation.NFAtoDFA;importoperation.Verify;publicclassNDMdialogextendsJDialog{privatefinalJPanelcontentPanel=newJPanel();privateJTextFieldexpression;privateStringsignString; JDialogdialog=newJDialog(); Filefe; FileDialogopenDia=newFileDialog(this,"翻開",FileDialog.LOAD); FileDialogsaveDia=newFileDialog(this,"保存",FileDialog.SAVE); JTextAreanfata=newJTextArea(); JTextAreadfata=newJTextArea(); JTextAreamfata=newJTextArea(); JLabelnfastart=newJLabel("開始狀態(tài)集:"); JLabelnfaend=newJLabel("終結(jié)狀態(tài)集:"); JLabeldfastart=newJLabel("開始狀態(tài)集:"); JLabeldfaend=newJLabel("終結(jié)狀態(tài)集:"); JLabelmfastart=newJLabel("開始狀態(tài)集:"); JLabelmfaend=newJLabel("終結(jié)狀態(tài)集:"); JButtonnfa=newJButton("生成NFA"); JButtondfa=newJButton("生成DFA"); JButtonmfa=newJButton("生成MFA");privateJFileChooserfilechooser=newJFileChooser("D:\\Users\\clz0730\\Desktop");privateintresult;/** *Launchtheapplication. */// publicstaticvoidmain(String[]args){// try{// NDMdialogdialog=newNDMdialog("NFA_DFA_MFA");// dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);// dialog.setVisible(true);// }catch(Exceptione){// e.printStackTrace();// }// }publicvoidopenFile(JTextAreata,JLabelstartlabel,JLabelendlabel, Stringstr){result=filechooser.showOpenDialog(dialog);ta.setText("");if(result==JFileChooser.APPROVE_OPTION){fe=filechooser.getSelectedFile(); }if(fe!=null){try{ BufferedReaderin=newBufferedReader(newFileReader(fe)); Stringline=null;if((line=in.readLine())!=null){startlabel.setText(line); }if((line=in.readLine())!=null){endlabel.setText(line); }if((line=in.readLine())!=null){signString=line; }while((line=in.readLine())!=null){ta.append(line+"\r\n"); }in.close();ta.setCaretPosition(0); }catch(IOExceptionioe){ System.err.println(ioe); } } }publicvoidsaveFile(JTextAreata,JLabelstartlabel,JLabelendlabel, Stringstr){ Stringtemp=startlabel.getText()+"\r\n"+endlabel.getText() +"\r\n"+str+"\r\n";result=filechooser.showSaveDialog(dialog);if(result==JFileChooser.APPROVE_OPTION){fe=filechooser.getSelectedFile(); }try{if(fe!=null){ BufferedWriterout=newBufferedWriter(newFileWriter(fe)); Stringtext=ta.getText();out.write(temp);out.write(text);out.flush();out.close(); } }catch(IOExceptionioe){ System.err.println(ioe); } }/** *Createthedialog. */publicNDMdialog(Stringtitle){ setBounds(100,100,772,496); getContentPane().setLayout(newBorderLayout());contentPanel.setBorder(newEmptyBorder(5,5,5,5)); getContentPane().add(contentPanel,BorderLayout.CENTER);contentPanel.setLayout(newBorderLayout(0,0)); { JPanelpanel=newJPanel();panel.setBorder(newTitledBorder(null,"表達(dá)式",TitledBorder.LEADING, TitledBorder.TOP,null,Color.BLACK));contentPanel.add(panel,BorderLayout.NORTH); FlowLayoutfl_panel=newFlowLayout(FlowLayout.CENTER,20,5);panel.setLayout(fl_panel); { JLabellblNewLabel=newJLabel("輸入一個(gè)正規(guī)式:");panel.add(lblNewLabel); } {expression=newJTextField();panel.add(expression);expression.setColumns(15); } { JLabellblab=newJLabel("例如:(a*|b)*");panel.add(lblab); } { JButtonverify=newJButton("驗(yàn)證正規(guī)式");verify.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ Verifyvf=newVerify(expression.getText().toString());//System.out.println(vf.validation());if(vf.validation()){nfa.setEnabled(true); }else{ JOptionPanejop=newJOptionPane();jop.setBounds(250,300,250,150);jop.showMessageDialog(null,"您輸入的正規(guī)式錯(cuò)誤?。?!","Compiler",jop.WARNING_MESSAGE); } } });panel.add(verify); } { JButtonexit=newJButton("退出");exit.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ System.exit(0); } });panel.add(exit); } } { JPanelpanel=newJPanel();contentPanel.add(panel,BorderLayout.CENTER);panel.setLayout(newGridLayout(1,3)); { JPanelpanel_1=newJPanel();panel.add(panel_1);panel_1.setLayout(newBorderLayout(0,0)); { JPanelpanel_2=newJPanel();panel_2.setLayout(newGridLayout(2,1)); JLabellblNewLabel_1=newJLabel("正規(guī)式->NFA"); JLabellblNewLabel_3=newJLabel("起始狀態(tài)"); JLabellblNewLabel_4=newJLabel("接受符號"); JLabellblNewLabel_5=newJLabel("到達(dá)狀態(tài)"); JPanelpanel_3=newJPanel();panel_3.setLayout(newGridLayout(1,3));panel_3.add(lblNewLabel_3);panel_3.add(lblNewLabel_4);panel_3.add(lblNewLabel_5);panel_2.add(lblNewLabel_1);panel_2.add(panel_3);lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);panel_1.add(panel_2,BorderLayout.NORTH); } { ScrollPanescrollPane=newScrollPane();panel_1.add(scrollPane,BorderLayout.CENTER); {nfata.setRows(10);scrollPane.add(nfata,BorderLayout.CENTER); } } { JPanelpanel_2=newJPanel();panel_1.add(panel_2,BorderLayout.SOUTH);panel_2.setLayout(newGridLayout(3,1,0,0)); {panel_2.add(nfastart); } {panel_2.add(nfaend); } { JPanelpanel_3=newJPanel();panel_2.add(panel_3);panel_3.setLayout(newFlowLayout(FlowLayout.CENTER,5, 5)); { JButtonnfaopen=newJButton("NFA文件");nfaopen.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ openFile(nfata,nfastart,nfaend,signString);dfa.setEnabled(true); } });panel_3.add(nfaopen); } {nfa.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ ExpressiontoNFAen=newExpressiontoNFA(expression.getText().trim() .toString());en.display();nfata.setText(en.tastring);nfastart.setText(en.nfastartstr);nfaend.setText(en.nfaendstr);signString=en.signstring;dfa.setEnabled(true); } });nfa.setEnabled(false);panel_3.add(nfa); } { JButtonnfasave=newJButton("保存");nfasave.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ saveFile(nfata,nfastart,nfaend,signString); } });panel_3.add(nfasave); } } } } { JPanelpanel_1=newJPanel();panel.add(panel_1);panel_1.setLayout(newBorderLayout(0,0)); { JPanelpanel_2=newJPanel();panel_2.setLayout(newGridLayout(2,1)); JLabellblNewLabel_2=newJLabel("NFA->DFA"); JLabellblNewLabel_3=newJLabel("起始狀態(tài)"); JLabellblNewLabel_4=newJLabel("接受符號"); JLabellblNewLabel_5=newJLabel("到達(dá)狀態(tài)"); JPanelpanel_3=newJPanel();panel_3.setLayout(newGridLayout(1,3));panel_3.add(lblNewLabel_3);panel_3.add(lblNewLabel_4);panel_3.add(lblNewLabel_5);panel_2.add(lblNewLabel_2);panel_2.add(panel_3);lblNewLabel_2.setHorizontalAlignment(SwingConstants.CENTER);panel_1.add(panel_2,BorderLayout.NORTH); } { ScrollPanescrollPane=newScrollPane();panel_1.add(scrollPane,BorderLayout.CENTER); {dfata.setRows(10);scrollPane.add(dfata,BorderLayout.CENTER); } } { JPanelpanel_2=newJPanel();panel_1.add(panel_2,BorderLayout.SOUTH);panel_2.setLayout(newGridLayout(3,1,0,0)); {panel_2.add(dfastart); } {panel_2.add(dfaend); } { JPanelpanel_3=newJPanel();panel_2.add(panel_3);panel_3.setLayout(newFlowLayout(FlowLayout.CENTER,5, 5)); { JButtondfaopen=newJButton("DFA文件");dfaopen.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ openFile(dfata,dfastart,dfaend,signString);mfa.setEnabled(true); } });panel_3.add(dfaopen); } {dfa.setEnabled(false);dfa.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ Stringstr=nfata.getText().toString(); Stringss1=nfastart.getText().toString(); Stringss2=nfaend.getText().toString(); NFAtoDFAnd=newNFAtoDFA(str,ss1,ss2,signString);nd.display();dfata.setText(nd.tbstring);dfastart.setText(nd.startstring);dfaend.setText(nd.endstring);signString=nd.signstring;mfa.setEnabled(true); } });panel_3.add(dfa); } { JButtondfasave=newJButton("保存");dfasave.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ saveFile(dfata,dfastart,dfaend,signString); } });panel_3.add(dfasave); } } } } { JPanelpanel_1=newJPanel();panel.add(panel_1);panel_1.setLayout(newBorderLayout(0,0)); { JPanelpanel_2=newJPanel();panel_2.setLayout(newGridLayout(2,1)); JLabellblNewLabel_3=newJLabel("DFA->MFA"); JLabellblNewLabel_2=newJLabel("起始狀態(tài)"); JLabellblNewLabel_4=newJLabel("接受符號"); JLabellblNewLabel_5=newJLabel("到達(dá)狀態(tài)"); JPanelpanel_3=newJPanel();panel_3.setLayout(newGridLayout(1,3));panel_3.add(lblNewLabel_2);panel_3.add(lblNewLabel_4);panel_3.add(lblNewLabel_5);panel_2.add(lblNewLabel_3);panel_2.add(panel_3);lblNewLabel_3.setHorizontalAlignment(SwingConstants.CENTER);panel_1.add(panel_2,BorderLayout.NORTH); } { ScrollPanescrollPane=newScrollPane();panel_1.add(scrollPane,BorderLayout.CENTER); {mfata.setRows(10);scrollPane.add(mfata,BorderLayout.CENTER); } } { JPanelpanel_2=newJPanel();panel_1.add(panel_2,BorderLayout.SOUTH);panel_2.setLayout(newGridLayout(3,1,0,0)); {panel_2.add(mfastart); } {panel_2.add(mfaend); } { JPanelpanel_3=newJPanel();panel_2.add(panel_3);panel_3.setLayout(newFlowLayout(FlowLayout.CENTER,5, 5)); { JButtonmfaopen=newJButton("MFA文件");mfaopen.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ openFile(mfata,mfastart,mfaend,signString); } });panel_3.add(mfaopen); } {mfa.setEnabled(false);mfa.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){ Stringss=dfata.getText().toString(); Stringss1=dfastart.getText().toString(); Stringss2=dfaend.getText().toString(); DFAtoMFAdm=newDFAtoMFA(ss,ss1,ss2,signString);dm.display();mfata.setText(dm.tcstring);mfastart.setText(dm.mfastartstr);mfaend.setText(dm.mfaendstr);signString=dm.signstring; } });panel_3.add(mfa); } { JButtonmfasave=newJButton("保存");mfasave.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論