編譯原理課程設計-簡單計算器實現(xiàn)_第1頁
編譯原理課程設計-簡單計算器實現(xiàn)_第2頁
編譯原理課程設計-簡單計算器實現(xiàn)_第3頁
編譯原理課程設計-簡單計算器實現(xiàn)_第4頁
編譯原理課程設計-簡單計算器實現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、課程設計報告課程:編譯原理學號:姓名:班級:11級嵌入式應用技術班教師:時間:2014年6月計算機科學與技術系設計名稱:簡單計算器的實現(xiàn)設計內容、目的與要求:設計內容:計算器的功能要求如下:可以支持加(+)、減(-)、乘(*)、除(/)運算,如3+4-5*2/2;支持括號運算,如(4+5)*5/8。用戶輸入表達式后,轉化為逆波蘭式并執(zhí)行計算,最后輸出該表達式的結果。設計目的:1、對單詞的構詞規(guī)則有明確的定義;2、編寫的分析程序能夠正確識別源程序中的語法符號;3、計算器源程序的以.c格式輸出;4、對于源程序中的語法錯誤,能夠做出簡單的錯誤處理,給出簡單的錯誤提示, 保證順利完成整個源程序的分析;

2、5、計算器能夠實現(xiàn)加,減,乘,除,混合運算,多項式運算設計要求:1、 將非后綴式用來表示的算術表達式轉換為用逆波蘭式來表示的算術表達式,并計算用逆波蘭式來表示的算術表達式的值。2、 掌握利用算符優(yōu)先分析法完成中綴表達式到逆波蘭式的轉化。計劃與進度安排:5月20日5月21日:確定本次課程設計研究課題:實現(xiàn)簡單計算器。5月22日5月30日:進行需求分析,分析該計算器具有哪些功能,并明確該課題的一些要求。5月31日6月 3日:查找相關資料和書籍,了解本課題涉及有關知識,如:編譯原理的一些基本概念,逆波蘭式的基本概念,以及逆波蘭式的轉化問題等。6月 4日6月 8日:概要設計,將程序的幾大模塊分開來設計

3、,畫出程序的流程圖6月 8日6月10日:詳細設計,寫出代碼并進行調試6月10日6月12日:運行程序,如果能夠實現(xiàn)本次課程設計則進行優(yōu)化,如果不能滿足要求則繼續(xù)改進。6月13日6月15日:對本次課程設計進行分析總結。設計過程、步驟(可加頁):一、需求分析1.1總述在日常的學習與工作過程中, 經常遇到計算表達式數(shù)值的問題, 諸如34-(8+5*10)。如果人為地分步計算, 難免因疏漏了括號或字符而導致結果出錯。表達式計算器具有計算表達式結果的功能,大大方便了學習與工作。本次開發(fā)的表達式計算器能幫我們對數(shù)據進行有效的運算,如通過四則運算能實現(xiàn)對輸入數(shù)據的加減乘除。本課程設計結合了編譯原理中的利用算符

4、優(yōu)先分析法完成中綴表達式到逆波蘭式的轉化,并計算輸入表達式的結果。1.2編寫表達式計算器的意義我們每個人都使用過計算器, 專用的計算器都是一個現(xiàn)成的器件, 是由運算芯片完成運算功能的。而且只能進行單純的加、減、乘、除運算, 不能進行表達式運算。那么如何用計算機來實現(xiàn)一個基于表達式的計算器呢? 用計算機來實現(xiàn)一個基于表達式的計算器, 也就是用編寫程序( 即軟件) 的方法來實現(xiàn)。所謂的編譯程序是指這樣的一種程序, 它能夠把某一種語言程序( 稱為源語言程序) 轉換成另一種語言程序( 稱為目標語言程序) , 而后者與前者在邏輯上是等價的。四則混合計算器的輸入是一個由字符組成的表達式( 源程序) , 如

5、果這個表達式是合法的, 則輸出是這個表達式的計算結果( 目標代碼) ; 否則輸出錯誤信息。因此四則混合計算器是一個典型的編譯程序。編譯原理是計算機軟件專業(yè)的一門重要的專業(yè)必修課。盡管編譯過程與外文書刊的翻譯工作過程比較類似, 但由于編譯程序所翻譯的畢竟不是自然語言, 必然有其自身特性, 因而學生普遍認為這門課程是專業(yè)課中比較難于學習的。即使學習了編譯原理這門課, 大多數(shù)學生也不可能就開發(fā)出一個編譯程序。事實上, 許多從事計算機專業(yè)的人士也未能編寫出一個完整的編譯系統(tǒng)。而編制四則混合運算的計算器, 就等價于編寫一個小的編譯系統(tǒng), 而且又具有可實現(xiàn)性, 因此, 把這個題目作為編譯原理學習的一個測驗

6、題目是非常適合的。現(xiàn)有的編譯程序通常有兩大類: 一類是翻譯, 另一類是解釋。所謂翻譯, 是指在計算機中放置一個能為計算機直接執(zhí)行的翻譯程序, 它以某一種程序設計語言( 源語言) 所編寫的程序( 源程序) 作為翻譯或加工的對象, 當計算機執(zhí)行翻譯程序時, 就將它翻譯為與之等價的另一種語言目標語言的程序( 目標程序) 。如 C 編譯程序就是一種翻譯程序, 它的源語言和目標語言分別是相應的 C 語言和機器語言。解釋程序也是以源程序作為它的輸入, 它與編譯的主要區(qū)別是在解釋程序的執(zhí)行過程中不產生目標程序, 而是邊解釋邊執(zhí)行源程序本身。1.3功能要求要求:實現(xiàn)具有加、減、乘、除、括號等運算的簡單計算器,

7、輸入表達式,轉換為逆波蘭式,輸出該表達式的值。二、概要設計2.1 開發(fā)環(huán)境操作系統(tǒng): Windows 7開發(fā)平臺: VC+6.0開發(fā)語言:C2.2 總體設計程序在VC+6.0中使用面向對象的技術實現(xiàn)了計算器。程序主要結構如下:1.定義部分:定義常量、變量、數(shù)據結構。2.初始化:設立算符優(yōu)先分析表、初始化變量空間(包括堆棧、結構體、數(shù)組、臨時變量等); 3.控制部分:從鍵盤輸入一個表達式符號串;4.利用算符優(yōu)先分析算法進行表達式處理:根據算符優(yōu)先分析表對表達式符號串進行堆棧(或其他)操作,輸出分析結果,如果遇到錯誤則顯示錯誤信息。5.對生成的逆波蘭式進行計算。2.2.1逆波蘭式定義將運算對象寫在

8、前面,而把運算符號寫在后面。用這種表示法表示的表達式也稱做后綴式。逆波蘭式的特點在于運算對象順序不變,運算符號位置反映運算順序。采用逆波蘭式可以很好的表示簡單算術表達式,其優(yōu)點在于易于計算機處理表達式。2.2.2逆波蘭表達式的運算法則利用一個棧單純地從左至右掃描逆波蘭式中各個字符,就能計算出他們的值。戰(zhàn)中保存的是未被使用的全部的運算對象它們或者是已經掃描過的,或者是某種運算所產生的結果。運算規(guī)則如下:如果掃描的字符是操作符,則其值進棧,并掃描下一個字符如果掃描的字符是一個二目運算符,則對棧頂?shù)膬蓚€操作數(shù)執(zhí)行該運算,并用運算的結果代替這兩個元素。如果掃描的字符是一個一目運算符,則對棧頂?shù)牟僮鲾?shù)執(zhí)

9、行該運算,并用運算的結果代替該運算對象。2.2.3逆波蘭式生成的設計思想及算法(1) 首先構造一個運算符棧,此運算符在棧內遵循越往棧頂優(yōu)先級越高的原則。(2) 讀入一個用中綴表示的簡單算術表達式,表達式以“/0”結束。(3) 從左至右掃描該算術表達式,從第一個字符開始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結束并將該數(shù)字串直接輸出。(4)如果不是數(shù)字,該字符則是運算符,此時需比較優(yōu)先關系。做法如下:將該字符與運算符棧頂?shù)倪\算符的優(yōu)先關系相比較。如果,該字符優(yōu)先關系高于此運算符棧頂?shù)倪\算符,則將該運算符入棧。倘若不是的話,則將此運算符棧頂?shù)倪\算從棧中彈出,將該字符入棧。(4) 重復上述操作直至

10、掃描完整個簡單算術表達式,確定所有字符都得到正確處理,我們便可以將中綴式表示的簡單算術表達式轉化為逆波蘭表示的簡單算術表達式。圖一 生成逆波蘭式流程圖2.2.4表達式計算的設計思想及算法(1)構造一個棧,存放運算對象。(2)讀入一個用逆波蘭式表示的簡單算術表達式。 (3)自左至右掃描該簡單算術表達式并判斷該字符,如果該字符是運算對象,則將該字符入棧。若是運算符,如果此運算符是二目運算符,則將對棧頂部的兩個運算對象進行該運算,將運算結果入棧,并且將執(zhí)行該運算的兩個運算對象從棧頂彈出。如果該字符是一目運算符,則對棧頂部的元素實施該運算,將該棧頂部的元素彈出,將運算結果入棧。 (4)重復上述操作直至

11、掃描完整個簡單算術表達式的逆波蘭式,確定所有字符都得到正確處理,我們便可以求出該簡單算術表達式的值。圖二 表達式結果計算流程圖結果與分析(可以加頁): 圖三 實現(xiàn)計算器加法功能圖四 實現(xiàn)計算器減法功能圖五 實現(xiàn)計算器乘法功能圖六 實現(xiàn)計算器除法功能圖七 實驗計算器混合運算功能設計體會與建議: 在期末的課程設計中,我們小組討論選擇一個比較熟悉的課題簡單計算器的實現(xiàn)。本課題的設計要求是實現(xiàn)具有加、減、乘、除、括號等運算的簡單計算器,輸入表達式,輸出該表達式的值。從大一學習C語言,到大三學習JAVA,我們都接觸過實現(xiàn)計算器的實驗,對于本次的課程設計,我們還是有點基礎。而這次的課程設計我們選擇是用C語

12、言編寫的。設計的主要原理是用后綴表達式和堆棧實現(xiàn)對表達式的分析后進行計算。 在編程的過程中,有些C語言的知識已經忘記,我重新找出C語言的書,一邊重溫之前學習的知識,一邊編寫代碼。在此,我運用到編譯原理中間代碼生成的一種形式逆波蘭式。逆波蘭式生成的要點是運算對象順序不變,運算符緊跟運算對象之后。掌握了這個要點,理解起來還是很容易的。在這次的課程設計中,通過我們小組的積極配合,共同努力,我們很順利的完成這次任務。但是我感覺有兩點不足,就是我們不能實現(xiàn)小數(shù)的計算,再者就是運行的界面不夠美觀。這兩點需要提升??偟膩碚f,對于這次課程設計我很滿意。 這學期學習編譯原理這門課程,一開始我認為學習編譯原理就是

13、了解一些原理,理論的知識,是不需要編寫代碼的,但是在第一堂課經過老師的介紹之后,我了解到,雖然本課程是編譯原理,書本上講到的都是一些理論知識,但是無論是哪一門課程都是需要有實踐作為基礎才能夠將其學習的更好。在第一次課上,老師就聲明這門課比較難,要認真學,所以我很認真的對待這門課程。本次課程設計是實現(xiàn)一個簡易的計算器,經過大一以到大三的學習,再重新運用C語言編程感覺還挺上手的,這也可以讓我重新復習一下C語言的知識。這次課程設計采用逆波蘭式的知識,這可以很好的表示簡單算術表達式,其優(yōu)點在于易于計算機處理表達式。本次設計使我進一步端正了我的學習態(tài)度,學會了實事求是,對自己要嚴格要求。我覺得動手做設計

14、之前,頭腦里必須清楚該怎么做,這一點是很重要的。就目前來說,我的動手能力雖然差一點,但我想,通過我的不懈努力,在這方面,我總會得到提高。在此次的課程設計中我最大的體會就是進一步認識到了理論聯(lián)系實踐的重要性。總而言之,此次課程設計讓我學到了好多平時在課堂上學不到的東西,增加了我的知識運用能力,增強我的實際操作能力。我相信經過實踐后的學習我可以將編譯原理這門課程掌握的更好。編譯原理是一門比較難懂但是又非常核心的計算機課程,在學習的過程中對什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務,熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程、構造工具及其相關的技術有了大致的了解。但是要想真正

15、理解,那就需要實踐。本次課程設計就是一個將課本上的知識運用于實踐的過程。本次課程設計是實現(xiàn)一個簡單的計算器,該計算器可以支持加(+)、減(-)、乘(*)、除(/)運算,如3+4-5*2/2。支持括號運算,如(4+5)*5/8。用戶輸入表達式后,轉化為逆波蘭式并執(zhí)行計算,最后輸出結果。通過本次的課程設計,加深了對于編譯原理中算符優(yōu)先分析算法的理解,通過自己編寫一個程序去實現(xiàn)這個算法,增強了對于編譯原理的理解和應用能力,從另一個方面,提高了理論與實踐相結合的能力,鍛煉了使用VC6等編程環(huán)境將課上所學習的各種理論知識轉換為可執(zhí)行的應用程序并使用其解決問題的能力,為進一步深入學習編譯原理打下了良好的基

16、礎,加深了動手能力的鍛煉。通過課程設計,與其他兩名同組的同學一起,以編譯原理課上所學知識為基礎,通過編程實現(xiàn)一個能夠實現(xiàn)簡單計算器的程序。在此過程中遇到了許許多多的問題,我們相互協(xié)同合作,充分利用了網絡搜索引擎的強大功能和學校圖書館的大量相關書籍,最終解決了所遇到的各種各樣的問題,完成了預定的任務。雖然實現(xiàn)了該簡單計算器,但我們深知,本次課程設計還存在一些不足。比如:我們還可以將算法進行優(yōu)化;計算器的功能不夠強大,可以加以改進成為一個科學計算器;沒有制作界面,不夠美觀實用等。由于時間有限,這些不足我們只能在接下來的時間里繼續(xù)研究探討。源代碼:#include#include#define Ma

17、xSize 99void translate(char str,char exp) struct char dataMaxSize; int top; op; char ch; int i = 0,t = 0; op.top = -1; ch = stri; i+; while(ch != 0) switch(ch) case (: op.top+;op.dataop.top=ch; break; case ): while(op.dataop.top != () expt=op.dataop.top; op.top-; t+; op.top-; break; case +: case -:

18、while(op.top != -1&op.dataop.top != () expt = op.dataop.top; op.top-; t+; op.top+; op.dataop.top = ch; break; case *: case /: while(op.dataop.top = /|op.dataop.top = *) expt = op.dataop.top; op.top-; t+; op.top+; op.dataop.top = ch; break; case : break; default: while(ch = 0&ch = 0&ch = 9) d = 10*d+ch-0; ch = expt; t+; st.top+; st.datast.top = d; ch = expt; t+; return st.datast.top;int m

溫馨提示

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

評論

0/150

提交評論