版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> Online C Complier</p><p><b> 摘要</b></p><p> C語(yǔ)言在1970年由丹尼斯.里奇研制出來(lái)后發(fā)展至今,以它高效、靈活、功能豐富、表達(dá)力強(qiáng)和較高的移植性等特點(diǎn),廣泛用于系統(tǒng)與應(yīng)用軟件的開發(fā),2012年反超Java重登寶座,在程序員中說(shuō)起Hello World,可能就想起C語(yǔ)言了,同時(shí)在計(jì)算機(jī)二級(jí)考試中
2、,也有C語(yǔ)言的科目,所以在學(xué)習(xí)C語(yǔ)言的人當(dāng)中不僅僅是程序員,還有很大一部分是對(duì)計(jì)算機(jī)知識(shí),特別是編程語(yǔ)言了解相對(duì)較少的學(xué)生和社會(huì)人群。因此,需要一個(gè)相對(duì)簡(jiǎn)易,易理解的C語(yǔ)言編譯和學(xué)習(xí)環(huán)境提供給這種人群。</p><p> 本論文研究的是C語(yǔ)言在線編譯器,包含了C語(yǔ)言的編譯器,加入了C語(yǔ)言的學(xué)習(xí)資料,示例代碼,供初學(xué)者使用。系統(tǒng)架構(gòu)是基于B/S的系統(tǒng),在前端使用了JS,JQUERY,AJAX,CSS,HTML作為
3、布局和業(yè)務(wù)邏輯,由于C語(yǔ)言在線編譯器的特殊性,前端技術(shù)也承擔(dān)了一部分的C語(yǔ)言編譯的技術(shù),大量使用了正則表達(dá)式,來(lái)操作C語(yǔ)言代碼字符。后臺(tái)使用JAVA語(yǔ)言開發(fā),使用LL1算法,詞法分析來(lái)完成C語(yǔ)言的語(yǔ)法分析,應(yīng)用struts機(jī)制和頁(yè)面交互,后臺(tái)主要用于代碼編譯、錯(cuò)誤提示,前端主要用于代碼執(zhí)行。論文主要介紹了本課題的開發(fā)背景、所完成的功能和以及具體的開發(fā)過(guò)程。</p><p> 關(guān)鍵詞:C語(yǔ)言;編譯器;LL1算法;
4、正則表達(dá)式 </p><p><b> Abstract</b></p><p> C language developed by Dennis Ritchie in 1970, development has to express thecharacteristics of strong and high portability, efficient, flex
5、ible, feature-rich, widelyused for system and application software development, 2012overtake re-board the throne of Java programmers talk about the Hello World may think of the C language, while in the computer two exami
6、nations, but also the subjects of the C language, not just in learning the C language programmers.there are a large part of computerknowled</p><p> Keywords: C Language; complier; LL1 Algorithm, Regular exp
7、ressions目錄</p><p><b> 摘要I</b></p><p> AbstractII</p><p><b> 第一章 概 述1</b></p><p> 1.1 C在線編譯器的定義1</p><p> 1.2 web應(yīng)用價(jià)值1</
8、p><p> 1.3 C在線編譯器意義1</p><p> 1.4 開發(fā)技術(shù)1</p><p> 第二章 需求分析3</p><p> 2.1 可行性研究3</p><p> 2.1.1 技術(shù)可行性3</p><p> 2.1.2 經(jīng)濟(jì)可行性3</p><
9、p> 2.2 系統(tǒng)的功能要求3</p><p> 2.3 系統(tǒng)的性能要求4</p><p> 2.3.1可靠性要求4</p><p> 2.3.2時(shí)間要求4</p><p> 2.3.3并發(fā)處理能力要求4</p><p> 第三章 關(guān)鍵技術(shù)5</p><p> 3
10、.1 Ajax概述5</p><p> 3.2 Servlet概述5</p><p> 3.3 Jquery概述5</p><p> 3.4 正則表達(dá)式6</p><p> 3.5 LL1算法6</p><p><b> 3.6 編譯器6</b></p><
11、;p> 第四章 概要設(shè)計(jì)8</p><p> 4.1系統(tǒng)總體結(jié)構(gòu)8</p><p> 4.2代碼編輯模塊8</p><p> 4.3代碼分析器模塊9</p><p> 第五章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)10</p><p> 5.1代碼編輯模塊10</p><p> 5.1.
12、1 頁(yè)面設(shè)計(jì)10</p><p> 5.2 類設(shè)計(jì)10</p><p> 5.2.1 代碼分析器類圖11</p><p> 5.3代碼生成器模塊和代碼執(zhí)行模塊13</p><p> 第六章 系統(tǒng)測(cè)試15</p><p> 6.1 測(cè)試方法15</p><p> 6.2 測(cè)
13、試用例15</p><p> 6.3 測(cè)試結(jié)果16</p><p><b> 總結(jié)17</b></p><p><b> 致謝18</b></p><p><b> 參考文獻(xiàn)19</b></p><p><b> 第一章 概
14、 述</b></p><p> 1.1 C在線編譯器的定義</p><p> C語(yǔ)言是眾多編程語(yǔ)言中的姣姣者,每年都有很多高校學(xué)生以及一部分社會(huì)人群在學(xué)習(xí)C語(yǔ)言,但是傳統(tǒng)的雖然功能強(qiáng)大,但是相對(duì)復(fù)雜,并且C語(yǔ)言本身也相對(duì)較難[1],對(duì)于剛?cè)腴T的新手,會(huì)有一定的心里壓力,同時(shí)隨著互聯(lián)網(wǎng)的普及,許多互聯(lián)網(wǎng)應(yīng)用都給我們帶來(lái)了極大的便利,結(jié)合互聯(lián)網(wǎng)和傳統(tǒng)的C語(yǔ)言編譯器,就產(chǎn)生了有特
15、色的C語(yǔ)言在線編譯器,只要能上網(wǎng),不需要安裝任何的編譯環(huán)境和軟件就能夠?qū)慍語(yǔ)言程序,編譯C語(yǔ)言程序,執(zhí)行C語(yǔ)言程序,同時(shí)也提供了大量的C語(yǔ)言學(xué)習(xí)資料以及示例代碼,讓C語(yǔ)言初學(xué)者們能夠輕松簡(jiǎn)單快樂(lè)的學(xué)習(xí)C語(yǔ)言。 </p><p> 1.2 web應(yīng)用價(jià)值</p><p> 傳統(tǒng)應(yīng)用指的是僅僅能運(yùn)行在pc上的,單用戶操作的應(yīng)用,例如我們每天都會(huì)接觸的Office軟件,他們功能強(qiáng)大,但是僅僅
16、只能應(yīng)用在PC機(jī)上,無(wú)法和別人共享,在使用他們之前,你必須安裝對(duì)應(yīng)的軟件,他會(huì)占用你一定的硬盤空間和內(nèi)存,即有一定的消耗。但是如果將傳統(tǒng)的應(yīng)用換成互聯(lián)網(wǎng)應(yīng)用[2],那么它所產(chǎn)生的消耗就少得多,你僅僅需要能上網(wǎng),就能夠使用,而且隨著web技術(shù)的發(fā)展,新技術(shù)的成熟,比如Html5,互聯(lián)網(wǎng)應(yīng)用所產(chǎn)生的用戶體驗(yàn)也完全不亞于傳統(tǒng)的應(yīng)用,在功能上也能夠接近傳統(tǒng)應(yīng)用。所以,將一切的傳統(tǒng)應(yīng)用轉(zhuǎn)換成互聯(lián)網(wǎng)應(yīng)用都是合適的,甚至是您的操作系統(tǒng),在互聯(lián)網(wǎng)應(yīng)用上
17、的更高一層就是云,這也是今后云計(jì)算,云存儲(chǔ)的發(fā)展方向。</p><p> 1.3 C在線編譯器意義</p><p> C語(yǔ)言在線編譯器,不需要安裝任何的編譯環(huán)境和軟件就能夠?qū)慍語(yǔ)言程序,編譯C語(yǔ)言程序,執(zhí)行C語(yǔ)言程序。用戶能夠快速的開始編寫C語(yǔ)言程序[3],不需要承擔(dān)傳統(tǒng)編譯器所帶來(lái)的內(nèi)存消耗和硬盤存儲(chǔ)空間的消耗,同時(shí)C語(yǔ)言在線編譯器集學(xué)習(xí)和編寫代碼為一體,邊學(xué)習(xí)邊實(shí)踐是最好的學(xué)習(xí)方式
18、,同時(shí),用戶可以到任何一個(gè)可以上網(wǎng)的PC上編寫代碼,學(xué)習(xí)C語(yǔ)言,不需要費(fèi)時(shí)去安裝和配置傳統(tǒng)的編譯環(huán)境。</p><p><b> 1.4 開發(fā)技術(shù)</b></p><p> 本系統(tǒng)是嚴(yán)格的按照“軟件工程”的思想和開發(fā)流程進(jìn)行的[4],采用B/S架構(gòu)[5],前端使用Ajax、jquery,html、css將頁(yè)面顯示和頁(yè)面邏輯處理和頁(yè)面數(shù)據(jù)剝離開來(lái),結(jié)合Javascr
19、ipt,給予了頁(yè)面動(dòng)態(tài)效果[6],增強(qiáng)了用戶體驗(yàn)。后臺(tái)分為邏輯處理模塊和前端交互模塊,把業(yè)務(wù)邏輯和數(shù)據(jù)交互拆分開來(lái),便于后期的維護(hù)。</p><p> 在軟件工程開發(fā)思想的指導(dǎo)下,使用了最優(yōu)秀的開發(fā)工具Intellij,,使用SeverLet和Ajax技術(shù)[7],采用Tomcat7.0作為Web服務(wù)器。</p><p><b> 第二章 需求分析</b></
20、p><p> 根據(jù)調(diào)查顯示至今年四月份開始至今,C語(yǔ)言是世界上使用的最多的語(yǔ)言,C語(yǔ)言如此受歡迎已經(jīng)能夠足夠說(shuō)明C語(yǔ)言本身的優(yōu)點(diǎn)吸引著開發(fā)人員去使用它,也使廣大人群去學(xué)習(xí)它,同時(shí)在計(jì)算機(jī)二級(jí)考試中,也有C語(yǔ)言的科目。</p><p> 學(xué)習(xí)總是需要和實(shí)踐相結(jié)合,在學(xué)習(xí)C語(yǔ)言過(guò)程中需要大量的代碼編寫,這就需要一個(gè)對(duì)于新手來(lái)說(shuō)簡(jiǎn)單、方便的編譯器,來(lái)為學(xué)習(xí)C語(yǔ)言的人群減輕學(xué)習(xí)壓力,但是如今在PC
21、上運(yùn)行的C語(yǔ)言編譯器大多數(shù)比較復(fù)雜,C語(yǔ)言學(xué)習(xí)者還需要花心思去熟悉C語(yǔ)言編譯環(huán)境。</p><p> 在學(xué)習(xí)C語(yǔ)言的人當(dāng)中不僅僅是程序員,還有很大一部分是對(duì)計(jì)算機(jī)知識(shí)了解相對(duì)薄弱的學(xué)生和社會(huì)人群。同時(shí),這類人群的學(xué)習(xí)環(huán)境復(fù)雜,并不是每個(gè)人都擁有PC,他們可能去網(wǎng)吧,朋友家去練習(xí),而且各個(gè)操作系統(tǒng)也存在差異,這樣傳統(tǒng)編譯器就帶來(lái)了些麻煩,因?yàn)榈揭粋€(gè)新的環(huán)境去學(xué)習(xí),你就可能需要下載安裝軟件,而這個(gè)是一個(gè)相對(duì)耗費(fèi)時(shí)間
22、和精力的過(guò)程。因此,脫離系統(tǒng)環(huán)境的的C語(yǔ)言編譯環(huán)境提供給這類人群。</p><p><b> 2.1 可行性研究</b></p><p> 2.1.1 技術(shù)可行性</p><p> 在大學(xué),學(xué)習(xí)了Java[8]、Web、編譯原理等關(guān)鍵性的技術(shù)[9],為我之后的學(xué)習(xí)和寫這個(gè)系統(tǒng)打下了堅(jiān)實(shí)的基礎(chǔ),同時(shí)這些技術(shù)也實(shí)際應(yīng)用過(guò),增加了我能夠?qū)懞眠@個(gè)
23、系統(tǒng)的信心。這些技術(shù)已經(jīng)相當(dāng)成熟,遇見(jiàn)的問(wèn)題可以通過(guò)技術(shù)資料、搜索引擎解決。</p><p> 大學(xué)也培養(yǎng)了我的自學(xué)能力,對(duì)于陌生的知識(shí)能夠較快的接受和理解,并將他們投入實(shí)戰(zhàn)應(yīng)用。</p><p> 學(xué)校學(xué)習(xí)了軟件工程、軟件需求與分析等課程,加上在公司實(shí)習(xí)積累的經(jīng)驗(yàn),使得我能夠做好需求分析,架構(gòu)設(shè)計(jì)等工作,為編寫軟件打下了基礎(chǔ)[6]。</p><p> 2.1
24、.2 經(jīng)濟(jì)可行性</p><p> 經(jīng)濟(jì)可行性主要是從對(duì)項(xiàng)目的經(jīng)濟(jì)上進(jìn)行分析評(píng)價(jià)的,一方面是支出的費(fèi)用,包括編寫這個(gè)系統(tǒng)的成本,以及后期系統(tǒng)上線后需要服務(wù)器等硬件支持和網(wǎng)站維護(hù)的花費(fèi),另一個(gè)是取得的收益,在網(wǎng)站積累用戶后,可以和C語(yǔ)言培訓(xùn)機(jī)構(gòu)合作,加入培訓(xùn)機(jī)構(gòu)的廣告來(lái)獲取廣告費(fèi)用。</p><p> 2.2 系統(tǒng)的功能要求</p><p> C語(yǔ)言編譯器要實(shí)現(xiàn)
25、C語(yǔ)言語(yǔ)法檢驗(yàn)功能、C語(yǔ)言代碼轉(zhuǎn)換功能、運(yùn)行結(jié)果功能、C語(yǔ)言在線學(xué)習(xí)功能。其具體功能模塊如下: </p><p> C語(yǔ)言語(yǔ)法檢驗(yàn)?zāi)K:通過(guò)該模塊可以對(duì)用戶編寫的C語(yǔ)言進(jìn)行代碼掃描,檢驗(yàn)C語(yǔ)言程序語(yǔ)法錯(cuò)誤。</p><p> C語(yǔ)言代碼轉(zhuǎn)換模塊:通過(guò)該模塊可以實(shí)現(xiàn)將C語(yǔ)言代碼轉(zhuǎn)換為JS代碼。</p><p> 運(yùn)行結(jié)果模塊:通過(guò)該模塊可以實(shí)現(xiàn)將由C語(yǔ)言代碼轉(zhuǎn)換
26、過(guò)來(lái)的JS代碼運(yùn)行輸出結(jié)果。</p><p> C語(yǔ)言在線學(xué)習(xí)模塊:通過(guò)該模塊提供C語(yǔ)言學(xué)習(xí)資料以及示例代碼,供用戶學(xué)習(xí)[8]。</p><p> 2.3 系統(tǒng)的性能要求</p><p> 2.3.1可靠性要求</p><p> 系統(tǒng)沒(méi)有后臺(tái)數(shù)據(jù)庫(kù),不需要考慮后臺(tái)數(shù)據(jù)的完整性以及數(shù)據(jù)安全,同時(shí)系統(tǒng)大量的功能實(shí)現(xiàn)是由Javascript
27、去完成的,以及使用了Ajax技術(shù),減少了頁(yè)面和后臺(tái)的訪問(wèn),減少了惡意的Doc攻擊,也使得系統(tǒng)可以接受龐大的用戶同時(shí)訪問(wèn)。</p><p><b> 2.3.2時(shí)間要求</b></p><p> 在不考慮網(wǎng)絡(luò)狀況的情況下,系統(tǒng)響應(yīng)時(shí)間應(yīng)較迅速,一般控制在0.1秒以內(nèi)。</p><p> 2.3.3并發(fā)處理能力要求</p>&l
28、t;p> 系統(tǒng)能夠支持同時(shí)間多用戶的訪問(wèn)要求,并且保證運(yùn)行的順暢。</p><p><b> 第三章 關(guān)鍵技術(shù)</b></p><p> 3.1 Ajax概述</p><p> 傳統(tǒng)的Web應(yīng)用允許用戶端填寫表單(form),當(dāng)送出表單時(shí)就向Web服務(wù)器發(fā)送一個(gè)請(qǐng)求。服務(wù)器接收并處理傳來(lái)的表單,然后送回一個(gè)新的網(wǎng)頁(yè),但這個(gè)做法浪費(fèi)
29、了許多帶寬,因?yàn)樵谇昂髢蓚€(gè)頁(yè)面中的大部分HTML代碼基本上是相同的。由于每次應(yīng)用的溝通都需要向服務(wù)器發(fā)送請(qǐng)求,應(yīng)用的回應(yīng)時(shí)間就依賴于服務(wù)器的回應(yīng)時(shí)間。這導(dǎo)致了用戶界面的回應(yīng)比本機(jī)應(yīng)用慢得多。</p><p> 與此不同,AJAX應(yīng)用可以僅向服務(wù)器發(fā)送并取回必需的數(shù)據(jù),它使用SOAP或其它一些基于XML的頁(yè)面服務(wù)接口(接口),并在客戶端采用JavaScript處理來(lái)自服務(wù)器的回應(yīng)。因?yàn)樵诜?wù)器和瀏覽器之間交換的數(shù)
30、據(jù)大量減少(大約只有原來(lái)的5%),結(jié)果我們就能看到回應(yīng)(服務(wù)器回應(yīng))更快的應(yīng)用(結(jié)果)。同時(shí)很多的處理工作可以在發(fā)出請(qǐng)求的客戶端機(jī)器上完成,所以Web服務(wù)器的處理時(shí)間也減少了。</p><p> 3.2 Servlet概述</p><p> Servlet是一種服務(wù)器端的Java應(yīng)用程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,可以生成動(dòng)態(tài)的Web頁(yè)面。 它擔(dān)當(dāng)客戶請(qǐng)求(Web瀏覽器或其他HTTP
31、客戶程序)與服務(wù)器響應(yīng)(HTTP服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序)的中間層。 Servlet是位于Web 服務(wù)器內(nèi)部的服務(wù)器端的Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動(dòng)的Java應(yīng)用程序不同,Servlet由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlet的Java虛擬機(jī)。</p><p> 3.3 Jquery概述</p><p> jQuery是一個(gè)跨瀏覽器的 Ja
32、vaScript庫(kù)的設(shè)計(jì),簡(jiǎn)化了客戶端腳本的HTML。簡(jiǎn)單的說(shuō)jQuery是使用最流行的JavaScript庫(kù)。jQuery是開源碼軟件, jQuery的語(yǔ)法專門設(shè)計(jì),以使它更容易來(lái)瀏覽一個(gè)文檔,選擇DOM元素,創(chuàng)建動(dòng)畫,處理事件,開發(fā)Ajax應(yīng)用程序。jQuery還提供了插件開發(fā)創(chuàng)造能力的JavaScript庫(kù)。這使開發(fā)人員能夠創(chuàng)建抽象為低層次的互動(dòng)和動(dòng)畫,先進(jìn)的特效和高層次,主題能夠部件。jQuery庫(kù)的模塊化方法允許創(chuàng)建強(qiáng)大的動(dòng)態(tài)
33、網(wǎng)頁(yè)和Web應(yīng)用程序。</p><p> 微軟和諾基亞宣布其平臺(tái)上捆綁jQuery的,微軟采用它最早在ASP.NET AJAX框架和ASP.NET MVC框架,而諾基亞已經(jīng)融入他們的Web運(yùn)行時(shí)構(gòu)件開發(fā)平臺(tái)。</p><p><b> 3.4 正則表達(dá)式</b></p><p> 正則表達(dá)式(Regular Expression、rege
34、x或regexp,縮寫為RE),也譯為正規(guī)表示法、常規(guī)表示法,在計(jì)算機(jī)科學(xué)中,是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。在很多文本編輯或其他工具里,正則表達(dá)式通常被用來(lái)檢索和/或替換那些符合某個(gè)模式的文本內(nèi)容。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎[12]。</p><p><b> 3.5 LL1算法<
35、;/b></p><p> LL(1)是預(yù)測(cè)分析器,</p><p> 第一個(gè)L代表掃描模式是自左向右的,第二個(gè)L代表分析模式是最左推導(dǎo)。至于括號(hào)中的1代表在分析中最多向前看一個(gè)輸入字符。LL(1)的組成包括總控程序,分析棧和分析表,其中分析表是LL(1)分析器的核心。First集合以及后面講到的Follow集合都與分析表有關(guān)。分析棧:存放分析過(guò)程中的文法符號(hào)(待匹配和已經(jīng)推導(dǎo)
36、的串)。分析表:判斷當(dāng)前用那條文法進(jìn)行推導(dǎo)總控程序:做大的調(diào)度工作</p><p> 關(guān)于LL(1)文法的性質(zhì)如下:⑴任何LL(1)文法是無(wú)二義性的。⑵若一文法中的非終結(jié)符含有左遞歸,則它必然是非LL(1)文法。⑶非LL(1)語(yǔ)言是存在的。⑷存在一種算法,它能判定任一文法是否為L(zhǎng)L(1)文法。⑸存在一種算法,它能判定任意兩個(gè)LL(1)文法是否產(chǎn)生相同的語(yǔ)言。⑹不存在這樣的算法,它能判定上下文無(wú)關(guān)
37、語(yǔ)言能否由LL(1)文法產(chǎn)生。</p><p><b> 3.6 編譯器</b></p><p> 編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語(yǔ)言和文法、詞法分析、語(yǔ)法分析、語(yǔ)法制導(dǎo)翻譯、中間代碼生成、存儲(chǔ)管理、代碼優(yōu)化和目標(biāo)代碼生成。</p><p> 編譯器是將一種語(yǔ)言翻譯為另一種語(yǔ)言的計(jì)算機(jī)程序。編譯器將源程序(source lan
38、guage) 編寫的程序作為輸入,而產(chǎn)生用目標(biāo)語(yǔ)言(target language )編寫的等價(jià)程序。</p><p> 編譯器編譯程序的流程:</p><p> 掃描程序(scanner)</p><p> 在這個(gè)階段編譯器閱讀源程序(通常以析程序字符流的形式表示)。</p><p> 語(yǔ)法分析程序(parser )</p&g
39、t;<p> 語(yǔ)法分析程序從掃描程序中獲取記號(hào)形式的源代碼,并完成定義程序結(jié)構(gòu)的語(yǔ)法分析 (syntax analysis ),這與自然語(yǔ)言中句子的語(yǔ)法分析類似。語(yǔ)法分析定義了程序的結(jié)構(gòu)元素及其關(guān)系。通常將語(yǔ)法分析的結(jié)果表示為分析樹(parse tree)或語(yǔ)法樹(syntax tree)[13]。</p><p> 語(yǔ)義分析程序(semantic analyzer )</p>&
40、lt;p> 程序的語(yǔ)義就是它的“意思”,它與語(yǔ)法或結(jié)構(gòu)不同。程序的語(yǔ)義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語(yǔ)言都具有在執(zhí)行之前被確定而不易由語(yǔ)法表示和由分析程序分析的特征。</p><p> 代碼生成器(code generator)</p><p> 代碼生成器得到中間代碼(IR),并生成目標(biāo)機(jī)器的代碼</p><p><b> 第四章 概
41、要設(shè)計(jì)</b></p><p><b> 4.1系統(tǒng)總體結(jié)構(gòu)</b></p><p> 系統(tǒng)從縱向上分為兩層,即前端和后臺(tái),前端處理數(shù)據(jù)顯示,以及部分的業(yè)務(wù)邏輯,包括代碼的初步審查、代碼生成、代碼執(zhí)行,后臺(tái)主要負(fù)責(zé)代碼分析的業(yè)務(wù)邏輯,前端和后臺(tái)通過(guò)Ajax結(jié)合Severlet來(lái)進(jìn)行數(shù)據(jù)通訊。系統(tǒng)的框架如圖4.1所示。</p><p&
42、gt;<b> 4.2代碼編輯模塊</b></p><p> 代碼編輯模塊主要用于得到用戶輸入的代碼,并對(duì)用戶輸入關(guān)鍵字提示,其工作流程如圖3.2所示。</p><p> 4.3代碼分析器模塊</p><p> 代碼分析模塊主要處理從前臺(tái)傳遞過(guò)來(lái)的代碼,對(duì)代碼進(jìn)行詞法分析和語(yǔ)法分析,判斷用戶的代碼的正確性,如果用戶輸入的代碼有誤,能夠識(shí)
43、別出錯(cuò)誤的位置,并將錯(cuò)誤信息返回給前臺(tái),其工作流程如圖3.3所示</p><p> 4.4代碼生成器模塊和代碼執(zhí)行模塊</p><p> 代碼生成模塊主要處理編譯通過(guò)的代碼,利用正則表達(dá)式將原來(lái)的C語(yǔ)言代碼轉(zhuǎn)換成Javascript代碼并將生成的javascript代碼推送到頁(yè)面,讓瀏覽器去執(zhí)行,將結(jié)果顯示在頁(yè)面上,其工作流程如圖3.4所示</p><p>
44、第五章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 5.1代碼編輯模塊</b></p><p> 代碼編輯模塊主要用于得到用戶輸入的代碼,并對(duì)用戶輸入關(guān)鍵字提示。</p><p> 5.1.1 頁(yè)面設(shè)計(jì)</p><p> 1.使用Div實(shí)現(xiàn)TextArea</p><p> 在代碼編輯模塊
45、中,是使用了Div元素來(lái)模擬TextArea,因?yàn)門extArea中的內(nèi)容只允許是文字,同時(shí),對(duì)文字的字體和顏色的設(shè)置會(huì)應(yīng)用到整個(gè)TextArea中的文字內(nèi)容,不能對(duì)局部調(diào)整,但是我的需求是希望能對(duì)代碼中的關(guān)鍵字進(jìn)行高亮顯示,并改變顏色,所以TextArea不能夠滿足我的需求。在Div中我可以任意插入Html元素,同時(shí)也可以是用CSS樣式調(diào)整,使得Div的外觀和TextArea差不多,甚至比TextArea更加美觀[14],多以就選擇了
46、Div。</p><p> 2.頁(yè)面大小有限,而且頁(yè)面中還有其他很多元素,例如標(biāo)題,結(jié)果顯示模塊等,如何,然而用戶編寫的代碼量是不確定的,如何能夠滿足用戶能夠編寫任意量的代碼?</p><p> 在頁(yè)面中使用分頁(yè),用戶在本頁(yè)編輯滿了后,可以點(diǎn)擊下一頁(yè)繼續(xù)編輯,同時(shí)系統(tǒng)保證頁(yè)面不跳轉(zhuǎn),代碼不丟失,用戶可以編寫任意長(zhǎng)度的代碼,上下翻頁(yè)非常方便,在編輯也下方顯示當(dāng)前頁(yè)頁(yè)碼,可以讓用戶隨時(shí)了解
47、當(dāng)前所在的位置。</p><p><b> 5.2 類設(shè)計(jì)</b></p><p> 對(duì)用戶輸入的代碼進(jìn)行初步的判斷,提示用戶是否輸入了關(guān)鍵字,以及出入關(guān)鍵字的準(zhǔn)確性,并將關(guān)鍵字高亮顯示[15],顯示藍(lán)色,顯示1秒后,刪除包裝關(guān)鍵字的標(biāo)簽,然后重新組裝上關(guān)鍵字。</p><p><b> 關(guān)鍵字定義:</b><
48、/p><p> keyWord=["printf","print","int","float","double","bool","void","long","switch","case""else"
49、,"struct","enum","return","short","const","typedef","extern","continue","while","do","default","for"
50、,"static","if"];</p><p><b> 判斷是否是關(guān)鍵字</b></p><p> function isKeyWord(n) {}</p><p> 獲取最后當(dāng)前編輯代碼塊的一個(gè)單詞(依照用戶敲入空格為準(zhǔn))</p><p> function getL
51、astWord(n) {return lastword;}</p><p><b> 將最后關(guān)鍵字裁減掉</b></p><p> function cutLastWord(n) {}</p><p><b> 改變關(guān)鍵字的顏色</b></p><p> function dealKeyWo
52、rdColor() {}</p><p> 刪除已經(jīng)唄改變顏色的關(guān)鍵字,然后補(bǔ)上正常的關(guān)鍵字</p><p> function removeKeyword() {}</p><p> 用于將字體設(shè)置成原來(lái)的樣式</p><p> function resetWord(n) {return word;}</p><
53、p> 包裝keyword,使得代碼符合Html執(zhí)行的要求</p><p> function packKeyWord(keyword) {return word;}</p><p> 從文本中找出所有的單詞</p><p> function getWordList(code1) {}</p><p> 5.2.1 代碼分析器
54、類圖</p><p> 代碼分析器主要由詞法分析器和語(yǔ)法分析器構(gòu)成,其類圖結(jié)構(gòu)如圖5.1所示。</p><p> 代碼預(yù)處理:由功能類CodeAnalyser構(gòu)成,CodeAnalyser類圖如圖5.2所示。</p><p> 該類索引傳入的C語(yǔ)言代碼,并將找到的字符進(jìn)行分類處理</p><p> letterProcessor()用
55、于處理字符為字母的情況</p><p> digitProcessor()用于處理字符為數(shù)字的情況</p><p> otherProcessor()用于處理字符為特殊字符的情況</p><p> analyse調(diào)用上述的方法,分析取得的字符,重構(gòu)C語(yǔ)言代碼。</p><p> 詞法分析:由功能類WordAnalyser構(gòu)成,Word
56、Analyser類圖如圖5.3所示。</p><p> 圖5.3 WordAnalyser類圖</p><p> isKeyWord()用于判斷是否為關(guān)鍵字</p><p> isOperator()用于判斷是否為操作符</p><p> isDelimit()用于判斷是否為界符</p><p> andly
57、se()調(diào)用上述三個(gè)函數(shù),從UserCollection提取定義好的字符,來(lái)進(jìn)行比較判斷,并進(jìn)行處理。</p><p> 語(yǔ)法分析器:由功能了LL1Module構(gòu)成,LL1Module類圖如圖5.4所示</p><p> 圖5.4 LL1Module類圖</p><p> LL1()中使用LL1算法進(jìn)行語(yǔ)法分析,自定義棧來(lái)存儲(chǔ)文法,并對(duì)輸入字符串進(jìn)行匹配掃描,
58、來(lái)判斷合法性。</p><p> 四元式:由功能類FourYuanStyle構(gòu)成,用于分析四元式,處理C語(yǔ)言的語(yǔ)法,F(xiàn)ourYuanStyle類圖如圖5.5所示、</p><p> 圖5.5 FourYuanStyle類圖</p><p> fourYuanStyle()初始化四元式,四元式的定義在SYS類中</p><p> get
59、FourYuan()獲取已經(jīng)初始化完成的四元式數(shù)組</p><p> analyse()分析code,拆分出可構(gòu)的四元式,并存入靜態(tài)的四元式數(shù)組中,被用于CodeProcessor類</p><p> 5.3代碼生成器模塊和代碼執(zhí)行模塊</p><p> 代碼生成模塊主要處理編譯通過(guò)的代碼,利用正則表達(dá)式將原來(lái)的C語(yǔ)言代碼轉(zhuǎn)換成Javascript代碼并將生成
60、的javascript代碼推送到頁(yè)面[16],讓瀏覽器去執(zhí)行,將結(jié)果顯示在頁(yè)面上。如圖5.6.</p><p> 圖5.6 代碼生成流程圖</p><p> 代碼轉(zhuǎn)換器:使用CtoJava.js來(lái)完成這個(gè)功能模塊</p><p><b> 參與的函數(shù)如下:</b></p><p> 刪除原C代碼的函數(shù)頭</
61、p><p> function deleteMain(code) { return code;}//刪除指</p><p> 刪除指定索引處的字符</p><p> function deleteIndex(code, position) { return code;}</p><p> 查找到在code中指定字符的最后一個(gè)的
62、位置</p><p> function findLastChar(code, char) { return position;}</p><p> 處理printf串,轉(zhuǎn)換成可以被Javascript的代碼</p><p> function deal_printf(code) { return code;}</p><p&g
63、t; function replacePrintf(position, length, codeTemp1) { }</p><p> 生成Javascript寫到頁(yè)面的輸出語(yǔ)句</p><p> function getPrintfString(printf_position) { return null;}</p><p><b>
64、 對(duì)輸出語(yǔ)句進(jìn)行轉(zhuǎn)換</b></p><p> function printfProcess(printf_position) { }</p><p> 生成js 寫入homepage</p><p> function makeJavaJs(code) { }</p><p><b> 第六章 系統(tǒng)
65、測(cè)試</b></p><p><b> 6.1 測(cè)試方法</b></p><p> 在編寫代碼分析模塊時(shí),進(jìn)行了大量的單元測(cè)試,檢驗(yàn)代碼分析的可靠性,以及是否能夠提示正確的錯(cuò)誤信息,后期和前端頁(yè)面結(jié)合是進(jìn)行了集成測(cè)試,保證數(shù)據(jù)在前端和后臺(tái)之間傳遞的完整性[17],把單元測(cè)試穿插在編碼過(guò)程中進(jìn)行并及時(shí)改正了所發(fā)現(xiàn)的錯(cuò)誤[18],在系統(tǒng)完成進(jìn)行驗(yàn)收測(cè)試時(shí),
66、選擇可具有代表性的C語(yǔ)言代碼對(duì)系統(tǒng)功能進(jìn)行測(cè)試,驗(yàn)證C語(yǔ)言在線編譯器是否達(dá)到開發(fā)目標(biāo)。</p><p><b> 6.2 測(cè)試用例</b></p><p> 根據(jù)用例測(cè)試的目的是在系統(tǒng)測(cè)試過(guò)程中,驗(yàn)證系統(tǒng)各個(gè)功能是否可以完成預(yù)期目標(biāo),以及在測(cè)試中出現(xiàn)錯(cuò)誤時(shí)如何改正以達(dá)到其擬定功能。</p><p> 對(duì)代碼編譯模塊的測(cè)試:</p&g
67、t;<p> 以下對(duì)給出系統(tǒng)的功能的測(cè)試用例。</p><p><b> 輸入錯(cuò)誤C語(yǔ)言代碼</b></p><p> #include”studio.h”</p><p> int main(){</p><p><b> int a=10;</b></p>
68、<p> int c,d,b=10; </p><p> int x,y; </p><p> if(a>c){a=c+d+y;</p><p><b> a=b;</b></p><p><b> x=y-b;</b></p><p>
69、}else //此處少了一個(gè)“{”</p><p><b> a=c;</b></p><p><b> }</b></p><p> while(a>c){</p><p><b> a=c;</b></p><p><b&g
70、t; }</b></p><p> printf("a的值為:");</p><p> printf("%d",a);</p><p><b> }</b></p><p><b> $</b></p><p>
71、 頁(yè)面執(zhí)行結(jié)果:編譯失敗,在第9行出現(xiàn)錯(cuò)誤</p><p><b> 輸入正確C語(yǔ)言代碼</b></p><p> #include”studio.h”</p><p> int main(){</p><p><b> int a=10;</b></p><p>
72、 int c,d,b=10; </p><p> int x,y; </p><p> if(a>c){a=c+d+y;</p><p><b> a=b;</b></p><p><b> x=y-b;</b></p><p><b> }
73、else{</b></p><p><b> a=c;</b></p><p><b> }</b></p><p> while(a>c){</p><p><b> a=c;</b></p><p><b> }
74、</b></p><p> printf("a的值為:");</p><p> printf("%d",a);</p><p><b> }</b></p><p><b> $</b></p><p> 頁(yè)面執(zhí)行
75、結(jié)果:編譯通過(guò),結(jié)果:a的值為:10</p><p> 對(duì)C語(yǔ)言學(xué)習(xí)模塊的測(cè)試:</p><p> 點(diǎn)擊C語(yǔ)言學(xué)習(xí)的各個(gè)章節(jié),能夠成功跳轉(zhuǎn)到相應(yīng)的學(xué)習(xí)內(nèi)容。</p><p> 點(diǎn)擊C語(yǔ)言示例代碼,能夠顯示各個(gè)示例代碼</p><p><b> 6.3 測(cè)試結(jié)果</b></p><p>
76、通過(guò)C語(yǔ)言在線編譯器各種功能的測(cè)試,該系統(tǒng)基本達(dá)到了開發(fā)之初所擬定的目標(biāo),實(shí)現(xiàn)了C語(yǔ)言在線編譯器的預(yù)期功能。</p><p><b> 總結(jié)</b></p><p> 在大學(xué)的四年中,有很多自己想去實(shí)踐的東西,但是在技術(shù)上遇見(jiàn)很多問(wèn)題,所以總是不能夠?qū)崿F(xiàn)自己的想法,隨著各種相關(guān)的課程的開放,自己的自學(xué)能力的提高,漸漸的相信自己的實(shí)力,只要肯去鉆研,就能夠解決所有的
77、問(wèn)題。本次畢業(yè)設(shè)計(jì)是對(duì)大學(xué)四年學(xué)過(guò)的“c++程序設(shè)計(jì)語(yǔ)言“、“Java程序設(shè)計(jì)語(yǔ)言”、“Web編程技術(shù)”、“數(shù)據(jù)庫(kù)原理”、“軟件工程”、“軟件測(cè)試”等課程的一個(gè)具體實(shí)踐,是一個(gè)理論結(jié)合實(shí)踐的過(guò)程,也是對(duì)自己自學(xué)能力的一個(gè)肯定。作為一項(xiàng)畢業(yè)設(shè)計(jì)的任務(wù),C語(yǔ)言在線編譯器的設(shè)計(jì)與實(shí)現(xiàn)目標(biāo)是實(shí)現(xiàn)一個(gè)在瀏覽器上運(yùn)行的C語(yǔ)言編譯器。在設(shè)計(jì)與開發(fā)的過(guò)程中,我充分利用所學(xué)知識(shí),遇見(jiàn)不懂的技術(shù)就去學(xué)習(xí),遇見(jiàn)問(wèn)題就百度、谷歌解決,將理論聯(lián)系實(shí)踐,使自己對(duì)所
78、學(xué)的知識(shí)有一個(gè)更深刻的理解,并為以后的實(shí)際工作積累了實(shí)踐經(jīng)驗(yàn)。由于時(shí)間倉(cāng)促和技術(shù)所限,該系統(tǒng)存在一些不足之處,有待進(jìn)一步改進(jìn)和完善。</p><p> 本次的畢業(yè)設(shè)計(jì),也是對(duì)自己大學(xué)四年的學(xué)習(xí)的一個(gè)總結(jié)和檢驗(yàn)。設(shè)計(jì)之初,進(jìn)行需求分析,搜集了大量的素材,來(lái)判斷C語(yǔ)言在線編譯器的可行性。在前期工作完成之后,各種C語(yǔ)言本地編譯環(huán)境進(jìn)行了研究,使得之后的C語(yǔ)言在線編譯器能夠盡量滿足C語(yǔ)言入門學(xué)者的需求。設(shè)計(jì)階段,寫代碼
79、,調(diào)程序,反反復(fù)復(fù)出現(xiàn)問(wèn)題。在這期間我學(xué)會(huì)了很多,也得到了許多寶貴的經(jīng)驗(yàn)。我切實(shí)體會(huì)到了在軟件系統(tǒng)開發(fā)過(guò)程中,最重要也最困難的工作就是需求分析,需求分析是系統(tǒng)開發(fā)能否取得成功的關(guān)鍵。而對(duì)于整個(gè)開發(fā)過(guò)程,需要合理的進(jìn)度安排和很好的邏輯協(xié)調(diào)能力,這種解決問(wèn)題的能力鍛煉和思考問(wèn)題的模式都使我受益匪淺,相信從本次的畢業(yè)設(shè)計(jì)中體會(huì)到的會(huì)影響我今后的程序員生涯。</p><p><b> 致謝</b>
80、</p><p> 本次畢業(yè)設(shè)計(jì),首先要感謝我的指導(dǎo)老師xx老師,xx對(duì)本次畢業(yè)設(shè)計(jì)給與了很大的幫助,并為具體開發(fā)以及論文的書寫提出了許多寶貴意見(jiàn),她嚴(yán)謹(jǐn)仔細(xì)的治學(xué)態(tài)度深深的影響了我,在此對(duì)xx的幫助表示衷心的感謝!此外還要感謝在本次畢業(yè)設(shè)計(jì)中幫助過(guò)我的同學(xué)們,沒(méi)有老師及同學(xué)的幫助和指導(dǎo)是不可能順利完成本次的設(shè)計(jì)任務(wù)的。感謝信息工程學(xué)院的領(lǐng)導(dǎo)以及老師為我們創(chuàng)造的良好的學(xué)習(xí)環(huán)境。</p><p
81、><b> 參考文獻(xiàn)</b></p><p> [1] 徐寶文 鄭國(guó)良程序設(shè)計(jì)語(yǔ)言發(fā)展回顧與展望[N].計(jì)算機(jī)世界報(bào) 1995.13.</p><p> [2] 姚慧廣,趙岳松.Web編程中MVC模型的應(yīng)用[J].微機(jī)發(fā)展,2002,12(3):9~10.</p><p> [3] 汪松松 基于在線服務(wù)模式的程序編譯平臺(tái)的研究[J
82、].浙江 經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院 2011</p><p> [4] 張海藩.軟件工程導(dǎo)論[M](第5版).北京:清華大學(xué)出版社,2008:91~183.</p><p> [5] Johnson. J2EE Development Frameworks [J]. Computer Science, 2005, 1(39): 121-145.</p><p> [6
83、] 尼古拉斯.澤卡斯,李松峰,曹力.JavaScript高級(jí)程序設(shè)計(jì)(第二版)[M].人民郵電出版社, 2010:39-203</p><p> [7] Alessandro Marchetto,Filippo Ricca.Paolo Tonella.A case study-based comparison of web testing echniques applied to AJAX web a
84、pplications[J].International Journal on Software Tools for Technology Transfer,2008,35(6):477~492.</p><p> [8] 徐白雁.JAVA程序設(shè)計(jì)語(yǔ)言及其應(yīng)用[J].計(jì)算機(jī)與信息技術(shù),1996,4(4):32~34.</p><p> [9] 張素琴 編譯原理[M].北京 清華大學(xué)出版
85、社 2005:325-374</p><p> [10] Malcolm Davis. Struts--an open source MVC implementation[J]. IBM System Journal, 2006, 44(2): 33-37.</p><p> [11] 鄧凱元 基于Verilog的正則表達(dá)式編譯器的實(shí)現(xiàn)[J].北京信息科技大學(xué) 光電信息與通訊工程學(xué)院
86、2012</p><p> [12] Bi-Xin Li,Xiao-Cong Fan,Jun Pang,Jian-jun Zhao.A model for slicing JAVA programs hierarchically[J].Journal of Computer Science and Technology,2004,18(6):848~858.</p><p> [13]
87、 楊毅夫 面向深度包檢測(cè)的正則表達(dá)式匹配技術(shù)[J].北京 中國(guó)科學(xué)院計(jì)算機(jī)技術(shù)研究所 2009</p><p> [14] Ian Somerville. Software engineering[M].北京:機(jī)械工業(yè)出版社,2004:73~84.</p><p> [15] Vlad Nae,Jordan Herbert,Radu Prodan,Thomas Fahringer.An
88、 Information System for Real-Time Online Interactive Applications[J].Euro-Par 2008 Workshops-Parallel</p><p> [16] Greg Little,Robert C.Miller.Keyword programming in Java[J].Automated Software Engineering,2
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文-c語(yǔ)言在線編譯器
- c語(yǔ)言編譯器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)___c語(yǔ)言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 小型c語(yǔ)言編譯器設(shè)計(jì)
- 編譯原理課程的設(shè)計(jì)--c語(yǔ)言編譯器
- C語(yǔ)言安全編譯器研究.pdf
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- c語(yǔ)言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語(yǔ)言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語(yǔ)言編譯器的實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)(論文)c語(yǔ)言編譯器的設(shè)計(jì)開發(fā)-字節(jié)代碼格式設(shè)計(jì)與實(shí)現(xiàn)
- c-編譯器設(shè)計(jì)文檔
- 基于c語(yǔ)言的線性分組碼編譯器設(shè)計(jì)
- 畢業(yè)論文--c語(yǔ)言在線學(xué)習(xí)系統(tǒng)
- c語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- c語(yǔ)言自定義計(jì)算機(jī)語(yǔ)言編譯器最終版
- DSP-2400的C語(yǔ)言編譯器的設(shè)計(jì)及實(shí)現(xiàn).pdf
- 基于ASIP的專用C語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- c語(yǔ)言自定義計(jì)算機(jī)語(yǔ)言編譯器最終版.doc
評(píng)論
0/150
提交評(píng)論