編譯原理課程設(shè)計(jì)-For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu) 先法、輸出三地址碼)_第1頁(yè)
編譯原理課程設(shè)計(jì)-For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu) 先法、輸出三地址碼)_第2頁(yè)
編譯原理課程設(shè)計(jì)-For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu) 先法、輸出三地址碼)_第3頁(yè)
編譯原理課程設(shè)計(jì)-For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu) 先法、輸出三地址碼)_第4頁(yè)
編譯原理課程設(shè)計(jì)-For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu) 先法、輸出三地址碼)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.武漢理工大學(xué)編譯原理課內(nèi)實(shí)踐說(shuō)明書(shū)學(xué) 號(hào): 0121410870922課 程 設(shè) 計(jì)課 程編譯原理題 目For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出三地址碼)學(xué) 院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專(zhuān) 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班 級(jí)計(jì)算機(jī)1404姓 名王承禹指導(dǎo)教師林泓2016年12月27日;目錄1 系統(tǒng)描述21.1設(shè)計(jì)目的21.2設(shè)計(jì)內(nèi)容描述22 文法及屬性文法的描述23 語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì)33.1語(yǔ)法分析方法描述33.2分析法操作步驟43.3優(yōu)先關(guān)系矩陣54 中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì)54.1中間代碼形式55 編譯系統(tǒng)的概要設(shè)計(jì)65.1數(shù)據(jù)結(jié)構(gòu)65.2模塊設(shè)計(jì)65.2.1詞法分析

2、模塊75.2.2語(yǔ)法、語(yǔ)義分析模塊75.2.3主控模塊116 詳細(xì)的算法描述116.1詞法分析算法116.2語(yǔ)法分析算法126.3語(yǔ)義分析算法127 軟件的測(cè)試方法和測(cè)試結(jié)果138 本設(shè)計(jì)的評(píng)價(jià)、特點(diǎn)、149 收獲與體會(huì)1410 核心代碼16成績(jī)?cè)u(píng)定表273For語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出三地址碼)1 系統(tǒng)描述1.1設(shè)計(jì)目的 通過(guò)學(xué)習(xí)編譯原理的相關(guān)內(nèi)容,設(shè)計(jì)并編寫(xiě)FOR循環(huán)語(yǔ)句的翻譯程序,使用簡(jiǎn)單優(yōu)先法,按三地址碼輸出,能夠?qū)崿F(xiàn)詞法分析,語(yǔ)法和語(yǔ)義的分析,加深對(duì)所學(xué)知識(shí)的理解,并且能夠熟練運(yùn)用到實(shí)際當(dāng)中。1.2設(shè)計(jì)內(nèi)容描述FOR循環(huán)語(yǔ)句的基本格式如下:FOR i=E step E u

3、ntil E do Stmt根據(jù)所給題目要求,設(shè)計(jì)出符合FOR循環(huán)語(yǔ)句的文法及屬性文法的描述,語(yǔ)法分析方法以及三地址碼的輸出方式,羅列出詞法分析和語(yǔ)法分析的流程,根據(jù)語(yǔ)法規(guī)則設(shè)計(jì)輸入輸出方法,簡(jiǎn)單優(yōu)先法中的優(yōu)先關(guān)系表格。設(shè)計(jì)好并且進(jìn)行編譯,設(shè)計(jì)若干輸入輸出用例(包括正確的輸入和錯(cuò)誤的輸入,用來(lái)檢查程序的完整性)。 2 文法及屬性文法的描述根據(jù)For語(yǔ)句的特點(diǎn),制定的產(chǎn)生式規(guī)則及由產(chǎn)生式對(duì)應(yīng)的語(yǔ)義動(dòng)作如下:F1 -> for i = E1emit(entry(i) , ' = ' , E1.place);F1.place = entry(i);/*保存控制變量在符號(hào)表中的位

4、置*/F1.chain = nextstat;emit('goto'-);/*goto OVER*/F1.codebegin = nextstat;/*保存AGAIN的地址*/F2 -> F1 step E2F2.codebegin = F1.codebegin;F2.place = F1.place;emit(F1.place '=' E2.place '+' F1.place);backatch(F1.chain,nextstat);F3 -> F2 until E3F3.codebegin = F2.codebegin;q =

5、nextstat;emit('if' F2.place, '<=' E3.place, 'goto' q+2);/*若i<=E3 轉(zhuǎn)去執(zhí)行循環(huán)體的第一個(gè)三地址碼*/F3.chain = nextstat;emit('goto'-)/*轉(zhuǎn)離循環(huán)*/S -> F3 do Stmtemit ('goto' F3.codebegin)/*goto AGAIN*/backpatch(Stmt.chain,F3.codebegin);Stmt.chain = F3.chain/*轉(zhuǎn)離循環(huán)的轉(zhuǎn)移目標(biāo)留待外層S時(shí)

6、再回填*/3 語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì)3.1語(yǔ)法分析方法描述本次課內(nèi)實(shí)踐要求使用簡(jiǎn)單優(yōu)先關(guān)系方法。簡(jiǎn)單優(yōu)先分析法的基本思想史對(duì)一個(gè)文法按照一定原則求出該文法所有符號(hào)即包括終結(jié)符和非終結(jié)符之間的優(yōu)先關(guān)系確定歸約過(guò)程中的句柄,它的歸約實(shí)際上是一種規(guī)范歸約。一個(gè)文法是簡(jiǎn)單優(yōu)先文法必須滿(mǎn)足以下條件(1)在文法符號(hào)集V中,任意兩個(gè)符號(hào)之間最多只有一種優(yōu)先關(guān)系成立;(2)在文法中任意兩個(gè)產(chǎn)生式?jīng)]有相同的右部。三種優(yōu)先關(guān)系及其判定方法如下所示:(1)X=Y 表示X和Y的優(yōu)先關(guān)系相等,當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則AXY;(2)X<Y表示X的優(yōu)先性比Y的優(yōu)先性小,當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則 AXB,

7、且BY;(3)X>Y表示X的優(yōu)先性比Y的優(yōu)先性大,當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則 ABD,且BX和DY;(4)對(duì)任何X,若文法開(kāi)始符號(hào)SX,則#<X,若SX則X>#。3.2分析法操作步驟(1)由簡(jiǎn)單優(yōu)先分析法的基本思想設(shè)計(jì)的如下算法,首先要構(gòu)造優(yōu)先關(guān)系矩陣(如3.3所示),并將文法產(chǎn)生式保存,設(shè)置符號(hào)數(shù)組S:(2)將輸入符號(hào)串a(chǎn)1a2an # 依次逐個(gè)保存符號(hào)數(shù)組S中,直到遇到數(shù)組中第一個(gè)符號(hào)ai的優(yōu)先性>下一個(gè)待輸入符號(hào)aj為止。(3)數(shù)組當(dāng)前符號(hào)ai為句柄尾,由此向左在數(shù)組中找句柄的頭符號(hào)ak,即找到ak-1<ak為止。由句柄akai在文法的產(chǎn)生式中查找右部為ak

8、ai的產(chǎn)生式,若找到則用相應(yīng)左部代替句柄,找不到則為出錯(cuò),這是可斷定輸入串不是該文法的句子。重復(fù)(1)(2)(3),直到歸約完輸入符號(hào)串,數(shù)組中只剩文法的開(kāi)始符號(hào)為止。 3.3優(yōu)先關(guān)系矩陣F1F2F3fori=EstepuntildoStmt#F1=F2=F3for=i=E>>>step=until=do<<<<Stmt#圖3.3 優(yōu)先關(guān)系矩陣4 中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì)4.1中間代碼形式三地址碼是由下面一般形式的語(yǔ)句構(gòu)成的序列: x:=y op z其中,xyz為名字、常數(shù)或變量;op代表運(yùn)算符。對(duì)于本程序的具體三地址碼輸出,預(yù)計(jì)顯示

9、結(jié)果如下:給定輸入程序for i=0 step 1 until 10 do j=b+c;三地址碼輸出為<1> i=0<2> goto <5><3> i+<4> if i<10 goto<5> else goto<7><5> j=b+c<6> goto<3><7> end5 編譯系統(tǒng)的概要設(shè)計(jì)5.1數(shù)據(jù)結(jié)構(gòu)單詞種別:struct Token/單詞種別int num;/詞素(單詞的值)string lexeme;產(chǎn)生式結(jié)構(gòu):struct Term/1為狀態(tài),2為

10、產(chǎn)生式int kind;/如果是狀態(tài)保存格子里的內(nèi)容string action;5.2模塊設(shè)計(jì)本系統(tǒng)分為四大模塊:詞法分析模塊、語(yǔ)法分析模塊、語(yǔ)義分析模塊以及主控模塊,其中主控模塊負(fù)責(zé)協(xié)調(diào)前三個(gè)模塊。詞法分析模塊為語(yǔ)法分析模塊以及語(yǔ)義分析模塊提供單詞序列。5.2.1詞法分析模塊void LexicalScanner()/詞法分析FILE *fp;char ch;errno_t _err2 = fopen_s(&fp, "d:123.txt", "rb");if (fp = NULL)/取當(dāng)前目錄下的tk.txt文件的第一個(gè)字符fprintf(st

11、derr, "error opening!n");/格式化輸出到流/錯(cuò)誤打印到屏幕上exit(1);doch = fgetc(fp);if (ch = '$')break;/作為文件結(jié)尾else if (ch = ' ')scanner(fp);/空格略過(guò)elsefseek(fp, -1, 1);scanner(fp);/掃描 while (ch != '$');stringsarrTop = "(1,$)"5.2.2語(yǔ)法、語(yǔ)義分析模塊void Semantic()Token t1;t1.lexeme =

12、"#"t1.num = 100;tokenstokenTop = t1;for (int i = 0;i < 20;i+)cout << tokensi.lexeme << " "cout << endl;string product1 = "fori=E1"string product2 = "F1stepE2"string product3 = "F2untilE3"string product4 = "F3doS1"stack&

13、lt;string> tokenStack;for (int i = 0;i < 15;i+)for (int j = 0;j < 15;j+)priorityTableij = 2;tokenStack.push("#");map_.insert(map<string, int>:value_type("S", 0);map_.insert(map<string, int>:value_type("F1", 1);map_.insert(map<string, int>:valu

14、e_type("F2", 2);map_.insert(map<string, int>:value_type("F3", 3);map_.insert(map<string, int>:value_type("for", 4);map_.insert(map<string, int>:value_type("step", 5);map_.insert(map<string, int>:value_type("until", 6);map_.ins

15、ert(map<string, int>:value_type("do", 7);map_.insert(map<string, int>:value_type("i", 8);map_.insert(map<string, int>:value_type("=", 9);map_.insert(map<string, int>:value_type("E1", 10);map_.insert(map<string, int>:value_type(&qu

16、ot;E2", 11);map_.insert(map<string, int>:value_type("E3", 12);/map_.insert(map<string, int>:value_type("#", 13);map_.insert(map<string, int>:value_type("S1", 13);map_.insert(map<string, int>:value_type("#", 14);priorityTablemap_&qu

17、ot;for"map_"i" = 0;priorityTablemap_"i"map_"=" = 0;priorityTablemap_"="map_"E1" = 0;priorityTablemap_"F1"map_"step" = 0;priorityTablemap_"step"map_"E2" = 0;priorityTablemap_"F2"map_"until&qu

18、ot; = 0;priorityTablemap_"until"map_"E3" = 0;priorityTablemap_"F3"map_"do" = 0;priorityTablemap_"do"map_"S1" = 0;priorityTablemap_"do"map_"F3" = -1;priorityTablemap_"do"map_"F2" = -1;priorityTablemap_

19、"do"map_"F1" = -1;priorityTablemap_"do"map_"for" = -1;priorityTablemap_"#"map_"S" = -1;priorityTablemap_"#"map_"F1" = -1;priorityTablemap_"#"map_"F2" = -1;priorityTablemap_"#"map_"F3&qu

20、ot; = -1;priorityTablemap_"#"map_"for" = -1;priorityTablemap_"E1"map_"step" = 1;priorityTablemap_"E2"map_"until" = 1;priorityTablemap_"E3"map_"do" = 1;priorityTablemap_"S"map_"#" = 1;for (int i = 0;i

21、< 15;i+)for (int j = 0;j < 15;j+)cout << priorityTableij<<" "cout << endl;int i = 0;while (strcmp("#",tokensi.lexeme.c_str()!=0)while (priorityTablemap_tokenStack.top()map_tokensi.lexeme.c_str()<1)tokenStack.push(tokensi.lexeme);/cout << tokenStac

22、k.top() << endl;i+;if (priorityTablemap_tokenStack.top()map_tokensi.lexeme.c_str()=2&&!strcmp(tokensi.lexeme.c_str()," ")cout << "error" << endl;system("pause");/errorelse/cout << "enter" << endl;string tempStr = "&qu

23、ot;string top = tokenStack.top();tempStr = tokenStack.top() + tempStr;tokenStack.pop();while (priorityTablemap_tokenStack.top()map_top=0)top = tokenStack.top();tempStr = top + tempStr;tokenStack.pop();/cout << tempStr << endl;if (priorityTablemap_tokenStack.top()map_top = 2)/errorcout &l

24、t;< "error2" << endl;system("pause");elseif (!strcmp(tempStr.c_str(), product1.c_str()tokenStack.push("F1");cout << "i=E1" << endl;cout << "goto OVER" << endl;if (!strcmp(tempStr.c_str(), product2.c_str()tokenStack.pu

25、sh("F2");cout << "AGAIN:i=i+E2" << endl;if (!strcmp(tempStr.c_str(), product3.c_str()tokenStack.push("F3");cout << "OVER: if i<E3 THEN" << endl;if (!strcmp(tempStr.c_str(), product4.c_str()tokenStack.push("S");cout <<

26、 "begin S1;" << endl <<"goto AGAIN end;" << endl;/cout << tempStr << endl;/tokenStack.push(tokensi.lexeme);/i+;5.2.3主控模塊int main()File.open("d:1233.txt", ios:out);/詞法分析LexicalScanner();/詞法分析完成后會(huì)將Token序列輸出到中間文件/語(yǔ)法分析SyntaxScanner();/語(yǔ)義分析Seman

27、tic();File.close();cout << translation << endl;return 0;6 詳細(xì)的算法描述6.1詞法分析算法6.2語(yǔ)法分析算法6.3語(yǔ)義分析算法語(yǔ)法分析與語(yǔ)義分析同步完成,在規(guī)約的過(guò)程中,每使用一個(gè)產(chǎn)生式則調(diào)用其對(duì)應(yīng)的動(dòng)作7 軟件的測(cè)試方法和測(cè)試結(jié)果編譯調(diào)試環(huán)境:Visual Studio 2015 Community程序語(yǔ)言:C+測(cè)試用例:采用如下形式雙重循環(huán)作為測(cè)試用例之一首先輸出的是詞法分析結(jié)果: 然后是語(yǔ)法以及語(yǔ)義分析結(jié)果: 8 本設(shè)計(jì)的評(píng)價(jià)、特點(diǎn)、本系統(tǒng)可以完成Fortran語(yǔ)言的For語(yǔ)句的語(yǔ)法制導(dǎo)翻譯,在詞法分析的基

28、礎(chǔ)上先后進(jìn)行語(yǔ)法分析和語(yǔ)義分析。在完成這些功能的基礎(chǔ)上,我認(rèn)為此系統(tǒng)仍然不能算一個(gè)合格的產(chǎn)品,還有很多需要改進(jìn)之處。例如,詞法分析可以進(jìn)一步改進(jìn)成為詞法分析器的自動(dòng)生成器。語(yǔ)法分析和語(yǔ)義分析也應(yīng)改為自動(dòng)生成簡(jiǎn)單優(yōu)先文法生成器。特點(diǎn):本系統(tǒng)可以完成Fortran語(yǔ)言的子集(For語(yǔ)句)的制導(dǎo)翻譯,但是沒(méi)有優(yōu)化過(guò)程,符號(hào)表的控制也很簡(jiǎn)單,很多代碼采用了硬編的方法,改變文法將導(dǎo)致巨大的工作量。因此本系統(tǒng)的一大特點(diǎn)是不易擴(kuò)展和變更。9 收獲與體會(huì)經(jīng)過(guò)這次課內(nèi)實(shí)踐,使我更加扎實(shí)的掌握了有關(guān)編譯原理方面的知識(shí),在編寫(xiě)程序的過(guò)程中遇到了許多問(wèn)題,但經(jīng)過(guò)一遍遍的調(diào)試終于使得程序可以順利運(yùn)行。但是程序中存在著很

29、大的不足:程序可擴(kuò)展性差。過(guò)而能改,善莫大焉。在課內(nèi)過(guò)程中,我不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。最終的檢測(cè)調(diào)試環(huán)節(jié),本身就是在踐行“過(guò)而能改,善莫大焉”的知行觀。這次課內(nèi)實(shí)踐終于順利完成了,在設(shè)計(jì)中遇到了很多問(wèn)題,最后終于游逆而解。在今后發(fā)展和學(xué)習(xí)實(shí)踐過(guò)程中,一定要不懈努力,不能遇到問(wèn)題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問(wèn)題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會(huì)及他人對(duì)你的認(rèn)可!回顧這次課內(nèi)實(shí)踐,是一個(gè)痛并快樂(lè)的過(guò)程,在構(gòu)造簡(jiǎn)單優(yōu)先文法的矩陣時(shí)遇到了不少困難,花費(fèi)了許

30、多時(shí)間,但是當(dāng)成功構(gòu)造出來(lái)時(shí)那種喜悅也是難以言表的。學(xué)習(xí)是個(gè)不斷提升自我的過(guò)程。10 核心代碼#include "stdafx.h"#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <string>#include <iostream>#include <sstream>#include <fstream>#include <vector>#includ

31、e <stack>#include <map>using namespace std;/定義圖,字符串與數(shù)字下表對(duì)應(yīng)map <string, int> map_;/定義優(yōu)先級(jí)表 -1為小于,0為等于,1為大于int priorityTable1515;/Token structurestruct Token/單詞種別int num;/詞素(單詞的值)string lexeme;struct Term/1為狀態(tài),2為產(chǎn)生式int kind;/如果是狀態(tài)保存格子里的內(nèi)容string action;class SyntaxScannerpublic:SyntaxS

32、canner();SyntaxScanner();void createTable()/move to Product2DAF Machinebool Scanner()private:stack<Token, vector<Token>> TokenStack;stack<char, vector<char>>ChStack;Term ActionGoto2020;SyntaxScanner:SyntaxScanner()SyntaxScanner:SyntaxScanner()ofstream File;/保存結(jié)果的文件Token token

33、s100;/用數(shù)組代替儲(chǔ)存token序列的中間文件int tokenTop = 0;/指向token序列的尾部char TOKEN30;/定義關(guān)鍵字char *table9 = " ","for","step","until","do","end","then","else","int" ;extern int lookup(char*);extern void out(int, char*);extern void

34、 report_error(void);string strings100;int arrTop = 0;/函數(shù)及全局變量聲明/*extern可置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。另外,extern也可用來(lái)進(jìn)行鏈接指定*/int lookup(char *TOKEN)int m, i;for (i = 1;i<8;i+)if (m = strcmp(TOKEN, tablei) = 0)/table中關(guān)鍵字匹配return i;return 0;/關(guān)鍵字匹配函數(shù),返回關(guān)鍵字在表中的位置,空出空格/輸出token的同

35、時(shí),保存在中間文件中void out(int c, char *TOKEN)cout << "(" << c << "," << TOKEN << ")" << endl;File << "(" << c << "," << TOKEN << ")" << endl;/保存TokentokenstokenTop.num = c;tok

36、enstokenTop.lexeme = TOKEN;/tokenStack.push(tokenstokenTop);tokenTop+;void report_error()printf("error!n");/輸出沒(méi)有考慮的情況void scanner(FILE *fp)char TOKEN30 = '0' ;char ch;int i, c;ch = fgetc(fp);/獲取字符,指針fp并自動(dòng)指向下一個(gè)字符if (isalpha(ch)/判斷該字符是否是字母TOKEN0 = ch;ch = fgetc(fp);i = 1;while (isaln

37、um(ch)/判斷該字符是否是字母或數(shù)字TOKENi = ch;i+;ch = fgetc(fp);TOKENi = '0'fseek(fp, -1, 1);/回退一個(gè)字符c = lookup(TOKEN);if (c = 0)out(9, TOKEN);/輸出標(biāo)識(shí)符號(hào),定編號(hào)為9elseout(c, TOKEN);/輸出表中編號(hào)和關(guān)鍵字else if (isdigit(ch)/判斷是否是數(shù)字TOKEN0 = ch;ch = fgetc(fp);i = 1;while (isdigit(ch)TOKENi = ch;i+;ch = fgetc(fp);/判斷是否是連續(xù)數(shù)字if

38、(ch != '.')TOKENi = '0'fseek(fp, -1, 1);out(10, TOKEN);return;TOKENi = ch;i+;/將小數(shù)點(diǎn)放進(jìn)TOKENfor (;)ch = fgetc(fp);if (!isdigit(ch)out(10, TOKEN);fseek(fp, -1, 1);break;TOKENi = ch;i+;/輸出數(shù)字,定編號(hào)為10elseTOKEN0 = ch;switch (ch)case'':out(11, TOKEN);break;case'':out(12, TOKEN)

39、;break;case',':out(13, TOKEN);break;case'':out(14, TOKEN);break;case'<':ch = fgetc(fp);/讀取下一個(gè)字符,判斷<,<=,<>(空標(biāo)簽)if (ch = '=')TOKEN1 = ch;out(15, TOKEN);/判斷<=else if (ch = '>')TOKEN1 = ch;out(17, TOKEN);/判斷<>空標(biāo)簽elsefseek(fp, -1, 1);out(

40、16, TOKEN);/判斷小于號(hào)<break;case'=':ch = fgetc(fp);if (ch = '=')TOKEN1 = ch;out(19, TOKEN);elsefseek(fp, -1, 1);out(18, TOKEN);break;/判斷=,=case'>':ch = fgetc(fp);/讀取下一個(gè)字符,判斷>,>=if (ch = '=')TOKEN1 = ch;out(21, TOKEN);elsefseek(fp, -1, 1);out(20, TOKEN);break;c

41、ase':':ch = fgetc(fp);/讀取下一個(gè)字符,判斷:,:=,若是關(guān)鍵詞寫(xiě)入case或者?:則必要if (ch = '=')TOKEN1 = ch;out(23, TOKEN);elsefseek(fp, -1, 1);out(22, TOKEN);break;case'+':ch = fgetc(fp);/讀取下一個(gè)字符,判斷+,+=if (ch = '=')TOKEN1 = ch;out(25, TOKEN);elsefseek(fp, -1, 1);out(24, TOKEN);break;case'-

42、':ch = fgetc(fp);/讀取下一個(gè)字符,判斷-,-=if (ch = '=')TOKEN1 = ch;out(27, TOKEN);elsefseek(fp, -1, 1);out(26, TOKEN);break;case'*':ch = fgetc(fp);/讀取下一個(gè)字符,判斷*,*=if (ch = '=')TOKEN1 = ch;out(29, TOKEN);elsefseek(fp, -1, 1);out(28, TOKEN);break;case'/':ch = fgetc(fp);/讀取下一個(gè)字

43、符,判斷/,/=if (ch = '=')TOKEN1 = ch;out(31, TOKEN);elsefseek(fp, -1, 1);out(30, TOKEN);break;case'#':out(32, TOKEN);break;case'(':out(33, TOKEN);break;case')':out(34, TOKEN);break;default:report_error();break;/詞法分析器void LexicalScanner()/詞法分析FILE *fp;char ch;errno_t _err2

44、 = fopen_s(&fp, "d:123.txt", "rb");if (fp = NULL)/取當(dāng)前目錄下的tk.txt文件的第一個(gè)字符fprintf(stderr, "error opening!n");exit(1);doch = fgetc(fp);if (ch = '$')break;/作為文件結(jié)尾else if (ch = ' ')scanner(fp);/空格略過(guò)elsefseek(fp, -1, 1);scanner(fp);/掃描 while (ch != '$&#

45、39;);stringsarrTop = "(1,$)"void SyntaxScanner();/語(yǔ)法分析器void Semantic()Token t1;t1.lexeme = "#"t1.num = 100;tokenstokenTop = t1;for (int i = 0;i < 20;i+)cout << tokensi.lexeme << " "cout << endl;string product1 = "fori=E1"string product2 =

46、"F1stepE2"string product3 = "F2untilE3"string product4 = "F3doS1"stack<string> tokenStack;for (int i = 0;i < 15;i+)for (int j = 0;j < 15;j+)priorityTableij = 2;tokenStack.push("#");map_.insert(map<string, int>:value_type("S", 0);map

47、_.insert(map<string, int>:value_type("F1", 1);map_.insert(map<string, int>:value_type("F2", 2);map_.insert(map<string, int>:value_type("F3", 3);map_.insert(map<string, int>:value_type("for", 4);map_.insert(map<string, int>:value_t

48、ype("step", 5);map_.insert(map<string, int>:value_type("until", 6);map_.insert(map<string, int>:value_type("do", 7);map_.insert(map<string, int>:value_type("i", 8);map_.insert(map<string, int>:value_type("=", 9);map_.insert(ma

49、p<string, int>:value_type("E1", 10);map_.insert(map<string, int>:value_type("E2", 11);map_.insert(map<string, int>:value_type("E3", 12);/map_.insert(map<string, int>:value_type("#", 13);map_.insert(map<string, int>:value_type(&quo

50、t;S1", 13);map_.insert(map<string, int>:value_type("#", 14);priorityTablemap_"for"map_"i" = 0;priorityTablemap_"i"map_"=" = 0;priorityTablemap_"="map_"E1" = 0;priorityTablemap_"F1"map_"step" = 0;prio

51、rityTablemap_"step"map_"E2" = 0;priorityTablemap_"F2"map_"until" = 0;priorityTablemap_"until"map_"E3" = 0;priorityTablemap_"F3"map_"do" = 0;priorityTablemap_"do"map_"S1" = 0;priorityTablemap_"do&

52、quot;map_"F3" = -1;priorityTablemap_"do"map_"F2" = -1;priorityTablemap_"do"map_"F1" = -1;priorityTablemap_"do"map_"for" = -1;priorityTablemap_"#"map_"S" = -1;priorityTablemap_"#"map_"F1" = -

53、1;priorityTablemap_"#"map_"F2" = -1;priorityTablemap_"#"map_"F3" = -1;priorityTablemap_"#"map_"for" = -1;priorityTablemap_"E1"map_"step" = 1;priorityTablemap_"E2"map_"until" = 1;priorityTablemap_"E3"

溫馨提示

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

評(píng)論

0/150

提交評(píng)論