版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> Online C Complier</p><p><b> 摘要</b></p><p> C語言在1970年由丹尼斯.里奇研制出來后發(fā)展至今,以它高效、靈活、功能豐富、表達(dá)力強(qiáng)和較高的移植性等特點(diǎn),廣泛用于系統(tǒng)與應(yīng)用軟件的開發(fā),2012年反超Java重登寶座,在程序員中說起Hello World,可能就想起C語言了,同時(shí)在計(jì)算機(jī)二級考試中
2、,也有C語言的科目,所以在學(xué)習(xí)C語言的人當(dāng)中不僅僅是程序員,還有很大一部分是對計(jì)算機(jī)知識,特別是編程語言了解相對較少的學(xué)生和社會(huì)人群。因此,需要一個(gè)相對簡易,易理解的C語言編譯和學(xué)習(xí)環(huán)境提供給這種人群。</p><p> 本論文研究的是C語言在線編譯器,包含了C語言的編譯器,加入了C語言的學(xué)習(xí)資料,示例代碼,供初學(xué)者使用。系統(tǒng)架構(gòu)是基于B/S的系統(tǒng),在前端使用了JS,JQUERY,AJAX,CSS,HTML作為
3、布局和業(yè)務(wù)邏輯,由于C語言在線編譯器的特殊性,前端技術(shù)也承擔(dān)了一部分的C語言編譯的技術(shù),大量使用了正則表達(dá)式,來操作C語言代碼字符。后臺使用JAVA語言開發(fā),使用LL1算法,詞法分析來完成C語言的語法分析,應(yīng)用struts機(jī)制和頁面交互,后臺主要用于代碼編譯、錯(cuò)誤提示,前端主要用于代碼執(zhí)行。論文主要介紹了本課題的開發(fā)背景、所完成的功能和以及具體的開發(fā)過程。</p><p> 關(guān)鍵詞:C語言;編譯器;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 頁面設(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)測試15</p><p> 6.1 測試方法15</p><p> 6.2 測
13、試用例15</p><p> 6.3 測試結(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語言是眾多編程語言中的姣姣者,每年都有很多高校學(xué)生以及一部分社會(huì)人群在學(xué)習(xí)C語言,但是傳統(tǒng)的雖然功能強(qiáng)大,但是相對復(fù)雜,并且C語言本身也相對較難[1],對于剛?cè)腴T的新手,會(huì)有一定的心里壓力,同時(shí)隨著互聯(lián)網(wǎng)的普及,許多互聯(lián)網(wǎng)應(yīng)用都給我們帶來了極大的便利,結(jié)合互聯(lián)網(wǎng)和傳統(tǒng)的C語言編譯器,就產(chǎn)生了有特
15、色的C語言在線編譯器,只要能上網(wǎng),不需要安裝任何的編譯環(huán)境和軟件就能夠?qū)慍語言程序,編譯C語言程序,執(zhí)行C語言程序,同時(shí)也提供了大量的C語言學(xué)習(xí)資料以及示例代碼,讓C語言初學(xué)者們能夠輕松簡單快樂的學(xué)習(xí)C語言。 </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ī)上,無法和別人共享,在使用他們之前,你必須安裝對應(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ì)算,云存儲的發(fā)展方向。</p><p> 1.3 C在線編譯器意義</p><p> C語言在線編譯器,不需要安裝任何的編譯環(huán)境和軟件就能夠?qū)慍語言程序,編譯C語言程序,執(zhí)行C語言程序。用戶能夠快速的開始編寫C語言程序[3],不需要承擔(dān)傳統(tǒng)編譯器所帶來的內(nèi)存消耗和硬盤存儲空間的消耗,同時(shí)C語言在線編譯器集學(xué)習(xí)和編寫代碼為一體,邊學(xué)習(xí)邊實(shí)踐是最好的學(xué)習(xí)方式
18、,同時(shí),用戶可以到任何一個(gè)可以上網(wǎng)的PC上編寫代碼,學(xué)習(xí)C語言,不需要費(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將頁面顯示和頁面邏輯處理和頁面數(shù)據(jù)剝離開來,結(jié)合Javascr
19、ipt,給予了頁面動(dòng)態(tài)效果[6],增強(qiáng)了用戶體驗(yàn)。后臺分為邏輯處理模塊和前端交互模塊,把業(yè)務(wù)邏輯和數(shù)據(jù)交互拆分開來,便于后期的維護(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語言是世界上使用的最多的語言,C語言如此受歡迎已經(jīng)能夠足夠說明C語言本身的優(yōu)點(diǎn)吸引著開發(fā)人員去使用它,也使廣大人群去學(xué)習(xí)它,同時(shí)在計(jì)算機(jī)二級考試中,也有C語言的科目。</p><p> 學(xué)習(xí)總是需要和實(shí)踐相結(jié)合,在學(xué)習(xí)C語言過程中需要大量的代碼編寫,這就需要一個(gè)對于新手來說簡單、方便的編譯器,來為學(xué)習(xí)C語言的人群減輕學(xué)習(xí)壓力,但是如今在PC
21、上運(yùn)行的C語言編譯器大多數(shù)比較復(fù)雜,C語言學(xué)習(xí)者還需要花心思去熟悉C語言編譯環(huán)境。</p><p> 在學(xué)習(xí)C語言的人當(dāng)中不僅僅是程序員,還有很大一部分是對計(jì)算機(jī)知識了解相對薄弱的學(xué)生和社會(huì)人群。同時(shí),這類人群的學(xué)習(xí)環(huán)境復(fù)雜,并不是每個(gè)人都擁有PC,他們可能去網(wǎng)吧,朋友家去練習(xí),而且各個(gè)操作系統(tǒng)也存在差異,這樣傳統(tǒng)編譯器就帶來了些麻煩,因?yàn)榈揭粋€(gè)新的環(huán)境去學(xué)習(xí),你就可能需要下載安裝軟件,而這個(gè)是一個(gè)相對耗費(fèi)時(shí)間
22、和精力的過程。因此,脫離系統(tǒng)環(huán)境的的C語言編譯環(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)用過,增加了我能夠?qū)懞眠@個(gè)
23、系統(tǒng)的信心。這些技術(shù)已經(jīng)相當(dāng)成熟,遇見的問題可以通過技術(shù)資料、搜索引擎解決。</p><p> 大學(xué)也培養(yǎng)了我的自學(xué)能力,對于陌生的知識能夠較快的接受和理解,并將他們投入實(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ì)可行性主要是從對項(xiàng)目的經(jīng)濟(jì)上進(jìn)行分析評價(jià)的,一方面是支出的費(fèi)用,包括編寫這個(gè)系統(tǒng)的成本,以及后期系統(tǒng)上線后需要服務(wù)器等硬件支持和網(wǎng)站維護(hù)的花費(fèi),另一個(gè)是取得的收益,在網(wǎng)站積累用戶后,可以和C語言培訓(xùn)機(jī)構(gòu)合作,加入培訓(xùn)機(jī)構(gòu)的廣告來獲取廣告費(fèi)用。</p><p> 2.2 系統(tǒng)的功能要求</p><p> C語言編譯器要實(shí)現(xiàn)
25、C語言語法檢驗(yàn)功能、C語言代碼轉(zhuǎn)換功能、運(yùn)行結(jié)果功能、C語言在線學(xué)習(xí)功能。其具體功能模塊如下: </p><p> C語言語法檢驗(yàn)?zāi)K:通過該模塊可以對用戶編寫的C語言進(jìn)行代碼掃描,檢驗(yàn)C語言程序語法錯(cuò)誤。</p><p> C語言代碼轉(zhuǎn)換模塊:通過該模塊可以實(shí)現(xiàn)將C語言代碼轉(zhuǎn)換為JS代碼。</p><p> 運(yùn)行結(jié)果模塊:通過該模塊可以實(shí)現(xiàn)將由C語言代碼轉(zhuǎn)換
26、過來的JS代碼運(yùn)行輸出結(jié)果。</p><p> C語言在線學(xué)習(xí)模塊:通過該模塊提供C語言學(xué)習(xí)資料以及示例代碼,供用戶學(xué)習(xí)[8]。</p><p> 2.3 系統(tǒng)的性能要求</p><p> 2.3.1可靠性要求</p><p> 系統(tǒng)沒有后臺數(shù)據(jù)庫,不需要考慮后臺數(shù)據(jù)的完整性以及數(shù)據(jù)安全,同時(shí)系統(tǒng)大量的功能實(shí)現(xiàn)是由Javascript
27、去完成的,以及使用了Ajax技術(shù),減少了頁面和后臺的訪問,減少了惡意的Doc攻擊,也使得系統(tǒng)可以接受龐大的用戶同時(shí)訪問。</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í)間多用戶的訪問要求,并且保證運(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è)請求。服務(wù)器接收并處理傳來的表單,然后送回一個(gè)新的網(wǎng)頁,但這個(gè)做法浪費(fèi)
29、了許多帶寬,因?yàn)樵谇昂髢蓚€(gè)頁面中的大部分HTML代碼基本上是相同的。由于每次應(yīng)用的溝通都需要向服務(wù)器發(fā)送請求,應(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的頁面服務(wù)接口(接口),并在客戶端采用JavaScript處理來自服務(wù)器的回應(yīng)。因?yàn)樵诜?wù)器和瀏覽器之間交換的數(shù)
30、據(jù)大量減少(大約只有原來的5%),結(jié)果我們就能看到回應(yīng)(服務(wù)器回應(yīng))更快的應(yīng)用(結(jié)果)。同時(shí)很多的處理工作可以在發(fā)出請求的客戶端機(jī)器上完成,所以Web服務(wù)器的處理時(shí)間也減少了。</p><p> 3.2 Servlet概述</p><p> Servlet是一種服務(wù)器端的Java應(yīng)用程序,具有獨(dú)立于平臺和協(xié)議的特性,可以生成動(dòng)態(tài)的Web頁面。 它擔(dān)當(dāng)客戶請求(Web瀏覽器或其他HTTP
31、客戶程序)與服務(wù)器響應(yīng)(HTTP服務(wù)器上的數(shù)據(jù)庫或應(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庫的設(shè)計(jì),簡化了客戶端腳本的HTML。簡單的說jQuery是使用最流行的JavaScript庫。jQuery是開源碼軟件, jQuery的語法專門設(shè)計(jì),以使它更容易來瀏覽一個(gè)文檔,選擇DOM元素,創(chuàng)建動(dòng)畫,處理事件,開發(fā)Ajax應(yīng)用程序。jQuery還提供了插件開發(fā)創(chuàng)造能力的JavaScript庫。這使開發(fā)人員能夠創(chuàng)建抽象為低層次的互動(dòng)和動(dòng)畫,先進(jìn)的特效和高層次,主題能夠部件。jQuery庫的模塊化方法允許創(chuàng)建強(qiáng)大的動(dòng)態(tài)
33、網(wǎng)頁和Web應(yīng)用程序。</p><p> 微軟和諾基亞宣布其平臺上捆綁jQuery的,微軟采用它最早在ASP.NET AJAX框架和ASP.NET MVC框架,而諾基亞已經(jīng)融入他們的Web運(yùn)行時(shí)構(gòu)件開發(fā)平臺。</p><p><b> 3.4 正則表達(dá)式</b></p><p> 正則表達(dá)式(Regular Expression、rege
34、x或regexp,縮寫為RE),也譯為正規(guī)表示法、常規(guī)表示法,在計(jì)算機(jī)科學(xué)中,是指一個(gè)用來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。在很多文本編輯或其他工具里,正則表達(dá)式通常被用來檢索和/或替換那些符合某個(gè)模式的文本內(nèi)容。許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎[12]。</p><p><b> 3.5 LL1算法<
35、;/b></p><p> LL(1)是預(yù)測分析器,</p><p> 第一個(gè)L代表掃描模式是自左向右的,第二個(gè)L代表分析模式是最左推導(dǎo)。至于括號中的1代表在分析中最多向前看一個(gè)輸入字符。LL(1)的組成包括總控程序,分析棧和分析表,其中分析表是LL(1)分析器的核心。First集合以及后面講到的Follow集合都與分析表有關(guān)。分析棧:存放分析過程中的文法符號(待匹配和已經(jīng)推導(dǎo)
36、的串)。分析表:判斷當(dāng)前用那條文法進(jìn)行推導(dǎo)總控程序:做大的調(diào)度工作</p><p> 關(guān)于LL(1)文法的性質(zhì)如下:⑴任何LL(1)文法是無二義性的。⑵若一文法中的非終結(jié)符含有左遞歸,則它必然是非LL(1)文法。⑶非LL(1)語言是存在的。⑷存在一種算法,它能判定任一文法是否為LL(1)文法。⑸存在一種算法,它能判定任意兩個(gè)LL(1)文法是否產(chǎn)生相同的語言。⑹不存在這樣的算法,它能判定上下文無關(guān)
37、語言能否由LL(1)文法產(chǎn)生。</p><p><b> 3.6 編譯器</b></p><p> 編譯程序構(gòu)造的一般原理和基本方法。內(nèi)容包括語言和文法、詞法分析、語法分析、語法制導(dǎo)翻譯、中間代碼生成、存儲管理、代碼優(yōu)化和目標(biāo)代碼生成。</p><p> 編譯器是將一種語言翻譯為另一種語言的計(jì)算機(jī)程序。編譯器將源程序(source lan
38、guage) 編寫的程序作為輸入,而產(chǎn)生用目標(biāo)語言(target language )編寫的等價(jià)程序。</p><p> 編譯器編譯程序的流程:</p><p> 掃描程序(scanner)</p><p> 在這個(gè)階段編譯器閱讀源程序(通常以析程序字符流的形式表示)。</p><p> 語法分析程序(parser )</p&g
39、t;<p> 語法分析程序從掃描程序中獲取記號形式的源代碼,并完成定義程序結(jié)構(gòu)的語法分析 (syntax analysis ),這與自然語言中句子的語法分析類似。語法分析定義了程序的結(jié)構(gòu)元素及其關(guān)系。通常將語法分析的結(jié)果表示為分析樹(parse tree)或語法樹(syntax tree)[13]。</p><p> 語義分析程序(semantic analyzer )</p>&
40、lt;p> 程序的語義就是它的“意思”,它與語法或結(jié)構(gòu)不同。程序的語義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語言都具有在執(zhí)行之前被確定而不易由語法表示和由分析程序分析的特征。</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)從縱向上分為兩層,即前端和后臺,前端處理數(shù)據(jù)顯示,以及部分的業(yè)務(wù)邏輯,包括代碼的初步審查、代碼生成、代碼執(zhí)行,后臺主要負(fù)責(zé)代碼分析的業(yè)務(wù)邏輯,前端和后臺通過Ajax結(jié)合Severlet來進(jìn)行數(shù)據(jù)通訊。系統(tǒng)的框架如圖4.1所示。</p><p&
42、gt;<b> 4.2代碼編輯模塊</b></p><p> 代碼編輯模塊主要用于得到用戶輸入的代碼,并對用戶輸入關(guān)鍵字提示,其工作流程如圖3.2所示。</p><p> 4.3代碼分析器模塊</p><p> 代碼分析模塊主要處理從前臺傳遞過來的代碼,對代碼進(jìn)行詞法分析和語法分析,判斷用戶的代碼的正確性,如果用戶輸入的代碼有誤,能夠識
43、別出錯(cuò)誤的位置,并將錯(cuò)誤信息返回給前臺,其工作流程如圖3.3所示</p><p> 4.4代碼生成器模塊和代碼執(zhí)行模塊</p><p> 代碼生成模塊主要處理編譯通過的代碼,利用正則表達(dá)式將原來的C語言代碼轉(zhuǎn)換成Javascript代碼并將生成的javascript代碼推送到頁面,讓瀏覽器去執(zhí)行,將結(jié)果顯示在頁面上,其工作流程如圖3.4所示</p><p>
44、第五章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 5.1代碼編輯模塊</b></p><p> 代碼編輯模塊主要用于得到用戶輸入的代碼,并對用戶輸入關(guān)鍵字提示。</p><p> 5.1.1 頁面設(shè)計(jì)</p><p> 1.使用Div實(shí)現(xiàn)TextArea</p><p> 在代碼編輯模塊
45、中,是使用了Div元素來模擬TextArea,因?yàn)門extArea中的內(nèi)容只允許是文字,同時(shí),對文字的字體和顏色的設(shè)置會(huì)應(yīng)用到整個(gè)TextArea中的文字內(nèi)容,不能對局部調(diào)整,但是我的需求是希望能對代碼中的關(guān)鍵字進(jìn)行高亮顯示,并改變顏色,所以TextArea不能夠滿足我的需求。在Div中我可以任意插入Html元素,同時(shí)也可以是用CSS樣式調(diào)整,使得Div的外觀和TextArea差不多,甚至比TextArea更加美觀[14],多以就選擇了
46、Div。</p><p> 2.頁面大小有限,而且頁面中還有其他很多元素,例如標(biāo)題,結(jié)果顯示模塊等,如何,然而用戶編寫的代碼量是不確定的,如何能夠滿足用戶能夠編寫任意量的代碼?</p><p> 在頁面中使用分頁,用戶在本頁編輯滿了后,可以點(diǎn)擊下一頁繼續(xù)編輯,同時(shí)系統(tǒng)保證頁面不跳轉(zhuǎn),代碼不丟失,用戶可以編寫任意長度的代碼,上下翻頁非常方便,在編輯也下方顯示當(dāng)前頁頁碼,可以讓用戶隨時(shí)了解
47、當(dāng)前所在的位置。</p><p><b> 5.2 類設(shè)計(jì)</b></p><p> 對用戶輸入的代碼進(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è)置成原來的樣式</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> 代碼分析器主要由詞法分析器和語法分析器構(gòu)成,其類圖結(jié)構(gòu)如圖5.1所示。</p><p> 代碼預(yù)處理:由功能類CodeAnalyser構(gòu)成,CodeAnalyser類圖如圖5.2所示。</p><p> 該類索引傳入的C語言代碼,并將找到的字符進(jìn)行分類處理</p><p> letterProcessor()用
55、于處理字符為字母的情況</p><p> digitProcessor()用于處理字符為數(shù)字的情況</p><p> otherProcessor()用于處理字符為特殊字符的情況</p><p> analyse調(diào)用上述的方法,分析取得的字符,重構(gòu)C語言代碼。</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提取定義好的字符,來進(jìn)行比較判斷,并進(jìn)行處理。</p><p> 語法分析器:由功能了LL1Module構(gòu)成,LL1Module類圖如圖5.4所示</p><p> 圖5.4 LL1Module類圖</p><p> LL1()中使用LL1算法進(jìn)行語法分析,自定義棧來存儲文法,并對輸入字符串進(jìn)行匹配掃描,
58、來判斷合法性。</p><p> 四元式:由功能類FourYuanStyle構(gòu)成,用于分析四元式,處理C語言的語法,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> 代碼生成模塊主要處理編譯通過的代碼,利用正則表達(dá)式將原來的C語言代碼轉(zhuǎn)換成Javascript代碼并將生成
60、的javascript代碼推送到頁面[16],讓瀏覽器去執(zhí)行,將結(jié)果顯示在頁面上。如圖5.6.</p><p> 圖5.6 代碼生成流程圖</p><p> 代碼轉(zhuǎn)換器:使用CtoJava.js來完成這個(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寫到頁面的輸出語句</p><p> function getPrintfString(printf_position) { return null;}</p><p><b>
64、 對輸出語句進(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、測試</b></p><p><b> 6.1 測試方法</b></p><p> 在編寫代碼分析模塊時(shí),進(jìn)行了大量的單元測試,檢驗(yàn)代碼分析的可靠性,以及是否能夠提示正確的錯(cuò)誤信息,后期和前端頁面結(jié)合是進(jìn)行了集成測試,保證數(shù)據(jù)在前端和后臺之間傳遞的完整性[17],把單元測試穿插在編碼過程中進(jìn)行并及時(shí)改正了所發(fā)現(xiàn)的錯(cuò)誤[18],在系統(tǒng)完成進(jìn)行驗(yàn)收測試時(shí),
66、選擇可具有代表性的C語言代碼對系統(tǒng)功能進(jìn)行測試,驗(yàn)證C語言在線編譯器是否達(dá)到開發(fā)目標(biāo)。</p><p><b> 6.2 測試用例</b></p><p> 根據(jù)用例測試的目的是在系統(tǒng)測試過程中,驗(yàn)證系統(tǒng)各個(gè)功能是否可以完成預(yù)期目標(biāo),以及在測試中出現(xiàn)錯(cuò)誤時(shí)如何改正以達(dá)到其擬定功能。</p><p> 對代碼編譯模塊的測試:</p&g
67、t;<p> 以下對給出系統(tǒng)的功能的測試用例。</p><p><b> 輸入錯(cuò)誤C語言代碼</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、 頁面執(zhí)行結(jié)果:編譯失敗,在第9行出現(xiàn)錯(cuò)誤</p><p><b> 輸入正確C語言代碼</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> 頁面執(zhí)行
75、結(jié)果:編譯通過,結(jié)果:a的值為:10</p><p> 對C語言學(xué)習(xí)模塊的測試:</p><p> 點(diǎn)擊C語言學(xué)習(xí)的各個(gè)章節(jié),能夠成功跳轉(zhuǎn)到相應(yīng)的學(xué)習(xí)內(nèi)容。</p><p> 點(diǎn)擊C語言示例代碼,能夠顯示各個(gè)示例代碼</p><p><b> 6.3 測試結(jié)果</b></p><p>
76、通過C語言在線編譯器各種功能的測試,該系統(tǒng)基本達(dá)到了開發(fā)之初所擬定的目標(biāo),實(shí)現(xiàn)了C語言在線編譯器的預(yù)期功能。</p><p><b> 總結(jié)</b></p><p> 在大學(xué)的四年中,有很多自己想去實(shí)踐的東西,但是在技術(shù)上遇見很多問題,所以總是不能夠?qū)崿F(xiàn)自己的想法,隨著各種相關(guān)的課程的開放,自己的自學(xué)能力的提高,漸漸的相信自己的實(shí)力,只要肯去鉆研,就能夠解決所有的
77、問題。本次畢業(yè)設(shè)計(jì)是對大學(xué)四年學(xué)過的“c++程序設(shè)計(jì)語言“、“Java程序設(shè)計(jì)語言”、“Web編程技術(shù)”、“數(shù)據(jù)庫原理”、“軟件工程”、“軟件測試”等課程的一個(gè)具體實(shí)踐,是一個(gè)理論結(jié)合實(shí)踐的過程,也是對自己自學(xué)能力的一個(gè)肯定。作為一項(xiàng)畢業(yè)設(shè)計(jì)的任務(wù),C語言在線編譯器的設(shè)計(jì)與實(shí)現(xiàn)目標(biāo)是實(shí)現(xiàn)一個(gè)在瀏覽器上運(yùn)行的C語言編譯器。在設(shè)計(jì)與開發(fā)的過程中,我充分利用所學(xué)知識,遇見不懂的技術(shù)就去學(xué)習(xí),遇見問題就百度、谷歌解決,將理論聯(lián)系實(shí)踐,使自己對所
78、學(xué)的知識有一個(gè)更深刻的理解,并為以后的實(shí)際工作積累了實(shí)踐經(jīng)驗(yàn)。由于時(shí)間倉促和技術(shù)所限,該系統(tǒng)存在一些不足之處,有待進(jìn)一步改進(jìn)和完善。</p><p> 本次的畢業(yè)設(shè)計(jì),也是對自己大學(xué)四年的學(xué)習(xí)的一個(gè)總結(jié)和檢驗(yàn)。設(shè)計(jì)之初,進(jìn)行需求分析,搜集了大量的素材,來判斷C語言在線編譯器的可行性。在前期工作完成之后,各種C語言本地編譯環(huán)境進(jìn)行了研究,使得之后的C語言在線編譯器能夠盡量滿足C語言入門學(xué)者的需求。設(shè)計(jì)階段,寫代碼
79、,調(diào)程序,反反復(fù)復(fù)出現(xiàn)問題。在這期間我學(xué)會(huì)了很多,也得到了許多寶貴的經(jīng)驗(yàn)。我切實(shí)體會(huì)到了在軟件系統(tǒng)開發(fā)過程中,最重要也最困難的工作就是需求分析,需求分析是系統(tǒng)開發(fā)能否取得成功的關(guān)鍵。而對于整個(gè)開發(fā)過程,需要合理的進(jìn)度安排和很好的邏輯協(xié)調(diào)能力,這種解決問題的能力鍛煉和思考問題的模式都使我受益匪淺,相信從本次的畢業(yè)設(shè)計(jì)中體會(huì)到的會(huì)影響我今后的程序員生涯。</p><p><b> 致謝</b>
80、</p><p> 本次畢業(yè)設(shè)計(jì),首先要感謝我的指導(dǎo)老師xx老師,xx對本次畢業(yè)設(shè)計(jì)給與了很大的幫助,并為具體開發(fā)以及論文的書寫提出了許多寶貴意見,她嚴(yán)謹(jǐn)仔細(xì)的治學(xué)態(tài)度深深的影響了我,在此對xx的幫助表示衷心的感謝!此外還要感謝在本次畢業(yè)設(shè)計(jì)中幫助過我的同學(xué)們,沒有老師及同學(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] 徐寶文 鄭國良程序設(shè)計(jì)語言發(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ù)模式的程序編譯平臺的研究[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高級程序設(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ī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、 楊毅夫 面向深度包檢測的正則表達(dá)式匹配技術(shù)[J].北京 中國科學(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文-c語言在線編譯器
- c語言編譯器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)___c語言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 小型c語言編譯器設(shè)計(jì)
- 編譯原理課程的設(shè)計(jì)--c語言編譯器
- C語言安全編譯器研究.pdf
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- c語言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語言編譯器的實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)(論文)c語言編譯器的設(shè)計(jì)開發(fā)-字節(jié)代碼格式設(shè)計(jì)與實(shí)現(xiàn)
- c-編譯器設(shè)計(jì)文檔
- 基于c語言的線性分組碼編譯器設(shè)計(jì)
- 畢業(yè)論文--c語言在線學(xué)習(xí)系統(tǒng)
- c語言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- c語言自定義計(jì)算機(jī)語言編譯器最終版
- DSP-2400的C語言編譯器的設(shè)計(jì)及實(shí)現(xiàn).pdf
- 基于ASIP的專用C語言編譯器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- c語言自定義計(jì)算機(jī)語言編譯器最終版.doc
評論
0/150
提交評論