第一篇:實驗一詞法分析器的設計與實現
實驗一詞法分析器的設計與實現
一、實驗目的1.了解并掌握詞法分析器的原理及工作過程
2.理解詞法分析器的狀態圖表示方法
二、實驗內容
用適當的程序設計語言編制一個詞法分析程序,并完成相應的調試,要求該程序能夠從指定的文件中讀入源程序,并將此源程序變成語義等價的單詞序列,輸出單詞序列。
提示:
1.源程序可限定為某個語言的子語言,如C語言的子集,允許源程序中有注釋行,其中的關鍵字自行設定,可參見書66頁的編碼表,保留字表為詞法分析器已知的表格(可采用二維數組的形式存儲)
2.參考程序見書中104-105頁,程序中涉及的gettoken()和install_id()兩個過程的解釋見91頁上面3段的說明。
3.詞法分析器的輸入輸出示例:
輸入:if(i>10)then i=0
輸出:
(10, if)
(20,()
(50,i)
(21,>)
(51,10)
(22,))
(11,then)
(50,i)
(23,=)
(51,0)
其中:50代表標識符的編碼,51代表常量的編碼
第二篇:用JAVA實現的Pascal語言的詞法分析器
import java.io.*;public class WordAnalyse { static char[] strbuf = new char[150];//定義一個數組,用以存放從文件讀取來的字符串
int keywordIndex;//取關鍵字的類號
String[] keyWord = {“and”,“begin”,“const”,“div”,“do”,“else”,“end”,“function”,“if”,“integer”,“not”,“or”,“procedure”,“program”, “read”,“real”,“then”,“type”,“var”,“while”,“write”};public static void main(String[] args)throws IOException {
WordAnalyse wa = new WordAnalyse();
wa.readFile(“d:/pascal.txt”);System.out.println(“******用JAVA實現的Pascal語言的詞法分析器*********”);
System.out.println(“******The Result:******”+“n”);
wa.run();
System.out.println(“n”+“******Complete!******”);}
//從文件中把字符串讀取到一個字符數組中
private void readFile(String url)throws IOException{
int ch,i=0;
FileReader fr = new FileReader(url);
while((ch=fr.read())!=-1){
strbuf[i++]=(char)ch;
} }
private boolean isLetter(char ch){
if('a'<=ch&ch<='z'||'A'<=ch&ch<='Z')
return true;
else return false;}
private boolean isDigit(char ch){
if('0'<= ch&&ch<='9')
return true;
else return false;}
private void run(){ //分析整個strbuf里的字符串
StringBuffer buf = new StringBuffer();//定義一個緩沖區
for(int i=0;i //當讀頭讀到spaceenterline的時候,忽略! if(strbuf[i]==' '||strbuf[i]=='t'||strbuf[i]=='n') i++; if(isLetter(strbuf[i])){ int k; buf.delete(0, buf.length()); while(isLetter(strbuf[i])||isDigit(strbuf[i])){ buf.append(strbuf[i]); i++; } i--; //查找buf里面的字符串是否為關鍵字 for(k =0;k if(new String(buf).equals(keyWord[k])){ keywordIndex = k; System.out.println(buf + “tt” +keywordIndex); break; } } if(k>20) System.out.println(buf + “tt” +21); } if(isDigit(strbuf[i])){ 1 buf.delete(0, buf.length()); while(isDigit(strbuf[i])){ buf.append(strbuf[i]); i++; } i--; System.out.println(buf + “tt” +22);} } } 2 } switch((char)strbuf[i]){ case',':System.out.println(strbuf[i] + “tt” + 23);break;case';':System.out.println(strbuf[i] + “tt” + 24);break;case'.':System.out.println(strbuf[i] + “tt” + 26);break;case'(':System.out.println(strbuf[i] + “tt” + 27);break;case')':System.out.println(strbuf[i] + “tt” + 28);break;case'[':System.out.println(strbuf[i] + “tt” + 29);break;case']':System.out.println(strbuf[i] + “tt” + 30);break;case'+':System.out.println(strbuf[i] + “tt” + 34);break;case'-':System.out.println(strbuf[i] + “tt” + 35);break;case'=':System.out.println(strbuf[i] + “tt” + 38);break;case':':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){ buf.append(strbuf[i]); System.out.println(buf + “tt” + 44);} else{ System.out.println(buf + “tt” + 25);i++;} };break;case'>':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){ buf.append(strbuf[i]); System.out.println(buf + “tt” + 43);} else{ System.out.println(buf + “tt” + 40);i--;} };break;case'<':{ buf.delete(0, buf.length());buf.append(strbuf[i]);i++;if(strbuf[i]=='='){ buf.append(strbuf[i]); System.out.println(buf + “tt” + 42);i++;} else if(strbuf[i]=='>'){ buf.append(strbuf[i]); System.out.println(buf + “tt” + 41);i++;} else{ System.out.println(buf + “tt” + 39);i++;} };break; }//switch結束 編譯原理實驗二 1.實驗名稱:一個簡單語言詞法分析器設計 2.實驗內容 (1)閱讀并理解教材第三章詞法分析p42“簡單語言”詞法分析構造實例 (2)完善P45給出的“簡單語言”詞法分析程序,使得該程序能夠在計算機上運行,完 全達到詞法分析器的設計基本要求: ① 讀入“簡單語言”源程序 ②濾掉“簡單語言”源程序中的“空白”字符 ③濾掉“簡單語言”源程序中的“注釋”字符 ④能夠識別出“簡單語言”源程序中的合法“單詞”并輸出識別出的一個個“單詞”符號序列。 ⑤ 識別出的一個個“單詞”符號要求為二元組形式: 指出單詞類別屬性,標識符自身值,常數值.3.提交實驗報告 ? “簡單語言”詞法分析程序“源程序”文件 ? “簡單語言”詞法分析程序“源程序”可執行文件 ? 對“簡單語言”詞法分析程序的測試實例:“簡單語言”源程序及其詞法分析結果。 201X-201X學年第x學期 《編譯原理》課程設計報告 院 系: 計算機科學與技術 班 級: XX級XX 班 學生姓名: XXXXXX 學 號: XXXXXXXX 指導老師: XXXXXX 計算機科學與技術學院監制 20XX年X月 目錄 1.課程設計的目的 2.課程設計的內容和要求 3.問題分析和相關知識介紹 4.設計思路和關鍵問題及其解決方案 5.測試和結果分析 6.總結和心得體會 附件1:參考文獻 附件2:核心源代碼 1.課程設計的目的(1)編寫詞法分析器 (2)加深對詞法分析器工作原理的了解和認識 2.課程設計的內容和要求 編寫詞法分析器,詞法分析器能夠識別關系算符,詞法分析器能夠識別標識符和關鍵字,詞法分析器能夠識別無符號數。 3.問題分析和相關知識介紹 構成詞法分析器的一種簡單方法是用狀態轉換圖來描述源語言詞法記號的結構,然后手工把這種狀態轉換圖翻譯成為識別詞法記號的程序。詞法分析器的任務是把構成源程序的字符流翻譯成詞法記號流。 4.設計思路和關鍵問題及其解決方案 把自然語言構造成正規式,把正規式構造成有限自動機NFA,然后根據子集構造法把有限自動機構造成無限自動機DFA,根據極小化DFA狀態數算法把DFA構造成最簡DFA,其次根據最簡DFA畫出轉換表,根據轉換表畫出裝換圖,最后根據裝換圖就可以編寫詞法分析器。 5.測試和結果分析 6.總結和心得體會 通過本次試驗,不僅僅是我學會了C#基礎知識,而且還是我對詞法分析器有了更深入的認識,雖然在編寫詞法分析器過程中遇到了很多困難,例如:C#語言不熟悉,對此法分析器的工作原理分析的不透徹,但在老師和同學的幫助下,我有了很大的提高,通過不斷的努力最終順利的完成了課程設計,很感謝幫助我的XX同學和XX老師。附件1:參考文獻 《編譯原理(第2版)》 高等教育出版社; 《C#程序設計及應用教程(第2版)》 人民教育出版社。附件2: 1.Code文檔截圖 2.程序源代碼 using System;using System.Collections.Generic;using System.Text;using System.IO; namespace LexicalAnalysis { class Program { static string[] keys = { “static”, “true”, “return”, “string”, “Length”, “break”, “Console”, “WriteLine”, “bool”, “false”, “ture”, “void”, “if”, “else”, “while”, “int”, “float”, “for”, “enum”, “default”, “case”, “double”, “do” }; static List static List static List static List static List //數字,標識符,空白,關系符,運算符 static void Main(string[] args){ string[] date = File.ReadAllLines(@“d:code.txt”);//路徑,并存入data for(int i = 0;i < date.Length;i++){ Console.WriteLine(“第” +(i + 1)+ “行code: ” + date.GetValue(i));analysisByLine(date[i]); } //分別輸出存儲在四個List中的String Console.WriteLine(“關鍵字,輸入回車”);//輸出所有的關鍵字 Console.ReadLine(); foreach(string id in key){ Console.WriteLine(id); } Console.WriteLine(“標識符,輸入回車”);//輸出所有的標識符 Console.ReadLine();foreach(string id in bsf){ Console.WriteLine(id); } Console.WriteLine(“數字,輸入回車”);Console.ReadLine();foreach(string id in sz){ Console.WriteLine(id); } Console.WriteLine(“關系運算符,輸入回車”);Console.ReadLine();foreach(string id in gx){ Console.WriteLine(id); } Console.WriteLine(“算數運算符,輸入回車”);Console.ReadLine();foreach(string id in ys){ Console.WriteLine(id); } Console.WriteLine(“輸入回車退出”); Console.ReadLine(); } static void analysisByLine(string code) //輸出所有的數字 //輸出所有的關系運算符//輸出所有的算數運算符 { char a = ' ';string temp = “";int j = 0;while(j < code.Length){ a = code[j];temp = ”“;if(Char.IsLetter(a)|| a == '_')//是否為標識符 { temp = temp + a.ToString();j++;a = code[j];while(Char.IsLetterOrDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} if(isKey(temp)){ //Console.WriteLine(”保留字:“+temp); if(!key.Contains(temp)){ // Console.WriteLine(”添加成功“);key.Add(temp);} } else { //Console.WriteLine(”標識符:“+temp); if(!bsf.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);bsf.Add(temp);} } } else if(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j]; } //判斷是否是小數 if(a.Equals('.')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} //判讀是否是科學記數法 if(a.Equals('E')|| a.Equals('e')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} } } // Console.WriteLine(”數字:“+temp);if(!sz.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);sz.Add(temp);} } else if(a == '<'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];} else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];} //Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);gx.Add(temp);} } else if(a == '='){ temp = temp + a.ToString();j++; a = code[j];// Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功關系==“);gx.Add(temp);} } else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];} // Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);gx.Add(temp);} } else { if(a == '+' || a == '-' || a == '/' || a == '*'){ temp = temp + a.ToString();j++;a = code[j];//Console.WriteLine(”運算符“+temp);if(!ys.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);ys.Add(temp);} } else { j++;} } } } //判斷是不是保留字的IsKey方法 static bool isKey(string key){ bool flag = false;for(int i = 0;i < keys.Length;i++) if(keys[i] == key){ flag = true;//Console.WriteLine(key+”是不是key“+flag);break;} else { flag = false; } //Console.WriteLine(key+”是不是key“);// Console.WriteLine(flag+”是不是key");return flag; } } } 題目: 2013 PLC組態一體化教學實驗平臺 設計與實現 單位部室:陽煤職教中心實踐教學部 專 業:機電一體化與自動控制 作 者:陳志鵬 指導教師: 年10月23日 PLC組態一體化教學實驗平臺設計與實現 摘要: 隨著陽煤集團高產高效礦井的建設,礦井機電設備向著高電壓、大功率、控制系統高科技方向發展,PLC在煤礦應用上越來越廣泛,它的簡化接線、性能可靠、事故率低、編程容易、控制多樣等特點,為越來越多的工程師所喜歡,有著廣闊的發展前景。同時PLC是一門實踐性非常強的課程,實驗環節至關重要。針對如何在低成本條件下進行PLC一體化教學,同時保證教學效果,提出了PLC電氣控制系統設計與組態監控設計相結合的PLC一體化教學課程。實踐表明,監控組態技術的應用可以大大提高學生的編程技巧和動手能力,豐富學生的工程實踐經驗,達到一體化教學的目的。 關鍵詞:PLC ;一體化教學 ;教學實驗平臺 ;組態控制技術 PLC簡介及它在煤礦生產方面的應用 PLC稱作可編程邏輯控制器(Programmable Logic Controller,PLC),它主要用來代替繼電器實現邏輯控制。隨著技術的發展,這種采用微型計算機技術的工業控制裝置的功能已經大大超過了邏輯控制的范圍,因此,今天這種裝置稱作可編程控制器,簡稱PC。但是為了避免與個人計算機(Personal Computer)的簡稱混淆,所以將可編程序控制器簡稱PLC。PLC自1969年美國數據設備公司(DEC)研制出現,現行美國、日本、德國的可編程序控制器質量優良,功能強大。PLC主要特點有: ① 可靠性高,抗干擾能力強。② 配套齊全,功能完善,適用性強。③ 易學易用,深受工程技術人員歡迎。④ 系統的設計、建造工作量小,維護方便。⑤ 體積小,重量輕,能耗低,通用性強。 隨著煤礦機械化程度的不斷提升,PLC在實際生產中得到了廣泛 PLC一體機 的應用。例如:主井箕斗提升就是利用了PLC控制系統實現了定量裝載。地面主提升絞車均采用了雙PLC加可控硅模塊控制系統。煤礦井下采煤機、綜掘機、主要扇風機、主排水泵等大型控制設備的核心元件均采用PLC,井下各種低壓磁力啟動器核心元件也逐步為PLC所代替。地面廠的數控機床等也已經采用了PLC控制,隨著現代化管理水平的不斷提高,PLC和組態軟件的有效結合在煤礦生產領域中得到了越來越廣泛的應用。 2 組態控制技術簡介及應用 組態控制技術屬于計算機控制技術,利用組態控制技術構成的計算機測控系統的原理框圖所示可以看出它們是由傳感器、下位機、上位機等幾部分組成。雖然從結構上看與一般計算機測控系統 組態控制技術框圖 基本相似,但是采用組態技術的計算機控制系統從硬件設計到軟件開發都具有組態性,系統的可靠性和開發速度都得到了大幅度提高。通常認為,組態技術是計算機控制技術綜合發展的結果,是技術成熟化的標志。在組態概念出現之前,要用計算機實現某一控制任務,都是通過編寫程序(如使用 C等)來實現的。編寫程序不但工作量大、周期長、而且可靠性差。組態控制技術的出現,解決了這個問題,對于過去需要幾個月的工作,通過組態幾天就可以完成。 目前,國內外許多自動化設備生產廠家,如德國西門子公司、日本三菱、臺灣研華、中國時利和等,生產了眾多供選擇的工業標準機 箱、工業級元件、總線結構過程通道板卡、工控機接口模塊等,為推廣硬件組態奠定了基礎。在軟件設計上由于采用成熟的組態軟件進 行系統設計,軟件開發周期大大縮短了。組態軟件是在自動控制系統監控層一級的軟件平臺和開發環境,能以靈活多樣的組態方式(而不是編程方式)提供良好的用戶開發界面和簡捷的使用方法,其予設置的各種軟件模塊可以非常容易地實現和完成監控層的各項功能,并能同時支持各硬件廠家的計算機和I/O設備,與高可靠的工控計算機和網絡系統結合,可向控制層和管理層提供軟硬件的全部接口,進行系統集成。需要指出,組態軟件不僅是組態控制技術中的重要組成部分,而且由于具有遠程監控、數據采集、數據分析、過程控制等強大功能,在自動化系統中占據主力軍的位置,逐漸成為工業自動化系統中的靈魂。實例介紹PLC一體化教學實驗平臺的設計與實現 下面用西門子公司的Step7 Pro(內部包含有模擬器PLCSIM)和WINCC組態軟件來仿真PLC基礎實驗--機械手實驗。 3.1軟件準備與硬件連接 首先需要一臺裝好了Step7 Pro和 WINCC的計算機,然后準備一臺型號為S7-200(300,400)的西門子PLC。S7-200的編程口通過一條通信電纜(PC/PPI)與計算機的USB通信口連接,這樣就可以在計算機上進行編程和監控了。 編程下載 仿真模擬 3.2 控制要求及I/O分配 機械手最開始處于左上端(左限位行程開關處于動作狀態)。運行過程為:下將YV2--夾緊YV5--上升YV1--右移YV4--下將YV2--放松YV5上升YV1向左返回初始位置。自動控制:按下自動控制的起動按鈕,機械手運行上述控制過程。按下停止時,機械手必須運行完當前周期停在初始位置。 I/O分配 梯形圖 打開Step7 Pro根據控制要求進行程序的梯形圖的編制,程序通過編譯后下載到PLC中。下載完成后,關閉Step7 Pro,打開WINCC進行組態設計。 3.3 WINCC組態設計 利用WINCC組態軟件建立監控系統,在工作臺實時數據庫中建立 對應的變量,都為開關型。然后設置好組態軟件與PLC的串口通信方式。至此,已經將組態軟件中的變量與外部PLC設備的端子進行連接,當PLC的輸入、輸出繼電器狀態發生變化時,將直接反映到組態軟件的變量。最后建立監控畫面模擬機械手實際工作情況。WINCC組態軟件內部提供基本繪圖工具,同時提供了豐富的元件庫,用于畫較復雜但常用的元件圖形,如電機、閥門等。利用這些元件進行組態,可建立監控畫面。對于各個元件對應設置相應的動畫連接。監控畫面中指示燈分別用顏色的變化指示機械手的工作狀態,即當放下物體時,下移指示燈為綠色,否則顯示紅色,其它燈工作情況相似。接下來將元件的動作與變量的變化進行動畫連接,即可利用監控畫面控制機械手的動作情況。當沒有實際裝置時,通過監控畫面可以讓學生有實際操作的感受,從而增加工程實踐的經驗。 組態軟件最突出的特點就是實時多任務。其用戶是自動化工程設計人員,目的就是讓用戶迅速開發出適合自己需要的可靠的應用系統。典型應用實例如圖。 I/O分配流程圖 梯形圖 傳統PLC實訓課與組態一體化教學 傳統PLC實訓課的被控對象多為工業設備,一般都有體積大、質量大、價格高等特點,很難在實驗室配備。為了盡可能模擬被控對象,使缺乏實際知識的學生增加感性認識,許多學校在PLC實驗室安裝了模擬盤,如十字路口交通燈模擬盤、洗衣機模擬盤等,實驗相應內容時,將PLC輸入端/輸出端連接到模擬盤對應的發光二極管上。這種模擬盤方法,一則限制了實驗內容,二則不形象,不直觀,三則連線很多,耽誤時間。實踐證明,教學效果并不理想。但是,即使這種模擬盤,在陽煤職教中心實踐部微機控制實驗室中也只有兩套。從一體化教學角度上講,這種配置遠遠不能滿足為學生開設實驗課的需要。另外,隨著申辦示范校工作的深入展開,PLC實驗室也有擴充和更新的必要。如果仍然采用模擬盤方式,不僅占地大、花錢多,而且隨著PLC實驗內容的不斷更新,模擬盤方式也會很快落后,最后被淘汰。 既然的PLC被控對象多為工業設備和機械,那么就給PLC實訓課帶來一個問題:采用真實被控對象既不現實,也不安全;沒有被控對象模型,既不便學生理解實驗內容,也很難激發學生的學習興趣。將可編程控制器技術與組態軟件有機結合,能為PLC的實訓課教學提供一條新的途徑。利用組態軟件全真模擬PLC的被控對象,學生不需要實物而僅通過微機的顯示器就可檢驗所編程序的正確與否和執行結果,這給師生雙方都提供了很大方便。結束語 從教學意義上來說,用計算機組態全真模擬被控對象,不但可以 克服采用真實被控對象的缺點,而且可以用有限的設備、低廉的成本、多樣化的程序,來豐富學生的實驗課內容,大大增強PLC實驗課的教學效果,形成理論、仿真、實踐三位一體的教學模式,達到一體化教學的目的。 參考文獻: [1] 林小峰.可編程控制器原理及應用[M].北京:高等教育出版社,1994.[2] 田瑞庭.可編程控制器應用技術[M].北京:機械工業出版社,1994.[3] 張萬忠.可編程控制器應用技術[M].北京:化學工業出版社,2001.[4] 梁冠英,等.PLC在礦井提升信號系統中的應用[J].煤炭技術,2008.[5] 袁秀英 組態控制技術[1] 北京:電子工業出版社。 [6] 嚴盈富 監控組態軟件與PLC入門[1]北京:人民郵電出版社。 [7] 周美蘭,周封,王岳宇 電氣控制與組態設計[1]北京:科學出版社。第三篇:編譯原理實驗二(設計一個詞法分析器)
第四篇:《編譯原理》課程設計報告--詞法分析器
第五篇:PLC一體化教學實驗平臺設計與實現