欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      編譯實(shí)習(xí)報告(范文)

      時間:2019-05-14 17:00:18下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《編譯實(shí)習(xí)報告(范文)》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《編譯實(shí)習(xí)報告(范文)》。

      第一篇:編譯實(shí)習(xí)報告(范文)

      篇一:編譯原理實(shí)習(xí)報告

      實(shí)習(xí)報告

      【實(shí)習(xí)目的】

      1.了解編譯器的工作原理

      2.掌握并加深本學(xué)期所學(xué)的編譯原理的理論知識 3.加強(qiáng)自己的動手能力 【實(shí)習(xí)內(nèi)容】

      1.編譯并運(yùn)行老師所給的編譯器參考代碼

      2.在第一步的基礎(chǔ)上進(jìn)一步改進(jìn)編譯器,增加輸入輸出功能 【開發(fā)平臺】

      window系統(tǒng),free pascal編譯器 【實(shí)習(xí)過程】

      本次實(shí)習(xí)過程根據(jù)實(shí)習(xí)內(nèi)容共分兩大部分,第一部分,編譯運(yùn)行參考代碼;第二部分,進(jìn)一步改進(jìn)編譯器。本人在上面的基礎(chǔ)上又增加了第三部分的額外修改。下面便總結(jié)這三部 分的實(shí)習(xí)過程:

      一、增加讀寫語句前pl0編譯程序

      由于最原始的pl0編譯程序所用的pascal版本較老,有些和當(dāng)前使用版本不兼容,必須作相應(yīng)修改,具體是:“object”和“procedure”為pascal的保留字,現(xiàn)分別改成“obj” 和“proc”。此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii碼表示出來,現(xiàn)將其 替換成“<>”、“<=”和“>=”。

      作為一個編譯程序,支持批量處理和永久保存是其應(yīng)具備的基本功能。為此,本程序加 入了文件讀寫功能,即從文件讀入pl0源程序,在將中間代碼和運(yùn)行結(jié)果寫入文件。由于源程序和原始差別很小,為節(jié)省篇幅,不將其打印出來。

      二、增加讀寫語句前pl0調(diào)試程序

      下面是增加讀寫語句前的pl0程序,包含了乘、除法和尋找兩個自然數(shù)的最大公因數(shù) 的過程和主過程,很好的說明了增加讀寫語句前的pl0語言的使用方法。const var x,y,z,q,r;procedure multiply;var a,b;a:=x;begin m=7,n=85;procedure divide;var end;b:=y;z:=0;while b>0 do begin end if odd b then z:=z+a;a:=2*a;b:=b/2;w;begin r:=x;q:=0;w:=y;while w<=r do w:=2*w;while w>y do begin q:=2*q;w:=w/2;if w<=r then begin r:=r-w;q:=q+1 end end end;procedure gcd;var f,g;begin f:=x;g:=y;while f<>g do begin if f

      下面所給清單是用

      (一)中增加讀寫語句前pl0編譯程序?qū)?/p>

      (二)中的pl0程序編譯 生成的中間代碼。其中,第一部分是pl0程序和對應(yīng)的中間代碼,第二部分(“start pl/0” 到“end pl/0”之間編譯程序?qū)ι芍虚g代碼的模擬解釋執(zhí)行結(jié)果,打印出來的是sto(存 數(shù))指令產(chǎn)生的。

      0 const 1 m=7,n=85;1 var1 x,y,z,q,r;1 procedure multiply;1 var2a,b;2 begin 3a:=x;5b:=y;7z:=0;9while b>0 do 13begin 13 if odd b then z:=z+a;20 a:=2*a;24 b:=b/2;28end 28 end;2 int 0 5 3 lod 1 3 4 sto 0 3 5 lod 1 4 6 sto 0 4 7 lit 0 0 8 sto 1 5 9 lod 0 410 lit 0 0 11 opr 012 12 jpc 029 13 lod 0 4 14 opr 0 6 15 jpc 020 16 lod 1 5 17 lod 0 3 18 opr 0 2 19 sto 1 5 20 lit 0 2 21 lod 0 3 22 opr 0 4 23 sto 0 3 24 lod 0 4 25 lit 0 2 26 opr 0 5 27 sto 0 4 28 jmp 0 9 29 opr 0 0 30 30 procedure divide;30 var 31w;31 begin 32r:=x;34q:=0;36w:=y;38while w<=r do w:=2*w;47while w>y do 51begin q:=2*q;w:=w/2;59 if w<=r then 62 begin 63 r:=r-w;67 q:=q+1 69 end 71end 71 end;31 int 0 4 32 lod 1 3 33 sto 1 7 34 lit 0 0 35 sto 1 6 36 lod 1 4篇二:實(shí)習(xí)報告 目 錄 1、前言

      1.1實(shí)習(xí)單位簡介 1 2、實(shí)習(xí)目的 2.1實(shí)習(xí)內(nèi)容簡要提綱??2 3、操作具體過程 3.1學(xué)習(xí)安裝altium designer 9運(yùn)行環(huán)境? ??3 3.2學(xué)習(xí)運(yùn)用altium designer 9,設(shè)計并繪制avr單片機(jī)系統(tǒng)的pcb電路板 ???4 3.3實(shí)現(xiàn)pcb電路板的生成及手工布線 ???5 3.4熟悉tq2440開發(fā)板的硬件和基本用法 ??7 3.5編譯mp3播放器及移植?8 4、實(shí)習(xí)總結(jié) 4.1實(shí)習(xí)收獲?? 16 4.2個人小結(jié)?? 16

      一、前言

      本次昆山實(shí)習(xí)作為我們電子信息工程專業(yè)的畢業(yè)設(shè)計意義很大。這次實(shí)習(xí)的主要內(nèi)容是在linux操作系統(tǒng)環(huán)境下實(shí)現(xiàn)mp3播放器的嵌入式設(shè)計。圍繞此項(xiàng)內(nèi)容我們實(shí)習(xí)開展設(shè)計環(huán)境的搭建,再到嵌入式系統(tǒng)的熟悉、移植和mp3播放器的實(shí)現(xiàn),進(jìn)行了一系列學(xué)習(xí)和實(shí)踐。我們的團(tuán)隊(duì)達(dá)到了預(yù)期的目的,并較好的完成了這次實(shí)習(xí)的任務(wù)。這次實(shí)習(xí)于我于我們的團(tuán)隊(duì)都是受益匪淺的。1.1實(shí)習(xí)單位簡介

      杰普軟件科技有限公司(briup technology,inc.)是一家專注于高端it培訓(xùn)、軟件外包、研發(fā)咨詢的高新技術(shù)企業(yè)。公司在電信、金融、電子商務(wù)等方面有著豐富的專業(yè)開發(fā)、管理和培訓(xùn)經(jīng)驗(yàn)。公司核心成員由海外留學(xué)人員和來自sybase、亞信、sun等國際大公司的資深技術(shù)人員組成。在電信、金融、電子商務(wù)等方面有著豐富的專業(yè)開發(fā)、管理和培訓(xùn)經(jīng)驗(yàn)。是上海市人事局許可的高級人才培訓(xùn)中心。同時也是上海是緊缺人才辦公室培訓(xùn)基地。

      杰普軟件著重解決軟件企業(yè)用人難的問題,在高校畢業(yè)生及企業(yè)之間搭建一個供需橋梁。公司依托擁有豐富開發(fā)及培訓(xùn)經(jīng)驗(yàn)的師資團(tuán)隊(duì),培養(yǎng)企業(yè)緊缺的中高端開發(fā)人才。推出的解決大學(xué)生就業(yè)問題的dsp方案,已成功向各大軟件企業(yè)輸送了數(shù)千名人才,也確保了杰普軟件外包業(yè)務(wù)的高效性和擴(kuò)展性。公司與高校深度合作,為解決大學(xué)生的就業(yè)問題,提出多種合作方案。

      杰普公司的培訓(xùn)師均來自各大it公司一線研發(fā)團(tuán)隊(duì),平均具有7年的項(xiàng)目研發(fā)經(jīng)驗(yàn),是中國內(nèi)地最優(yōu)秀的培訓(xùn)講師。他們不僅承擔(dān)著杰普公司的學(xué)員培養(yǎng)工作,同時帶領(lǐng)杰普公司的工程師及學(xué)員團(tuán)隊(duì)實(shí)施由政府及相關(guān)事業(yè)單位資助和委托的、杰普公司所承擔(dān)的新產(chǎn)品研發(fā)和項(xiàng)目開發(fā)工作。他們隨時把杰普公司最新的研發(fā)成果轉(zhuǎn)化到對學(xué)員的培養(yǎng)中,確保了杰普每一位學(xué)員的技術(shù)研發(fā)能力以及優(yōu)秀學(xué)員的創(chuàng)新能力、團(tuán)隊(duì)管理能力,保證了杰普學(xué)員在人才市場上競爭力及未來職業(yè)發(fā)展的廣闊空間。

      昆山校區(qū)位于有著“鑲嵌在蘇州與上海之間的一顆明珠之稱”歷史文化名城昆山市巴城鎮(zhèn),風(fēng)景優(yōu)美,環(huán)境典雅,教室與宿舍設(shè)置更是位于陽澄湖畔,憑窗而望,斜陽染湖,登高展臂,山水懷中,春夏有巴城魚美,秋冬有陽澄蟹肥,是學(xué)習(xí)生活的好地方。昆山浦東軟件園是國家級軟件產(chǎn)業(yè)基地出口基地,上海浦東軟件園和昆山市政府合作共建的項(xiàng)目,園區(qū)位于昆山巴城陽澄湖畔,擁有70萬平方米工作生活環(huán)境,是一個與自然生態(tài)協(xié)調(diào),符合高科技研發(fā)產(chǎn)業(yè)從業(yè)人員工作生活習(xí)慣的生態(tài)產(chǎn)業(yè)園區(qū),2011年,杰普軟件受昆山浦東軟件園的邀請,入駐園區(qū),作為軟件園產(chǎn)業(yè)鏈重要的人才供應(yīng)點(diǎn)。

      二、實(shí)習(xí)目的本次赴昆山實(shí)習(xí),主要是通過杰普集團(tuán)給我們提供的實(shí)習(xí)和實(shí)訓(xùn),學(xué)習(xí)嵌入式系統(tǒng)熟悉嵌入式系統(tǒng)的一些基本的理論概念和實(shí)踐操作。一方面,通過學(xué)習(xí)專業(yè)知識,增強(qiáng)實(shí)踐觀念和能力;另一方面,通過杰普的實(shí)訓(xùn)進(jìn)一步的對項(xiàng)目進(jìn)行一次深度的了解,為未來就業(yè)提供必要的經(jīng)驗(yàn)。

      本次實(shí)習(xí)目標(biāo)是對嵌入式系統(tǒng)有一定的了解,這次實(shí)習(xí)的主要內(nèi)容是在linux操作系統(tǒng)環(huán)境下實(shí)現(xiàn)mp3播放器的嵌入式設(shè)計。從熟悉linux到shell命令,再到嵌入式系統(tǒng)的搭建、移植和mp3播放器的實(shí)現(xiàn),進(jìn)行了一系列學(xué)習(xí)和實(shí)踐。杰普為我們提供了以下進(jìn)程: 2.1實(shí)習(xí)內(nèi)容簡要提綱:

      ①學(xué)習(xí)安裝altium designer 9運(yùn)行環(huán)境。

      ②學(xué)習(xí)運(yùn)用altium designer 9,設(shè)計并繪制avr單片機(jī)系統(tǒng)的pcb電路板。

      ③實(shí)現(xiàn)pcb電路板的生成及手工布線。

      ④熟悉tq2440開發(fā)板的硬件和基本用法。

      ⑤編譯mp3播放器及移植。

      三、操作具體過程

      3.1學(xué)習(xí)安裝altium designer 9運(yùn)行環(huán)境

      安裝步驟如下:軟件激活:在原文件altium.designer.v6.9.0.12759下找到文件夾ad_6.9_cr,將altium.alf和dxp.exe可執(zhí)行文件拷貝到安裝文件下,替換即可,然后重新打開就可以自動生成)若要想每次使用的話可以使用快捷方式,發(fā)送到桌面上即可。3.2學(xué)習(xí)運(yùn)用altium designer 9,設(shè)計并繪制avr單片機(jī)系統(tǒng)的pcb電路板

      電路板的設(shè)計是指一個電子產(chǎn)品從功能分析、設(shè)計思路、可行性驗(yàn)證到電路原理圖設(shè)計、印制電路板制作、調(diào)試測試一直到最后產(chǎn)品成形的全過程。整個電路板設(shè)計過程可以分為以下幾個主要步驟,如下所示:

      atmega16 單片機(jī)最小系統(tǒng)的硬件電路圖如下: 篇三:編譯實(shí)習(xí)-語法分析 編號:

      《編譯原理》課程 實(shí)習(xí)報告

      編 號: 3 實(shí)習(xí)題目: 語法分析器 專業(yè)(班): 計科六班

      學(xué)生學(xué)號: 2011301500204 學(xué)生姓名:何子龍 任課教師:

      1.問題定義與分析 1.1 實(shí)習(xí)目的

      構(gòu)造一個小語言的語法分析程序。1.2 實(shí)習(xí)要求((1)輸入屬性字文件,輸出源程序是否符合語法要求的結(jié)果: 正確——該程序符合語法要求。錯誤——指出錯誤位置。(2)運(yùn)行實(shí)例: 例 1: 輸入 i:=1+;輸出表達(dá)式錯誤。

      例2: 輸入 program ex1;begin i:=1 end.輸出該程序是正確的。1.3 要求分析 1.3.1 輸入部分

      輸入為文法源程序,定義cstring 類型變量 m_enterstring,用于獲取

      編輯框1的輸入,將其轉(zhuǎn)換為char類型的數(shù)組,用s 保存,即char *s=m_enterstring.getbuffer()。1.3.2 輸出部分

      對于錯誤的程序,輸出相應(yīng)錯誤類型;對于正確的程序,輸出該程序是正確的。定義cstring 類型變量m_outputstring,用于輸出詞法分析結(jié)果到編輯框2,用如下函數(shù)給m_outputstring 添加輸出內(nèi)容,如程序正確時代碼:m_outputstring.insert(m_outputstring.getlength(),該程序是正確的);如圖所示:

      1.3.3 待分析的簡單語言的語法 用擴(kuò)充的bnf表示如下: ⑴<程序>::=program begin<語句串>end|begin<語句串>end ⑵<語句串>::=<語句>{;<語句>} ⑶<語句>::=<賦值語句> ⑷<賦值語句>::=id:=<表達(dá)式> ⑸<表達(dá)式>::=<項(xiàng)>{+<項(xiàng)> |-<項(xiàng)>} ⑹<項(xiàng)>::=<因子>{*<因子> | /<因子> ⑺<因子>::=id | num |(<表達(dá)式>)1.3.4 語法中的各種單詞符號對應(yīng)的類別碼其中對應(yīng)于在詞法分析程序中,變化的是將關(guān)鍵字do改為program,和begin兩者至少出現(xiàn)一個作為程序的開始標(biāo)志。2.設(shè)計 2.1 數(shù)據(jù)結(jié)構(gòu)

      定義了以下字符串類型數(shù)據(jù):

      cstringm_enterstring :用于接受編輯框1輸入的源程序 cstringm_outputstring;:用于保存輸出到編輯框2的內(nèi)容,即輸出源程序是正確的還是錯誤的,對于錯誤的程序還需要說明錯誤類型 char *s=m_enterstring.getbuffer():用于將輸入的cstring類型轉(zhuǎn)換為字符數(shù)組類型界面數(shù)據(jù)結(jié)構(gòu):(僅在詞法分析程序的基礎(chǔ)上改變了以下組件的位置與大?。?/p>

      idc_static1(group-box control)放輸入框的框 idc_static2(group-box control)放輸出框的框 idc_edit1(edit control)輸入編輯框 idc_edit2(edit control)輸出編輯框 idok(button control)確定按鈕 idcancel(button control)取消按鈕 idd_cifa_dialog(dialog)整個界面框 界面如下圖所示:

      2.2.算法及程序流程圖 2.2.1算法設(shè)計:

      算法的基本任務(wù)是在已完成的詞法分析程序的基礎(chǔ)上,對源程序的語法的正確性進(jìn)行判斷,編制一個遞歸下降分析程序,實(shí)現(xiàn)對詞法分析程序所提供的單詞序列的語法檢查和結(jié)構(gòu)分析,對于輸入的程序無語法錯誤的源程序,則輸出該程序是正確的,若輸入的源程序有語法錯誤,則輸出相應(yīng)的錯誤類型,具體見流程圖。2.2.1程序流程圖如下:

      a.主程序示意圖如下圖所示:

      第二篇:編譯原理課程設(shè)計報告

      武 漢 紡 織 大 學(xué)

      編譯原理課程設(shè)計實(shí)驗(yàn)報告

      學(xué)院:數(shù)學(xué)與計算機(jī) 專業(yè):計算機(jī) 姓名: 班級: 學(xué)號: 編譯原理

      編譯原理課設(shè)報告

      一、實(shí)驗(yàn)?zāi)康?/p>

      加強(qiáng)對編譯程序的整體認(rèn)識和了解,鞏固《編譯原理》課程所學(xué)知識。通過本次課程設(shè)計掌握編譯程序調(diào)試技巧和設(shè)計編譯程序一般的原則,加深對詞法分析、語法分析、語義分析等編譯階段及實(shí)用編譯系統(tǒng)的認(rèn)識。使學(xué)生能將編譯理論與實(shí)際應(yīng)用結(jié)合起來,提高學(xué)生軟件開發(fā)的能力。

      二、實(shí)驗(yàn)內(nèi)容

      1)仔細(xì)閱讀PL/0編譯程序文本(編譯原理(第二版)張素琴 呂映芝 蔣維杜 戴桂蘭 主編

      清華大學(xué)出版社),并上機(jī)調(diào)試通過。

      2)對PL/0語言進(jìn)行下列擴(kuò)充(1)擴(kuò)充一維整型數(shù)組。

      擴(kuò)充var數(shù)組:VAR <數(shù)組標(biāo)識名>(<下界>:<上界>)〈下界〉和〈上界〉可用常量標(biāo)識名。

      (2)擴(kuò)充條件語句的功能使其為:IF<條件>THEN<語句>[ELSE<語句>](3)增加repeat重復(fù)語句: REPEAT<語句>{;<語句>}UNTIL<條件> 可根據(jù)自己具體情況從中選擇2個以上題目進(jìn)行擴(kuò)充。

      三、實(shí)驗(yàn)原理

      PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個編譯解釋執(zhí)行系統(tǒng)。PL/0的目標(biāo)程序?yàn)榧傧霔J接嬎銠C(jī)的匯編語言,與具體計算機(jī)無關(guān)。

      PL/0的編譯程序和目標(biāo)程序的解釋執(zhí)行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機(jī)器上實(shí)現(xiàn)。其編譯過程采用一趟掃描方式,以語法分析程序?yàn)楹诵?,詞法分析和代碼生成程序都作為一個獨(dú)立的過程,當(dāng)語法分析需要讀單詞時就調(diào)用詞法分析程序,而當(dāng)語法分析正確需要生成相應(yīng)的目標(biāo)代碼時,則調(diào)用代碼生成程序。

      用表格管理程序建立變量、常量和過程表示符的說明與引用之間的信息聯(lián)系。

      當(dāng)源程序編譯正確時,PL/0編譯程序自動調(diào)用解釋執(zhí)行程序,對目標(biāo)代碼進(jìn)行解釋執(zhí)行,并按用戶程序的要求輸入數(shù)據(jù)和輸出運(yùn)行結(jié)果。

      四、實(shí)驗(yàn)分析

      PL/0語言編譯程序采用以語法分析為核心、一遍掃描的編譯方法。詞法分析和代碼生成作為獨(dú)立的子程序供語法分析程序調(diào)用。語法分析的同時,提供了出錯報告和出錯恢復(fù)的功能。在源程序沒有錯誤編譯通過的情況下,調(diào)用類PCODE解釋程序解釋執(zhí)行生成的類PCODE代碼。

      詞法分析子程序分析:

      詞法分析子程序名為GETSYM,功能是從源程序中讀出一個單詞符號(TOTAKEN),把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語法分析器需要單詞時,直接從這三個變量中獲得。Getch過程通過反復(fù)調(diào)用Getch子過程從源程序過獲取字符,并把它們拼成單詞。GETCH過程中使用了行緩沖區(qū)技術(shù)以提高程序運(yùn)行效率。

      詞法分析器的分析過程:調(diào)用GETSYM時,它通過GETCH過程從源程序中獲得一個字符。如果這個字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個單詞應(yīng)是一個用戶自定義的標(biāo)識符(可能是變量名、常量名或是過程的名字),把SYM置為IDENT,把這個單詞存入ID變量。查保留字表時使用了二分法查找以提高效率。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個整數(shù)或?qū)崝?shù),然后把SYM置為 INTEGER或REAL,并把拼成的數(shù)值放入NUM變量。如果識別出其它合法的符號(比如:賦值號、大于號、小于等于號等),則把SYM則成相應(yīng)的類型。如果遇到不合法的字符,把SYM置成NUL。

      語法分析子程序分析:

      語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時也根據(jù)程序的語義生成相應(yīng)三元代碼,并提供了出錯處理的機(jī)制。語法分析主要由分程序分析過程(BLOCK)、參數(shù)變量分析過程(ParaDeclaration)、參數(shù)變量處理過程(ParaGetSub)、數(shù)組處理過程(ParaGetSub)、常量定義分析過程(ConstDeclaration)、變量定義分析過程(Vardeclaration)、語句分析過程(Statement)、表達(dá)式處理過程(Expression)、項(xiàng)處理過程(Term)、因子處理過程(Factor)和條件處理過程(Condition)構(gòu)成。這些過程在結(jié)構(gòu)上構(gòu)成一個嵌套的層次結(jié)構(gòu)。除此之外,還有出錯報告過程(Error)、代碼生成過程(Gen)、測試單詞合法性及出錯恢復(fù)過程(Test)、登錄名字表過程(Enter)、查詢名字表函數(shù)(Position)以及列出類 PCODE代碼過程(Listcode)作過語法分析的輔助過程。

      由PL/0的語法圖可知:一個完整的PL/0程序是由分程序和句號構(gòu)成的。因此,本編譯程序在運(yùn)行的時候,通過主程序中調(diào)用分程序處理過程block來分析分程序部分(分程序分析過程中還可能會遞歸調(diào)用block過程),然后,判斷最后讀入的符號是否為句號。如果是句號且分程序分析中未出錯,則是一個合法的PL/0程序,可以運(yùn)行生成的代碼,否則就說明源PL/0程序是不合法的,輸出出錯提示即可。

      if-then-else語句的處理:

      按if語句的語法,首先調(diào)用邏輯表達(dá)式處理過程處理if語句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成 條件轉(zhuǎn)移jpc指令(遇0或遇假轉(zhuǎn)移),轉(zhuǎn)移地址未知暫時填0。然后調(diào)用語句處理過程處理 then語句后面的語句或語句塊。then后的語句處理完后,如果遇到else,就調(diào)用語句處理過程處理else語句后面的語句或語句塊,這時當(dāng)前代碼段分配指針的位置就應(yīng)該是上面的jpc指令的轉(zhuǎn)移位置。通過前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置,否則沒遇到else,那么此時的當(dāng)前代碼段分配指針的位置也是上面jpc指令的轉(zhuǎn)移位置,也是通過前面記錄下的jpc位置指令的位置,把它的跳轉(zhuǎn)到當(dāng)前的代碼段指針位置。

      Repeat語句的處理:

      首先用CX1變量記下當(dāng)前代碼段分配位置,作為循環(huán)的開始位置。然后通過遞歸調(diào)用語句分析過程分析,直到遇到until保留字,如果未對應(yīng)until則出錯。調(diào)用條件表達(dá)式處理過程生成相應(yīng)代碼把結(jié)果放在數(shù)據(jù)棧頂,再生成條件轉(zhuǎn)移指令,轉(zhuǎn)移位置為上面記錄的CX1。

      五、相關(guān)代碼及運(yùn)行結(jié)果

      實(shí)驗(yàn)代碼; PL0.h代碼: #include #include #include #include #include #include

      #ifndef WIRTH_ZYC_ #define WIRTH_ZYC_ using namespace std;

      const int norw = 16;

      // no.of reserved words 保留字的個數(shù)

      const int txmax = 100;

      // length of identifier table 標(biāo)示符表的長度(容量)const int al = 10;

      // length of identifiers 標(biāo)示符的最大長度

      const int nmax = 14;

      // max.no.of digits in numbers 數(shù)字的最大長度 const int amax = 2047;

      // maximum address 尋址空間

      const int levmax = 3;

      // maximum depth of block nesting 最大允許的塊嵌套層數(shù) const int cxmax = 200;

      // size of code array 類PCODE目標(biāo)代碼數(shù)組長度(可容納代碼行數(shù))

      const int lineLength = 82;// 行緩沖區(qū)長度

      typedef enum {NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,ELSESYM,REPEATSYM,UNTILSYM} symbol;// symobl類型標(biāo)識了不同類型的詞匯

      typedef char alfa[al+1];

      // alfa類型用于標(biāo)識符 typedef enum {CONSTANT,VARIABLE,PROCEDURE,ARRAY} obj0;

      // 三種標(biāo)識符的類型 typedef enum {LIT,OPR,LOD,STO,CAL,INT,JMP,JPC} fct;

      // functions typedef set symset;

      struct instruction{ fct f;// function code int l;// level,cann't big than levmax

      int a;// displacement address,cann't big than amax };

      // 類PCODE指令類型,包含三個字段:指令f、層差l和另一個操作數(shù)a

      /******************************************* * lit 0,a: load constant a

      * * opr 0,a: execute operation a

      * * lod l,a: load variable l,a

      * * sto l,a: store variable l,a

      * * cal l,a: call procedure a at level l

      * * int 0,a: increment t-register by a

      * * jmp 0,a: jump to a

      * * jpc 0,a: jump conditional to a

      * *******************************************/

      typedef struct{ alfa name;obj0 kind;union {

      struct{int level,adr,size;}inOther;

      int val;}other;} Table;

      class PL0 {

      protected:

      bool listswitch,sourceEnd;char ch;

      // last character read symbol sym;

      // last symbol read alfa id;

      // last identifier read int num;

      // last number read

      int cc;

      // character count int ll;

      // line length int kk,err;int cx;

      // code allocation index int codeNo;

      // code line no.static string errStr[];

      // error string

      char line[lineLength];

      // code line vector errorString;

      // error array alfa a;

      // 詞法分析器中用于臨時存放正在分析的詞

      instruction code[cxmax+1];

      // destination code array

      alfa word[norw+1];

      // 保留字表

      symbol wsym[norw+1];

      // 保留字表中每一個保留字對應(yīng)的symbol類型

      symbol ssym[100];

      // 一些符號對應(yīng)的symbol類型表

      合 char mnemonic[8][6];

      // 類PCODE指令助記符表

      symset declbegsys,statbegsys,facbegsys;// 聲明開始、表達(dá)式開始和項(xiàng)開始符號集 Table table[txmax+1];

      // 符號表

      FILE* fin,*fout;

      public:

      PL0(char* source,char*destination);

      ~PL0(){fclose(fin),fclose(fout);}

      void error(int n);

      位置和出錯代碼

      void getsym();

      個單詞

      void getch();

      個字符

      void gen(fct x,int y,int z);

      程序區(qū)

      void test(symset s1,symset s2,int n);

      合法

      void block(int lev,int tx,symset fsys);

      void enter(obj0 k,int &tx,int &dx,int lev);

      int position(alfa id,int tx);的位置

      void constdeclaration(int&tx,int&dx,int lev);

      void vardeclaration(int&tx,int&dx,int lev);

      void listcode(int cx0);

      void statement(symset fsys,int tx,int lev);

      void expression(symset fsys,int tx,int lev);

      void term(symset fsys,int tx,int lev);

      void factor(symset fsys,int tx,int lev);

      void condition(symset fsys,int tx,int lev);

      void arraydeclaration(int& tx,int& dx,int lev);

      void interpret();

      執(zhí)行程序

      int base(int l,int b,int s[]);

      基地址

      void SaveCode();

      // 構(gòu)造函數(shù)

      // 析構(gòu)函數(shù)

      // 出錯處理,打印出錯

      // 詞法分析,讀取一

      // 漏掉空格,讀取一// 生成目標(biāo)代碼,并送入目標(biāo)

      // 測試當(dāng)前單詞符號是否

      // 分程序分析處理過程

      // 登入名字表

      // 查找標(biāo)示符在名字表中

      // 常量定義處理

      // 變量說明處理

      // 列出目標(biāo)代碼清單

      // 語句部分處理

      // 表達(dá)式處理

      // 項(xiàng)處理

      // 因子處理

      // 條件處理

      // 數(shù)組說明處理

      // 對目標(biāo)代碼的解釋

      // 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的 // 保存代碼

      };#endif PL0.cpp代碼: #include “pl0.h”

      // 錯誤字符串?dāng)?shù)組

      string PL0::errStr[]={“",”error 0001: 常數(shù)說明中“=”寫成“:=”“, ”error 0002: 常數(shù)說明中的“=”后應(yīng)為數(shù)字“, ”error 0003: 常數(shù)說明中的標(biāo)識符后應(yīng)是“=”“, ”error 0004: const,var,procedure后應(yīng)為標(biāo)識符“, ”error 0005: 漏掉了‘,’或‘;’“, ”error 0006: 過程說明后的符號不正確(應(yīng)是語句開始符或過程開始符)“, ”error 0007: 應(yīng)是語句開始符“, ”error 0008: 過程體內(nèi)語句部分的后跟符不正確“, ”error 0009: 程序皆為丟了句號‘.’“, ”error 0010: 語句之間漏了‘;’“, ”error 0011: 標(biāo)識符沒說明“, ”error 0012: 賦值語句中,賦值號左部標(biāo)識符屬性應(yīng)是變量“, ”error 0013: 賦值語句左部標(biāo)識符應(yīng)是賦值號:=“, ”error 0014: call后應(yīng)為標(biāo)識符“, ”error 0015: call后標(biāo)識符屬性應(yīng)為過程“, ”error 0016: 條件語句中丟了then“, ”error 0017: 丟了end或;“, ”error 0018: while型循環(huán)語句中丟了do“, ”error 0019: 語句后的標(biāo)識符不正確“, ”error 0020: 應(yīng)為關(guān)系運(yùn)算符“, ”error 0021: 表達(dá)式內(nèi)標(biāo)識符屬性不能是過程“, ”error 0022: 表達(dá)式中漏掉了右括號‘)’“, ”error 0023: 因子后的非法符號“, ”error 0024: 表達(dá)式開始符不能是此符號“, ”error 0025: 文件在不該結(jié)束的地方結(jié)束了“, ”error 0026: 結(jié)束符出現(xiàn)在不該結(jié)束的地方“, ”error 0027: “,”error 0028: “,”error 0029: “,”error 0030: “, ”error 0031: 數(shù)越界“, ”error 0032: read語句括號中標(biāo)識符不是變量“, ”error 0033: else附近錯誤“ , ”error 0034: repeat附近錯誤“};

      // PL0構(gòu)造函數(shù)

      PL0::PL0(char* source,char*destination){ listswitch=true,sourceEnd=false;

      strcpy(word[1],”begin“);

      // 初始化存儲保留字

      strcpy(word[2],”call“);strcpy(word[3],”const“);

      strcpy(word[4],”do“);strcpy(word[5],”else“);strcpy(word[6],”end“);strcpy(word[7],”if“);strcpy(word[8],”odd“);strcpy(word[9],”procedure“);strcpy(word[10],”read“);

      strcpy(word[11],”repeat“);strcpy(word[12],”then“);strcpy(word[13],”until“);strcpy(word[14],”var“);

      strcpy(word[15],”while“);strcpy(word[16],”write“);

      wsym[1]= BEGINSYM;

      wsym[2]= CALLSYM;留字對應(yīng)的symbol類型

      wsym[3]= CONSTSYM;

      wsym[4]= DOSYM;wsym[5]= ELSESYM;

      wsym[6]= ENDSYM;wsym[7]= IFSYM;

      wsym[8]= ODDSYM;wsym[9]= PROCSYM;

      wsym[10]= READSYM;

      wsym[11]= REPEATSYM;wsym[12]= THENSYM;wsym[13]= UNTILSYM;wsym[14]= VARSYM;

      wsym[15]= WHILESYM;wsym[16]= WRITESYM;

      memset(code,0,sizeof(code));memset(ssym,0,100*sizeof(symbol));memset(table,0,sizeof(table));memset(line,0,sizeof(line));

      ssym['+']= PLUS;

      類型表

      ssym['-']= MINUS;ssym['*']= TIMES;ssym['/']= SLASH;ssym['(']= LPAREN;ssym[')']= RPAREN;ssym['=']= EQL;ssym[',']= COMMA;ssym['.']= PERIOD;

      // 初始化保留字表中每一個保

      // 初始化一些符號對應(yīng)的symbol

      ssym['#']= NEQ;ssym['<']= LSS;ssym['>']= GTR;ssym[';']= SEMICOLON;

      strcpy(mnemonic[LIT],” lit “);

      // 初始化類PCODE指令助記符表

      strcpy(mnemonic[OPR],” opr “);strcpy(mnemonic[LOD],” lod “);strcpy(mnemonic[STO],” sto “);strcpy(mnemonic[CAL],” cal “);strcpy(mnemonic[INT],” int “);strcpy(mnemonic[JMP],” jmp “);strcpy(mnemonic[JPC],” jpc “);

      declbegsys.insert(CONSTSYM),declbegsys.insert(VARSYM),declbegsys.insert(PROCSYM);// 初始化聲明開始符號集合 statbegsys.insert(BEGINSYM),statbegsys.insert(CALLSYM),statbegsys.insert(IFSYM),statbegsys.insert(WHILESYM);// 初始化表達(dá)式開始符號集合facbegsys.insert(IDENT),facbegsys.insert(NUMBER),facbegsys.insert(LPAREN);// 初始化項(xiàng)開始符號集合

      err= 0;cc= 0;

      // 行緩沖區(qū)指針

      cx= 0;

      // 代碼分配指針,代碼生成模塊總在cx所指位置生成新的代碼

      ll= 0;

      // 行緩沖區(qū)長度

      ch= ' ';

      // last character read

      }

      kk= al;

      // 引入此變量是出于程序性能考慮 codeNo=0;

      // code line no.fin=fopen(source,”r“);fout=fopen(destination,”w“);// 出錯處理,打印出錯位置和出錯代碼 void PL0::error(int n){ char s[10];sprintf(s,”第 %d 行:“,codeNo);errorString.push_back(s+errStr[n]);err= err+1;//error count }//error end // 詞法分析,讀取一個單詞

      void PL0::getsym(){ if(sourceEnd)

      return;int i,j,k;while(ch ==' '||ch==9)

      getch();

      // cls space and tab if(isalpha(ch))// id or reserved word {

      k=0;

      memset(a,0,al+1);

      // 檢測一個單詞長度 do{ if(k < al){

      a[k]= ch;

      k= k+1;} getch();if(sourceEnd)

      return;}while(isalpha(ch)||isdigit(ch));if(k >= kk)kk = k;else { do{

      a[kk]= ' ';

      kk= kk-1;}while(kk > k);} strcpy(id,a);i= 1;j= norw;// 判斷是否是關(guān)鍵字(二分搜索)do{ k=(i+j)/ 2;if(strcmp(id, word[k])<=0)

      j= k-1;if(strcmp(id,word[k])>=0)

      i= k+1;}while(i<=j);if(i-1 > j)

      sym= wsym[k];else

      sym= IDENT;} else if(isdigit(ch))// number { k= 0;num= 0;sym= NUMBER;do{

      num= 10 * num + ch-'0';

      k= k+1;

      getch();}while(isdigit(ch));if(k > nmax)

      error(30);} else if(ch == ':'){ getch();if(ch == '='){

      sym= BECOMES;

      getch();} else

      sym= NUL;} else if(ch == '<')

      // extra stuff added to support <= { getch();if(ch== '='){

      sym= LEQ;

      getch();} else

      sym= LSS;} else if(ch == '>'){ getch();if(ch == '='){

      sym= GEQ;

      getch();} else

      sym= GTR;} else

      // end of extra stuff { sym= ssym[ch];// 其它符號的賦值

      getch();} }

      // 漏掉空格,讀取一個字符

      void PL0::getch(){ if(cc == ll){

      if(feof(fin))

      {

      if(sym!=PERIOD)

      error(25);

      sourceEnd=true;

      return;

      }

      cc= 0;

      fgets(line,lineLength,fin);

      codeNo++;

      ll=strlen(line);

      if(line[ll-1]==10)ll--;} ch= line[cc];cc= cc+1;}

      // 生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)void PL0::gen(fct x,int y,int z){ if(cx > cxmax){

      cout<<”Program too longn“;

      return;}

      code[cx].f= x;code[cx].l= y;code[cx].a= z;

      cx= cx+1;}//gen end

      // 測試當(dāng)前單詞符號是否合法

      void PL0::test(symset s1,symset s2,int n){ if(sourceEnd)

      return;if(s1.find(sym)==s1.end()){

      error(n);

      symset::iterator it;

      for(it=s2.begin();it!=s2.end();it++)

      s1.insert(*it);//s1=s1+s2

      while(s1.find(sym)==s1.end())

      getsym();} }//test end

      // 分程序分析處理過程

      void PL0::block(int lev,int tx,symset fsys){ if(sourceEnd)

      return;int dx;// data allocation index int tx0;// initial table index int cx0;// initial code index

      dx= 3;

      // 變量的個數(shù) tx0= tx;// 表指針

      table[tx].other.inOther.adr= cx;gen(JMP,0,0);if(lev>levmax)error(32);do{

      if(sym == CONSTSYM)

      // 處理常量聲明

      {

      getsym();

      do{

      constdeclaration(tx,dx,lev);

      while(sym == COMMA)

      {

      }

      getsym();

      constdeclaration(tx,dx,lev);} if(sym ==SEMICOLON)

      getsym();else

      error(5);}while(sym==IDENT);if(sym == VARSYM)

      // 處理變量聲明 { getsym();do{

      vardeclaration(tx,dx,lev);

      while(sym == COMMA){

      getsym();

      vardeclaration(tx,dx,lev);

      }

      if(sym ==SEMICOLON)

      getsym();

      else

      error(5);}while(sym==IDENT);} while(sym ==PROCSYM)

      // 處理過程的聲明 { getsym();if(sym ==IDENT){

      enter(PROCEDURE,tx,dx,lev);

      getsym();} else

      error(4);if(sym ==SEMICOLON)

      getsym();else

      error(5);symset tmp = fsys;tmp.insert(SEMICOLON);block(lev+1,tx,tmp);if(sym == SEMICOLON){

      getsym();

      symset tmp = statbegsys;

      for(int i= IDENT;i<=PROCSYM;i++)

      tmp.insert((symbol)i);

      test(tmp,fsys,6);

      }

      else

      error(5);

      }

      symset tmp=statbegsys;

      tmp.insert(IDENT);

      test(tmp,declbegsys,7);}while(declbegsys.find(sym)!=declbegsys.end());

      code[table[tx0].other.inOther.adr].a= cx;table[tx0].other.inOther.adr= cx;// start adr of code table[tx0].other.inOther.size=dx;

      cx0= cx;gen(INT,0,dx);symset tmp=statbegsys;for(int i=SEMICOLON;i <= ENDSYM;i++)

      tmp.insert((symbol)i);statement(tmp,tx,lev);gen(OPR,0,0);// return symset s2;test(fsys,s2,8);listcode(cx0);}// block end

      // 登入名字表

      void PL0::enter(obj0 k,int &tx,int &dx,int lev){ tx= tx+1;strcpy(table[tx].name,id);table[tx].kind=k;switch(k){ case CONSTANT:

      if(num>amax)

      {

      error(31);

      num=0;

      }

      table[tx].other.val=num;

      break;case VARIABLE:

      table[tx].other.inOther.level=lev;

      table[tx].other.inOther.adr=dx;

      dx++;

      break;case PROCEDURE:

      table[tx].other.inOther.level=lev;

      break;case ARRAY:

      table[tx].other.inOther.size = lev;

      break;} }//enter end

      // 查找標(biāo)示符在名字表中的位置

      int PL0::position(alfa id,int tx)//find identifier id in table { int i;strcpy(table[0].name, id);i= tx;while(strcmp(table[i].name,id)!=0)i--;return i;}//position end

      // 常量定義處理

      void PL0::constdeclaration(int&tx,int&dx,int lev){ if(sym == IDENT){

      getsym();

      if(sym>=EQL&&sym<=BECOMES)

      {

      if(sym ==BECOMES)

      error(1);

      getsym();

      if(sym == NUMBER)

      {

      enter(CONSTANT,tx,dx,lev);

      getsym();

      }

      else

      error(2);

      }

      else

      error(3);} else

      error(4);}// constdeclaration end

      // 變量說明處理

      void PL0::vardeclaration(int&tx,int&dx,int lev){ if(sym == IDENT){

      enter(VARIABLE,tx,dx,lev);

      getsym();} else

      error(4);}//vardeclaration end

      // 數(shù)組說明處理

      void PL0::arraydeclaration(int&tx,int&dx,int lev){

      int upscript=0,downscript=0;getsym();if(sym == NUMBER || sym == CONSTSYM){

      if(num == 0)

      {

      upscript = num;

      getsym();

      }

      else

      error(32);} if(sym == COMMA)

      getsym();else

      error(32);if(sym == NUMBER || sym == CONSTSYM){

      downscript = num;

      getsym();} if(sym!= RPAREN)

      } error(32);else { enter(ARRAY,tx,dx,downscript+1);getsym();} // 列出目標(biāo)代碼清單

      void PL0::listcode(int cx0)//list code generated for this block { int i;if(listswitch)

      for(i= cx0;i

      cout<<”“<

      <<”“<

      // 語句部分處理

      void PL0::statement(symset fsys,int tx,int lev){ if(sourceEnd)

      return;int i,cx1,cx2;if(sym ==IDENT){

      i= position(id,tx);

      if(i == 0)

      error(11);

      else if(table[i].kind!=VARIABLE)

      {

      error(12);

      i= 0;

      }

      getsym();

      if(sym ==BECOMES)

      getsym();

      else

      error(13);

      expression(fsys,tx,lev);

      if(sym!= SEMICOLON)

      error(10);

      if(i!= 0)

      gen(STO,lev-table[i].other.inOther.level,table[i].other.inOther.adr);

      } else if(sym == READSYM){ getsym();if(sym!=LPAREN)

      error(34);else

      do{

      getsym();

      if(sym==IDENT)

      i=position(id,tx);

      else

      i=0;

      if(i==0)

      error(35);

      else

      {

      gen(OPR,0,16);

      gen(STO,lev-table[i].other.inOther.level,table[i].other.inOther.adr);

      }

      getsym();

      }while(sym == COMMA);

      if(sym!= RPAREN)

      {

      error(33);

      while(fsys.find(sym)!=fsys.end())getsym();

      }

      else

      getsym();} else if(sym == WRITESYM){ getsym();if(sym==LPAREN){

      do{

      getsym();

      symset tmp=fsys;

      for(int t=RPAREN;t<=COMMA;t++)

      tmp.insert((symbol)t);

      expression(tmp,tx,lev);

      gen(OPR,0,14);

      }while(sym==COMMA);

      if(sym!=RPAREN)

      error(33);

      else

      getsym();} gen(OPR,0,15);} else if(sym ==CALLSYM){ getsym();if(sym!=IDENT)

      error(14);else {

      i= position(id,tx);

      if(i == 0)

      error(11);

      else if(table[i].kind = PROCEDURE)

      gen(CAL,lev-table[i].other.inOther.level,table[i].other.inOther.adr);

      else

      error(15);

      getsym();} } else if(sym ==IFSYM){ getsym();symset tmp=fsys;for(int i = THENSYM;i<= DOSYM;i++)

      tmp.insert((symbol)i);condition(tmp,tx,lev);if(sym == THENSYM)

      getsym();else

      error(16);cx1= cx;gen(JPC,0,0);tmp.insert(ELSESYM);statement(tmp,tx,lev);getsym();

      code[cx1].a= cx;

      if(sym == ELSESYM){

      getsym();

      cx2=cx;

      gen(JMP,0,0);

      code[cx1].a=cx;

      statement(fsys,tx,lev);

      code[cx2].a=cx;} } else if(sym ==BEGINSYM){ getsym();symset tmp=fsys;for(int i=SEMICOLON;i<=ENDSYM;i++)

      tmp.insert((symbol)i);statement(tmp,tx,lev);tmp=statbegsys;tmp.insert(SEMICOLON);while(tmp.find(sym)!=tmp.end()){

      if(sourceEnd)return;

      if(sym ==SEMICOLON||sym ==ENDSYM)

      getsym();

      else if(sym=PERIOD)

      {

      error(26);

      getsym();

      }

      else

      error(10);

      tmp=fsys;

      for(i=SEMICOLON;i<=ENDSYM;i++)

      tmp.insert((symbol)i);

      if(sourceEnd)return;

      if(sym==ENDSYM)

      break;

      statement(tmp,tx,lev);} if(sym ==ENDSYM)

      getsym();else if(!sourceEnd)

      error(17);} else if(sym ==WHILESYM){ cx1= cx;

      // 記下當(dāng)前代碼分配位置,這是while循環(huán)的開始位置

      getsym();symset tmp=fsys;tmp.insert(DOSYM);condition(tmp,tx,lev);

      cx2= cx;

      // 記下當(dāng)前代碼分配位置,這是while的do中的語句的開始位置

      gen(JPC,0,0);

      if(sym ==DOSYM)

      getsym();

      else

      error(18);

      statement(fsys,tx,lev);

      gen(JMP,0,cx1);

      code[cx2].a= cx;} else if(sym == REPEATSYM){

      symset temp1, temp2;

      temp1= fsys,temp1.insert(SEMICOLON),temp1.insert(UNTILSYM);

      cx1= cx;

      getsym();

      statement(temp1,tx,lev);

      temp2 = statbegsys;

      temp2.insert(SEMICOLON);

      while(temp2.find(sym)!= temp2.end())

      {

      if(sym == SEMICOLON)

      getsym();

      else

      error(34);

      statement(temp1,tx,lev);

      }

      if(sym == UNTILSYM)

      {

      getsym();

      condition(fsys,tx,lev);

      gen(JPC,0,cx1);

      }

      else

      error(34);

      } symset setT;test(fsys,setT,19);}//statement end

      // 表達(dá)式處理

      void PL0::expression(symset fsys,int tx,int lev){ symbol addop;symset tmp=fsys;for(int t=PLUS;t<=MINUS;t++)

      tmp.insert((symbol)t);if(sym>=PLUS&&sym<=MINUS){

      addop= sym;

      getsym();

      term(tmp,tx,lev);

      if(addop ==MINUS)

      gen(OPR,0,1);} else

      term(tmp,tx,lev);while(sym >=PLUS&&sym<=MINUS){

      addop= sym;

      getsym();

      term(tmp,tx,lev);

      if(addop ==PLUS)

      gen(OPR,0,2);

      else

      gen(OPR,0,3);} }// expression end

      // 項(xiàng)處理

      void PL0::term(symset fsys,int tx,int lev){ if(sourceEnd)

      return;symbol mulop;symset tmp=fsys;for(int t=TIMES;t<=SLASH;t++)

      tmp.insert((symbol)t);factor(tmp,tx,lev);while(sym>=TIMES && sym<=SLASH){

      mulop= sym;

      getsym();

      factor(tmp,tx,lev);

      if(mulop ==TIMES)

      gen(OPR,0,4);

      else

      gen(OPR,0,5);} }// term end

      // 因子處理

      void PL0:: factor(symset fsys,int tx,int lev){ int i;test(facbegsys,fsys,24);while(facbegsys.find(sym)!=facbegsys.end()){

      if(sym ==IDENT)

      {

      i= position(id,tx);

      if(i == 0)

      error(11);

      else

      switch(table[i].kind)

      {

      case CONSTANT:

      gen(LIT,0,table[i].other.val);

      break;

      case VARIABLE:

      gen(LOD,lev-table[i].other.inOther.level,table[i].other.inOther.adr);

      break;

      case PROCEDURE:

      error(21);

      break;

      }

      getsym();

      }

      else if(sym ==NUMBER)

      {

      if(num>amax)

      {

      error(31);

      num= 0;

      }

      gen(LIT,0,num);

      getsym();

      }

      else if(sym ==LPAREN)

      {

      getsym();

      symset tmp=fsys;

      tmp.insert(RPAREN);

      expression(tmp,tx,lev);

      if(sym == RPAREN)

      getsym();

      else

      error(22);

      }

      test(fsys,facbegsys,23);} }//factor end

      // 條件處理

      void PL0::condition(symset fsys,int tx,int lev){ symbol relop;symset tmp=fsys;tmp.insert(EQL),tmp.insert(NEQ),tmp.insert(LSS),tmp.insert(LEQ),tmp.insert(GTR),tmp.insert(GEQ);

      if(sym == ODDSYM){

      getsym();

      expression(fsys,tx,lev);

      gen(OPR,0,6);} else {

      expression(tmp,tx,lev);

      if(tmp.find(sym)==tmp.end())

      error(20);

      else

      {

      relop= sym;

      getsym();

      expression(fsys,tx,lev);

      switch(relop)

      {

      case EQL: gen(OPR,0,8);

      break;

      case NEQ: gen(OPR,0,9);

      break;

      case LSS: gen(OPR,0,10);

      break;

      case GEQ: gen(OPR,0,11);

      break;

      case GTR: gen(OPR,0,12);

      break;

      case LEQ: gen(OPR,0,13);

      break;

      }

      } } }//condition end

      // 對目標(biāo)代碼的解釋執(zhí)行程序

      void PL0::interpret(){ int err1=errorString.size();if(err1>0){

      cout<<”存在%d個錯誤:“<

      cout<

      t= t+1;

      s[t]= i.a;

      break;case OPR:

      switch(i.a)//operator

      { case 0:// return t= b-1;

      p= s[t+3];

      b= s[t+2];break;case 1: s[t]=-s[t];break;case 2: t= t-1;s[t]= s[t]+s[t+1];break;case 3: t= t-1;s[t]= s[t]-s[t+1];break;case 4: t= t-1;s[t]= s[t]*s[t+1];break;case 5: t= t-1;s[t]= s[t] / s[t+1];break;case 6: if(s[t]%2)

      s[t]=1;else

      s[t]=0;break;case 8: t= t-1;if(s[t]==s[t+1])

      s[t]=1;else

      s[t]=0;break;case 9: t= t-1;if(s[t]==s[t+1])

      s[t]=0;else

      s[t]=1;break;

      case 10: t= t-1;if(s[t]

      s[t]=1;else

      s[t]=0;break;case 11: t= t-1;if(s[t]>=s[t+1])

      s[t]= 1;else

      s[t]=0;break;case 12: t= t-1;if(s[t]>s[t+1])

      s[t]= 1;else

      s[t]=0;break;case 13: t= t-1;if(s[t]<=s[t+1])

      s[t]= 1;else

      s[t]=0;break;case 14: cout<<”“<>s[t];break;};break;case LOD:

      t= t+1;

      s[t]= s[base(i.l,b,s)+i.a];

      break;

      case STO:

      s[base(i.l,b,s)+i.a]= s[t];

      t= t-1;

      break;

      case CAL:// generate new block mark

      s[t+1]= base(i.l,b,s);

      s[t+2]= b;

      s[t+3]= p;

      b= t+1;

      p=i.a;

      break;

      case INT:

      t= t+i.a;

      break;

      case JMP:

      p= i.a;

      break;

      case JPC:

      if(s[t] == 0)

      p= i.a;

      t= t-1;

      break;

      }//switch end

      }while(p!=0);

      cout<<” End PL/0n“;} // interpret end

      // 通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址

      int PL0::base(int l,int b,int s[]){ int b1;b1= b;//find base l levels down while(l>0){

      b1= s[b1];

      l= l-1;} return b1;}

      // 保存代碼

      void PL0::SaveCode(){ if(fout)

      for(int i=0;i

      fprintf(fout,”%d %s %d %dn “,i,mnemonic[code[i].f],code[i].l,code[i].a);} TestPL0.cpp代碼: #include ”pl0.h“ void main(){ PL0 cp(”testPas2.txt“,”nasm.txt");

      symset fsys;

      fsys.insert(PERIOD);fsys.insert(CONSTSYM),fsys.insert(VARSYM),fsys.insert(PROCSYM);fsys.insert(BEGINSYM),fsys.insert(CALLSYM),fsys.insert(IFSYM),fsys.insert(WHILESYM);cp.getsym();

      // 詞法分析,分析一個詞

      cp.block(0,0,fsys);

      // 分程序分析處理功能

      cp.SaveCode();

      // 保存代碼

      cp.interpret();

      // 對目標(biāo)代碼的解釋執(zhí)行程序

      } 實(shí)驗(yàn)運(yùn)行結(jié)果:

      運(yùn)行的的文件見下圖右側(cè):實(shí)驗(yàn)中我是固定了文件名的,可以是改寫成動態(tài)輸入,由于在測試中我把所有的測試語句都放在同一個文件中了,沒有太多的必要。

      六、心得體會

      在編譯程序?qū)崿F(xiàn)的過程中反復(fù)使用了遞歸調(diào)用的思想,且也使用了模塊化處理問題的思想,使用模塊化的思想關(guān)鍵是在抽象階段要抽象出對應(yīng)的模塊,且模塊的層次必須是清晰的。

      在實(shí)現(xiàn)此程序中,由于要實(shí)現(xiàn)關(guān)鍵字和符號表中字段的搜索,實(shí)現(xiàn)中就必須注意快速查找的方法,而在實(shí)現(xiàn)的過程中多次用到了二分搜索的方法,這是個比較快的搜索方法。

      由于此程序的實(shí)現(xiàn)相對比較復(fù)雜,且不方便調(diào)試,改進(jìn)時可以把此程序的詞法分析,語法分析和執(zhí)行原代碼作為單獨(dú)的測試程序來測試,這樣也方便大家來調(diào)試。

      通過本次的課設(shè)我知道了一個算法的設(shè)計是需要靜下心來仔細(xì)的研究的,且實(shí)現(xiàn)中必須先了解程序的整個流程,也就是說在編程中首先必須看懂那些對應(yīng)的UML圖,只有在圖的指導(dǎo)下,編程中才不會盲目,也有一定的方向性。同樣在編程中必須注意代碼的規(guī)范,多寫一些對應(yīng)的注釋是很必要的,要時刻想這代碼并不是給你自己看的,而是必須要給別人看,因此我覺得代碼的規(guī)范是相當(dāng)重要的。

      第三篇:編譯原理課程設(shè)計報告(格式)

      編譯原理課程設(shè)計報告

      課題名稱:

      提交文檔學(xué)生姓名:提交文檔學(xué)生學(xué)號:同組 成 員 名 單:無指導(dǎo) 教 師 姓 名:

      指導(dǎo)教師評閱成績:指導(dǎo)教師評閱意見:

      提交報告時間:年月日

      1.課程設(shè)計目標(biāo)

      構(gòu)造的編譯器的組成部分,能實(shí)現(xiàn)的功能。

      2.分析與設(shè)計

      ?

      ?

      ?

      ?

      ? 實(shí)現(xiàn)方法:編程語言、編程方法 系統(tǒng)總圖,各部分的實(shí)現(xiàn)原理、方法、中間結(jié)果、最后輸出 掃描器:各單詞的狀態(tài)轉(zhuǎn)換圖、轉(zhuǎn)換表 分析器:分析表 代碼設(shè)計說明:程序結(jié)構(gòu)圖,文件和函數(shù)的設(shè)計說明,關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

      3.程序代碼實(shí)現(xiàn)

      按文件列出主要程序代碼, 添加必要的注釋。

      4.測試結(jié)果

      ?

      ?

      ?

      標(biāo)準(zhǔn)測試程序的分析結(jié)果 修改后的測試程序分析結(jié)果(正確和錯誤)詞法分析和語法分析的結(jié)果輸出(P79,P182)

      5.總結(jié)

      ?

      ? 收獲 不足

      第四篇:編譯原理課程報告(共)

      編譯原理課程報告

      學(xué)院: 信息工程學(xué)院專業(yè): 軟件工程 姓名: 賴杰學(xué)號: 09927212 指導(dǎo)老師: 朱文華完成時間: 2012.5.19

      編譯原理是計算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法,在計算機(jī)本科教學(xué)中占有十分重要的地位。

      編譯程序是現(xiàn)代計算機(jī)系統(tǒng)的基本組成部分之一,而且多數(shù)計算機(jī)系統(tǒng)都配有不止一個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上講,一個編譯程序就是一個語言翻譯程序。語言翻譯程序把一種源語言書寫的程序翻譯成另一種目標(biāo)語言的等價程序,所以總的說編譯程序是一種翻譯程序,其源程序是高級語言,目標(biāo)語言程序是低級語言。

      編譯程序完成從源程序到目標(biāo)程序的翻譯工作,是一個復(fù)雜的整體的過程。從概念上來講,一個編譯程序的整個工作過程是劃分成幾個階段進(jìn)行的,每個階段將源程序的一種表示形式轉(zhuǎn)換成另一種表示形式,各個階段進(jìn)行的操作在邏輯上是緊密連接在一起的。一般一個編譯過程是詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成。

      編寫編譯器的原理和技術(shù)具有十分普遍的意義,以至于在每個計算機(jī)工作者的職業(yè)生涯中,本書中的原理和技術(shù)都會反復(fù)用到。在這本書中,向我們介紹了文法的概念,在講詞法分析的章節(jié)中講述了構(gòu)造一個有窮自動機(jī)的方法,以及如何將一個不確定的有窮自動機(jī)轉(zhuǎn)化成確定的有窮自動機(jī)和有窮自動機(jī)的最小化等方法。

      該門課中主要講述的是兩種分析方法,即自上而下分析的方法和自下而上分析的方法。自上而下分析法是從文法的開始符號出發(fā),反復(fù)使用各種產(chǎn)生式,尋找“匹配”于輸入符號串的推導(dǎo)。自下而上的分析方法是從輸入符號串開始,逐步進(jìn)行“歸約”到文法的開始符號。

      1.自上而下的分析法主要的就是LL(1)文法,首先要判斷某個文法是否是

      LL(1)文法,如果是就可以按照LL(1)文法分析的方法去判斷某一個輸入串是否為該文法的句子。LL(1)f分析方法是,首先根據(jù)判斷是否為LL(1)文法求出每一個非終結(jié)符的SELECTE集合來構(gòu)造該文法的預(yù)測分析表,然后根據(jù)預(yù)測分析表去分析輸入串得出結(jié)果;如果不是LL(1)文法,比如說文法產(chǎn)生式中含有左遞歸和相同的因子,就要消去左遞歸或公共因子,再根據(jù)每一個非終結(jié)符的SELECT集合來判斷是否為LL(1)文法。利用LL(1)文法分析一個輸入串是不是某一個文法的句子,根據(jù)預(yù)測分析表是比較直觀的,而且分析的效率也是比較高的。

      2.自下而上的分析方法主要是算符優(yōu)先分析方法。算符優(yōu)先分析的基本思

      想是只規(guī)定算符之間的優(yōu)先關(guān)系,也就是只考慮終結(jié)符之間的優(yōu)先關(guān)系,由于算符優(yōu)先分析不考慮非終結(jié)符之間的優(yōu)先關(guān)系,在歸約的過程中只要找到可歸約串就歸約,沒有考慮非終結(jié)符之間的優(yōu)先關(guān)系,所以說算符優(yōu)先歸約不是規(guī)范規(guī)約。算符優(yōu)先分析首先是要構(gòu)造算符

      優(yōu)先關(guān)系矩陣;然后就是分析輸入串,根據(jù)關(guān)系矩陣進(jìn)行移進(jìn)或歸約操作;最后分析得出判斷的結(jié)果。

      3.算符優(yōu)先分析是有缺點(diǎn)的,由于算符優(yōu)先分析方法在分析的過程中不知

      道如何確定句柄。下面要說的就是LR(0)文法,這種方法能夠根據(jù)當(dāng)前分析棧中的符號串就可以惟一的確定分析器的動作是移進(jìn)還是歸約,并且是用哪一個產(chǎn)生式。根據(jù)規(guī)則寫出LR(0)的分析的項(xiàng)目集,再由項(xiàng)目集構(gòu)造LR(0)的分析表,其次根據(jù)分析棧的元素和狀態(tài),查看分析表,找出相關(guān)的句柄,是歸約還是移進(jìn),最后就是分析得出結(jié)果了。SLR(0)文法是以LR(0)文法為基礎(chǔ)的文法,是為了解決程序設(shè)計語言的文法不能夠滿足LR(0)文法條件的另一種文法分析的方法,大致的與LR(0)的分析過程相似,只是在項(xiàng)目集的組合上有些區(qū)別。

      該課程理論性與實(shí)踐性都很強(qiáng),我在學(xué)習(xí)時普遍感到內(nèi)容非常抽象,不易理解,內(nèi)容多且繁瑣,難以完整、全面地掌握編譯原理的有關(guān)知識,更不用說靈活運(yùn)用編譯原理知識從事相關(guān)設(shè)計或應(yīng)用于其他領(lǐng)域。雖然只有少數(shù)人從事編譯方面的工作,但是這門課在理論、技術(shù)、方法上都對我提供了系統(tǒng)而有效的訓(xùn)練,有利于提高軟件人員的素質(zhì)和能力。

      在我學(xué)習(xí)編譯原理以前,都認(rèn)為編譯原理只能應(yīng)用在寫程序語言的編譯器上,覺得用處不大,學(xué)習(xí)興趣不高。而在后來的學(xué)習(xí)中,我逐漸認(rèn)識到計算機(jī)專業(yè)的學(xué)生,除了要會編寫程序語言之外,還應(yīng)該了解它是如何被計算機(jī)所識別,這才是真正并且透徹地學(xué)習(xí)軟件。另外,編譯器中每一個模塊的編寫,都能對我的編程能力的提高有很大幫助。在今后若從事軟件工程,這門課程也能夠?qū)帉懗绦蛴兴鶐椭?/p>

      為了能夠系統(tǒng)掌握這門專業(yè)課,我把編譯原理分為以下幾個模塊:①語言和文法;②詞法分析;③語法分析;④語義分析和中間代碼生成;⑤代碼優(yōu)化和目標(biāo)代碼生成。

      在學(xué)習(xí)的開始,我需要掌握什么是編譯,編譯分為哪些階段,編譯程序和解釋程序的區(qū)別等等。在做好了這些方面的準(zhǔn)備后,開始了系統(tǒng)的學(xué)習(xí)。

      語言和文法部分的知識包括文法基本概念及文法的二義性?;靖拍钣形姆ǘx、推導(dǎo)、句型、句子等等。二義性文法是通過畫語法樹的方法來證明。

      詞法分析中的重點(diǎn)是有窮自動機(jī)DFA的生成以及DFA和正規(guī)式與正規(guī)文法的關(guān)系。還要熟練掌握NFA轉(zhuǎn)換為DFA的方法及DFA的化簡。

      語法分析包括自上而下和自下而上分析。自上而下分析著重掌握LL(1)文法,自下而上分析重點(diǎn)掌握算符優(yōu)先文法和LR(0)、SLR(1)文法。

      語義分析重點(diǎn)是其功能,中間代碼生成和語法制導(dǎo)翻譯定義與方法。

      最后,優(yōu)化分為局部優(yōu)化和循環(huán)優(yōu)化,重點(diǎn)理解一些關(guān)鍵詞,如基本塊、流圖等,要學(xué)會自己畫出程序流圖。用DAG圖進(jìn)行局部優(yōu)化是重點(diǎn)。

      在學(xué)習(xí)文法時,對文法的組成,用法都較為明了,而在真正做題時卻感到十分吃力。例如給出了一個語言,要求寫出它的上下文無關(guān)文法,就感到十分棘手,所以今后在這方面要加大練習(xí)量,以熟練掌握。

      而在之后的詞法分析和語法分析中,我感到在看基本原理時十分困難,通常要長時間鉆研才能夠有所了解,而一旦掌握了基本原理,做題時就感到十分順暢了。例如,在剛接觸到LR(0)文法時,我用了大量的時間去學(xué)習(xí)它的原理,掌

      握之后,在列LR(0)分析表和寫分析過程時,只要思路清晰,就會比較順暢,而且不會犯錯。

      通過這學(xué)期的對編譯原理課程的學(xué)習(xí),這么課程讓我學(xué)會了如何去編譯程序的一個理論知識,知道編譯程序是通過怎樣的方法把程序員編寫的源程序翻譯成計算機(jī)能夠執(zhí)行的機(jī)器語言的,我覺得主要的是大大加深了我對程序設(shè)計的理解,也對計算機(jī)的理論和軟件編譯有了深一步的理解。這學(xué)期的編譯原理的實(shí)驗(yàn)使我知道了編譯程序的工作的基本過程及其各階段的基本任務(wù),了解了 編譯程序流程框圖,編譯程序的生成過程、構(gòu)造工具及其相關(guān)的技術(shù)對課本上的知識有了更深的理解,可以說這是將書本上的理論知識的應(yīng)用,是對理論知識的更深一步的理解和掌握。

      第五篇:《編譯原理》課程設(shè)計報告--詞法分析器

      201X-201X學(xué)年第x學(xué)期

      《編譯原理》課程設(shè)計報告

      院 系: 計算機(jī)科學(xué)與技術(shù) 班 級: XX級XX 班 學(xué)生姓名: XXXXXX 學(xué) 號: XXXXXXXX 指導(dǎo)老師: XXXXXX

      計算機(jī)科學(xué)與技術(shù)學(xué)院監(jiān)制

      20XX年X月

      目錄

      1.課程設(shè)計的目的 2.課程設(shè)計的內(nèi)容和要求 3.問題分析和相關(guān)知識介紹 4.設(shè)計思路和關(guān)鍵問題及其解決方案 5.測試和結(jié)果分析 6.總結(jié)和心得體會

      附件1:參考文獻(xiàn) 附件2:核心源代碼

      1.課程設(shè)計的目的(1)編寫詞法分析器

      (2)加深對詞法分析器工作原理的了解和認(rèn)識

      2.課程設(shè)計的內(nèi)容和要求

      編寫詞法分析器,詞法分析器能夠識別關(guān)系算符,詞法分析器能夠識別標(biāo)識符和關(guān)鍵字,詞法分析器能夠識別無符號數(shù)。

      3.問題分析和相關(guān)知識介紹

      構(gòu)成詞法分析器的一種簡單方法是用狀態(tài)轉(zhuǎn)換圖來描述源語言詞法記號的結(jié)構(gòu),然后手工把這種狀態(tài)轉(zhuǎn)換圖翻譯成為識別詞法記號的程序。詞法分析器的任務(wù)是把構(gòu)成源程序的字符流翻譯成詞法記號流。

      4.設(shè)計思路和關(guān)鍵問題及其解決方案

      把自然語言構(gòu)造成正規(guī)式,把正規(guī)式構(gòu)造成有限自動機(jī)NFA,然后根據(jù)子集構(gòu)造法把有限自動機(jī)構(gòu)造成無限自動機(jī)DFA,根據(jù)極小化DFA狀態(tài)數(shù)算法把DFA構(gòu)造成最簡DFA,其次根據(jù)最簡DFA畫出轉(zhuǎn)換表,根據(jù)轉(zhuǎn)換表畫出裝換圖,最后根據(jù)裝換圖就可以編寫詞法分析器。

      5.測試和結(jié)果分析

      6.總結(jié)和心得體會

      通過本次試驗(yàn),不僅僅是我學(xué)會了C#基礎(chǔ)知識,而且還是我對詞法分析器有了更深入的認(rèn)識,雖然在編寫詞法分析器過程中遇到了很多困難,例如:C#語言不熟悉,對此法分析器的工作原理分析的不透徹,但在老師和同學(xué)的幫助下,我有了很大的提高,通過不斷的努力最終順利的完成了課程設(shè)計,很感謝幫助我的XX同學(xué)和XX老師。附件1:參考文獻(xiàn)

      《編譯原理(第2版)》 高等教育出版社; 《C#程序設(shè)計及應(yīng)用教程(第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 key = new List();//保存關(guān)鍵字

      static List bsf = new List();//保存標(biāo)識符

      static List sz = new List();//保存數(shù)字

      static List gx = new List();//保存關(guān)系運(yùn)算符

      static List ys = new List();//保存數(shù)字運(yùn)算符

      //數(shù)字,標(biāo)識符,空白,關(guān)系符,運(yùn)算符

      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(“關(guān)鍵字,輸入回車”);//輸出所有的關(guān)鍵字 Console.ReadLine();

      foreach(string id in key){ Console.WriteLine(id);

      }

      Console.WriteLine(“標(biāo)識符,輸入回車”);//輸出所有的標(biāo)識符

      Console.ReadLine();foreach(string id in bsf){ Console.WriteLine(id);

      }

      Console.WriteLine(“數(shù)字,輸入回車”);Console.ReadLine();foreach(string id in sz){ Console.WriteLine(id);

      }

      Console.WriteLine(“關(guān)系運(yùn)算符,輸入回車”);Console.ReadLine();foreach(string id in gx){ Console.WriteLine(id);

      }

      Console.WriteLine(“算數(shù)運(yùn)算符,輸入回車”);Console.ReadLine();foreach(string id in ys){ Console.WriteLine(id);

      }

      Console.WriteLine(“輸入回車退出”);

      Console.ReadLine();

      } static void analysisByLine(string code)

      //輸出所有的數(shù)字 //輸出所有的關(guān)系運(yùn)算符//輸出所有的算數(shù)運(yùn)算符

      {

      char a = ' ';string temp = “";int j = 0;while(j < code.Length){ a = code[j];temp = ”“;if(Char.IsLetter(a)|| a == '_')//是否為標(biāo)識符 { 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(”標(biāo)識符:“+temp);

      if(!bsf.Contains(temp)){ //Console.WriteLine(”添加成功標(biāo)識符==“);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];

      } //判斷是否是小數(shù)

      if(a.Equals('.')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} //判讀是否是科學(xué)記數(shù)法

      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(”數(shù)字:“+temp);if(!sz.Contains(temp)){ //Console.WriteLine(”添加成功標(biāo)識符==“);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(”關(guān)系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標(biāo)識符==“);gx.Add(temp);} } else if(a == '='){ temp = temp + a.ToString();j++;

      a = code[j];// Console.WriteLine(”關(guān)系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功關(guān)系==“);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(”關(guān)系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標(biāo)識符==“);gx.Add(temp);}

      } else { if(a == '+' || a == '-' || a == '/' || a == '*'){ temp = temp + a.ToString();j++;a = code[j];//Console.WriteLine(”運(yùn)算符“+temp);if(!ys.Contains(temp)){ //Console.WriteLine(”添加成功標(biāo)識符==“);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;

      } } }

      下載編譯實(shí)習(xí)報告(范文)word格式文檔
      下載編譯實(shí)習(xí)報告(范文).doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        編譯技術(shù)發(fā)展綜述

        編譯技術(shù)發(fā)展綜述 計算機(jī)科學(xué)與軟件學(xué)院 計算機(jī)1302 蔡元昊 1311611517引言:編譯程序構(gòu)造的原理和技術(shù)一直屬于最近公布的核心知識領(lǐng)域,已成為計算機(jī)科學(xué)必備的專業(yè)基礎(chǔ)知識......

        編譯原理 學(xué)習(xí)心得

        國際學(xué)院 0802 楊良燕 200819100227《編譯原理》課程學(xué)習(xí)心得 《編譯原理》是計算機(jī)專業(yè)的一門重要課程,正如教材 第一章的引論所述,“編譯程序是現(xiàn)代計算機(jī)系統(tǒng)的基本組成部......

        編譯原理實(shí)驗(yàn)報告[合集]

        編譯原理實(shí)驗(yàn)報告 報告完成日期 2018.5.30 一. 組內(nèi)分工與貢獻(xiàn)介紹 二. 系統(tǒng)功能概述; 我們使用了自動生成系統(tǒng)來完成我們的實(shí)驗(yàn)內(nèi)容。我們設(shè)計的系統(tǒng)在完成了實(shí)驗(yàn)基本要求的......

        編譯原理課程設(shè)計

        課 程 設(shè) 計 報 告 設(shè)計題目:一個簡單文法的編譯器前端的設(shè)計與實(shí)現(xiàn) 班級: 計算機(jī)1206 組長學(xué)號:201239 組長姓名:閆智宣 指導(dǎo)教師:李曉華 設(shè)計時間:2014年12月 [在此處鍵入] 設(shè)......

        編譯原理教學(xué)大綱(范文模版)

        編譯原理教學(xué)大綱 一、課程的性質(zhì)、地位 本課程是計算機(jī)專業(yè)的重要專業(yè)課之一,是一門理論性和實(shí)踐性較強(qiáng)的課程。主要介紹程序設(shè)計語言編譯程序構(gòu)造的基本原理和基本實(shí)現(xiàn)方法......

        編譯原理論文

        編譯原理心得體會 編譯原理是計算機(jī)專業(yè)的一門重要專業(yè)課,旨在介紹編譯程序構(gòu)造的一般原理和基本方法,在計算機(jī)本科教學(xué)中占有十分重要的地位。 該課程理論性與實(shí)踐性都很強(qiáng),我......

        經(jīng)典美文呼喚“經(jīng)典”編譯

        經(jīng)典美文呼喚“經(jīng)典”編譯 《在馬克思墓前的講話》,這篇文章是一位世界無產(chǎn)階級的偉大導(dǎo)師為另一位偉大導(dǎo)師所寫的悼詞。自入選高中語文課本以來,歷經(jīng)數(shù)次課本的變化,許多名家......

        編譯型語言和解釋型語言

        編譯型語言&解釋型語言&混合型語言&腳本語言 計算機(jī)不能直接理解高級語言,只能直接理解機(jī)器語言,所以必須要把高級語言翻譯成機(jī)器語言,計算機(jī)才能執(zhí)行高級語言編寫的程序.......