![電子科大編譯原理實(shí)驗(yàn)報(bào)告得分70分_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/18/3df069e2-ca36-4154-b95c-078db2db3e92/3df069e2-ca36-4154-b95c-078db2db3e921.gif)
![電子科大編譯原理實(shí)驗(yàn)報(bào)告得分70分_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/18/3df069e2-ca36-4154-b95c-078db2db3e92/3df069e2-ca36-4154-b95c-078db2db3e922.gif)
![電子科大編譯原理實(shí)驗(yàn)報(bào)告得分70分_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/18/3df069e2-ca36-4154-b95c-078db2db3e92/3df069e2-ca36-4154-b95c-078db2db3e923.gif)
![電子科大編譯原理實(shí)驗(yàn)報(bào)告得分70分_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/18/3df069e2-ca36-4154-b95c-078db2db3e92/3df069e2-ca36-4154-b95c-078db2db3e924.gif)
![電子科大編譯原理實(shí)驗(yàn)報(bào)告得分70分_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/18/3df069e2-ca36-4154-b95c-078db2db3e92/3df069e2-ca36-4154-b95c-078db2db3e925.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)專業(yè)類課程實(shí)驗(yàn)報(bào)告課程名稱:編譯原理學(xué)院:計(jì)算機(jī)科學(xué)與工程學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生姓名:郫縣庫(kù)里學(xué)號(hào):指導(dǎo)教師:日期: 2017年 5月 14日電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告實(shí)驗(yàn)一1、 實(shí)驗(yàn)名稱:詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)2、 實(shí)驗(yàn)學(xué)時(shí):43、 實(shí)驗(yàn)內(nèi)容和目的:(一)實(shí)驗(yàn)內(nèi)容:1.源語(yǔ)言:求n!的極小語(yǔ)言2.輸入輸出:源程序*.pas文件作為輸入,經(jīng)過自己編程實(shí)現(xiàn)的詞法分析器進(jìn)行處理,生成二元式,保存到*.dyd文件中,如下圖所示。(二)實(shí)驗(yàn)?zāi)康模和ㄟ^設(shè)計(jì)詞法分析器的實(shí)驗(yàn),使同學(xué)們了解和掌握詞法分析程序設(shè)計(jì)的原理及相應(yīng)的程序設(shè)計(jì)方法,同時(shí)提高編程能力。4、 實(shí)驗(yàn)原理:(一)
2、結(jié)合“數(shù)據(jù)結(jié)構(gòu)”進(jìn)行分析:1. 二元式文件*.dyd(1) 二元式形式:分析:由輸出二元式形式可知,使用printf輸出可以很方便達(dá)到要求:(2) 每行后加一分析:對(duì)輸入文件中的換行符“n”,要采取相應(yīng)的策略:(3) 文件結(jié)尾加分析:對(duì)于文件末尾的“EOF”,要采取相應(yīng)的策略:2. 錯(cuò)誤信息文件:*.err(1) 錯(cuò)誤信息格式分析:設(shè)置出錯(cuò)處理的函數(shù),并且需要記錄錯(cuò)誤行號(hào)、錯(cuò)誤性質(zhì):(2) 注意:進(jìn)入每一階段, 首先打開*.err, 如果無(wú)錯(cuò)誤, 則*.err為空。(二) 詞法分析的實(shí)現(xiàn)方法利用狀態(tài)轉(zhuǎn)換分析:根據(jù)狀態(tài)轉(zhuǎn)化圖,編寫讀到不同的內(nèi)容時(shí)的狀態(tài)轉(zhuǎn)化函數(shù),是設(shè)計(jì)詞法分析器的核心。(三) 對(duì)
3、“輸入輸出”文件的分析文件相關(guān)操作因?yàn)樾枰x寫文件,并生成錯(cuò)誤文件,涉及許多文件相關(guān)操作,通過相關(guān)函數(shù)函數(shù)實(shí)現(xiàn)功能:5、 實(shí)驗(yàn)器材(設(shè)備、元器件)(一) 操作系統(tǒng):Windows 8 Professional (二) 開發(fā)工具:Visual Studio 2015(三) 編程語(yǔ)言:C6、 實(shí)驗(yàn)步驟:(一) 啟動(dòng)Visual Studio 2015,新建一個(gè)項(xiàng)目LxicalAnalyzer(二) 編寫LxicalAnalyzer.h文件,聲明項(xiàng)目將要用到的自定義函數(shù):(三) 編寫LxicalAnalyzer.cpp文件,根據(jù)“狀態(tài)轉(zhuǎn)化圖”、“單詞符號(hào)與種別對(duì)照表”實(shí)現(xiàn)LxicalAnalyzer
4、.h中聲明的函數(shù)(詳細(xì)代碼附在實(shí)驗(yàn)報(bào)告最后);(四) 編寫main.cpp文件,完成編碼;(五) 根據(jù)給出的測(cè)試程序,編寫輸入文件test.pas(六) 運(yùn)行寫好的詞法分析器程序,并結(jié)合輸出文件test.err、test.dyd進(jìn)行調(diào)試;(七) 完成實(shí)驗(yàn)。7、 實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析:(一) 輸入文件test.pas(二) 執(zhí)行詞法分析器程序(三) 檢查輸出文件test.err因?yàn)檩斎胛募袦y(cè)試程序沒有錯(cuò)誤,所以文件為空:(四) 檢查輸出文件test.dyd檢查可知,輸出文件內(nèi)容為符合實(shí)驗(yàn)要求的二元式: (五) 修改輸入文件,在輸入文件中添加錯(cuò)誤(六) 再次執(zhí)行詞法分析器程序(七) 重新檢查輸出文
5、件test.err可見,本詞法分析器成功實(shí)現(xiàn)檢查多處詞法錯(cuò)誤:8、 實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:(一) 實(shí)驗(yàn)結(jié)論通過編碼與反復(fù)調(diào)試,成功完成了詞法分析器的設(shè)計(jì)與實(shí)現(xiàn),能夠?qū)o出文法的測(cè)試程序進(jìn)行正確的詞法分析,按要求輸出二元式的*.dyd文件。同時(shí),也可以檢測(cè)出所給源程序中的多處詞法錯(cuò)誤。(二) 心得體會(huì)1. 對(duì)于這種需要多次重復(fù)同一操作的實(shí)驗(yàn),將相應(yīng)的操作寫成函數(shù),可以方便編碼,減少錯(cuò)誤和代碼行數(shù)。2. 第一次編碼忽略了狀態(tài)轉(zhuǎn)化之后的回退工作,導(dǎo)致bug的出現(xiàn),以后需要吸取經(jīng)驗(yàn)教訓(xùn)。3. 盡量在第一次編寫程序時(shí),寫出較多的提示信息和注釋,便于發(fā)現(xiàn)bug后的調(diào)試。(三) 改進(jìn)建議上課使用的教
6、材P134頁(yè)“第六章 詞法分析”中的內(nèi)容對(duì)本實(shí)驗(yàn)的完成有很大幫助,認(rèn)真閱讀后思路更加清晰。*為便于老師評(píng)閱報(bào)告,兩次實(shí)驗(yàn)代碼都添加底紋后放在在文檔最后部分*電 子 科 技 大 學(xué)實(shí) 驗(yàn) 報(bào) 告實(shí)驗(yàn)二1、 實(shí)驗(yàn)名稱:遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn)2、 實(shí)驗(yàn)學(xué)時(shí):43、 實(shí)驗(yàn)內(nèi)容和目的:(一)實(shí)驗(yàn)內(nèi)容:根據(jù)給定的方法,編寫相應(yīng)的遞歸下降的語(yǔ)法分析程序,實(shí)現(xiàn)對(duì)詞法分析后的單詞序列的語(yǔ)法檢查和程序結(jié)構(gòu)的分析,生成相應(yīng)的變量名表和過程名表,并將編譯中語(yǔ)法檢查出來(lái)的錯(cuò)誤寫入相應(yīng)的文件。語(yǔ)法錯(cuò)分類:(1)缺少符號(hào)錯(cuò);(2)符號(hào)匹配錯(cuò);(3)符號(hào)無(wú)定義或重復(fù)定義。(二)實(shí)驗(yàn)?zāi)康模和ㄟ^設(shè)計(jì)遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn)
7、實(shí)驗(yàn),使同學(xué)們掌握自上而下的遞歸分析法的語(yǔ)法分析原理和程序設(shè)計(jì)方法。4、 實(shí)驗(yàn)原理:(一)語(yǔ)法分析的定義和功能語(yǔ)法分析是根據(jù)語(yǔ)法規(guī)則,將單詞符號(hào)構(gòu)成各類語(yǔ)法單位,并進(jìn)行語(yǔ)法檢查。在本實(shí)驗(yàn)中,對(duì)源程序經(jīng)過詞法分析后轉(zhuǎn)換成的單詞流按方法規(guī)則進(jìn)行判斷,對(duì)能構(gòu)成正確句子的單詞流,給出相應(yīng)的語(yǔ)法樹;對(duì)不能構(gòu)成正確句子的單詞流判斷其語(yǔ)法錯(cuò)誤并做出相應(yīng)處理。(二)語(yǔ)法分析的方法語(yǔ)法分析方法有自上而下和自下而上的分析方法。(1)自上而下語(yǔ)法分析法:或從開始符號(hào)出發(fā),找最左推導(dǎo);或從根開始,構(gòu)造推導(dǎo)樹。(2)自下而上語(yǔ)法分析法:從輸入串開始,歸約,直至文法開始符。本實(shí)驗(yàn)中,我們采用自上而下的遞歸下降分析法,在不
8、含左遞歸的文法G中,如果對(duì)每一個(gè)非終結(jié)符的所有候選式的第一個(gè)終結(jié)符都是兩兩不相交的(即無(wú)公共左因子),則可能構(gòu)造出一個(gè)不帶回溯的自上而下的分析程序,這個(gè)分析程序由一組遞歸過程組成,每個(gè)過程對(duì)應(yīng)文法的一個(gè)非終結(jié)符。這樣的分析程序稱為遞歸下降分析程序。(三)數(shù)據(jù)結(jié)構(gòu)1.*.dys同*.dyd2.變量名表·變量名vname: char(16)·所屬過程vproc:char(16)·分類vkind: 0.1(0變量、1形參)·變量類型vtype: types·變量層次vlev: int·變量在變量表中的位置vadr: int(相對(duì)第一個(gè)變量而
9、言)3.過程名表·過程名pname: char(16)·過程類型ptype: types·過程層次plev: int·第一個(gè)變量在變量表中的位置fadr: int·最后一個(gè)變量在變量表中的位置ladr: int4.四元式表 (oprd, op1, op2, result)·oprd整數(shù)碼·op1第一操作數(shù)·op2第二操作數(shù)·result結(jié)果·op1、op2、result可用“值/地址”表示5.目標(biāo)代碼P碼 (四)給定文法產(chǎn)生式實(shí)驗(yàn)中給定文法如下:<程序><分程序><
10、分程序>begin <說(shuō)明語(yǔ)句表>;<執(zhí)行語(yǔ)句表> end<說(shuō)明語(yǔ)句表><說(shuō)明語(yǔ)句><說(shuō)明語(yǔ)句表> ;<說(shuō)明語(yǔ)句><說(shuō)明語(yǔ)句><變量說(shuō)明><函數(shù)說(shuō)明><變量說(shuō)明>integer <變量><變量><標(biāo)識(shí)符><標(biāo)識(shí)符><字母><標(biāo)識(shí)符><字母> <標(biāo)識(shí)符><數(shù)字><字母>abcdefghijklmno pq rstuvwxyz<數(shù)字>01234
11、56789<函數(shù)說(shuō)明>integer function <標(biāo)識(shí)符>(<參數(shù)>);<函數(shù)體><參數(shù)><變量><函數(shù)體>begin <說(shuō)明語(yǔ)句表>;<執(zhí)行語(yǔ)句表> end<執(zhí)行語(yǔ)句表><執(zhí)行語(yǔ)句><執(zhí)行語(yǔ)句表>;<執(zhí)行語(yǔ)句><執(zhí)行語(yǔ)句><讀語(yǔ)句><寫語(yǔ)句><賦值語(yǔ)句><條件語(yǔ)句><讀語(yǔ)句>read(<變量>)<寫語(yǔ)句>write(<變量>
12、)<賦值語(yǔ)句><變量>:=<算術(shù)表達(dá)式><算術(shù)表達(dá)式><算術(shù)表達(dá)式>-<項(xiàng)><項(xiàng)><項(xiàng)><項(xiàng)>*<因子><因子><因子><變量><常數(shù)><函數(shù)調(diào)用><常數(shù)><無(wú)符號(hào)整數(shù)><無(wú)符號(hào)整數(shù)><數(shù)字><無(wú)符號(hào)整數(shù)><數(shù)字><條件語(yǔ)句>if<條件表達(dá)式>then<執(zhí)行語(yǔ)句>else <執(zhí)行語(yǔ)句><條件表
13、達(dá)式><算術(shù)表達(dá)式><關(guān)系運(yùn)算符><算術(shù)表達(dá)式><關(guān)系運(yùn)算符> <<=>>=<>5、 實(shí)驗(yàn)器材(設(shè)備、元器件)(一)操作系統(tǒng):Windows 8 Professional (二)開發(fā)工具:Visual Studio 2015(三)編程語(yǔ)言:C6、 實(shí)驗(yàn)步驟:(一) 啟動(dòng)Visual Studio 2015,新建一個(gè)項(xiàng)目GrammerAnalyzer;(二) 消除文法中的左遞歸;(三)編寫GrammerAnalyzer.h文件,定義將要用到的結(jié)構(gòu),并聲明項(xiàng)目將要用到的自定義函數(shù):(四)編寫GrammerAn
14、alyzer.cpp文件,根據(jù)“文法產(chǎn)生式”實(shí)現(xiàn)LxicalAnalyzer.h中聲明的函數(shù)和具體的遞歸下降分析法(詳細(xì)代碼附在實(shí)驗(yàn)報(bào)告最后);(五)編寫main.cpp文件,完成編碼;(五)將詞法分析器的輸出文件test.dyd作為實(shí)現(xiàn)的語(yǔ)法分析器的輸入文件: (六)運(yùn)行寫好的詞法分析器程序,并結(jié)合輸出文件test.dys、變量名表文件test.var、過程名表文件、錯(cuò)誤文件等進(jìn)行調(diào)試;(七)完成實(shí)驗(yàn)。7、 實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析:(一)輸入文件test.dyd,內(nèi)容為2元式子 (二)執(zhí)行詞法分析器程序(三)檢查輸出文件test.dys,與輸入文件相同,正確: (四)檢查變量名表
15、文件test.var,符合要求:(五)檢查過程名表文件,符合要求:(六)檢查過程名表文件test.err,基本符合要求:8、 實(shí)驗(yàn)結(jié)論、心得體會(huì)和改進(jìn)建議:(一)實(shí)驗(yàn)結(jié)論:本實(shí)驗(yàn)程序較好地完成了遞歸下降分析器的設(shè)計(jì)與實(shí)現(xiàn),能夠?qū)λo文法的程序進(jìn)行語(yǔ)法分析,生成變量名表和過程名表,如果源程序有語(yǔ)法錯(cuò)誤則給出出錯(cuò)類型及所在行數(shù)。(二)心得體會(huì):1.標(biāo)識(shí)符中不能包含關(guān)鍵字,以免出錯(cuò);2.要注意文法中公共左因子的消除;3.思路要清晰,加一些提示信息,避免出現(xiàn)邏輯錯(cuò)誤;4.由于對(duì)Pascal語(yǔ)言語(yǔ)法細(xì)節(jié)不是特別熟悉,所以對(duì)錯(cuò)誤的識(shí)別不一定準(zhǔn)確,還有改正和提高的空間,期末考試過后有時(shí)間,可
16、以做進(jìn)一步的完善。(三)改進(jìn)建議:可以改成對(duì)C語(yǔ)言等我們經(jīng)常接觸到的語(yǔ)言作為本次實(shí)驗(yàn)的源語(yǔ)言,實(shí)驗(yàn)做起來(lái)可能會(huì)更有趣。*以下為實(shí)驗(yàn)一源代碼,共三個(gè)文件*(一) LexicalAnalyzer.h#pragma once#ifndef LEXICALANALYZER_H#define LEXICALANALYZER_Hchar getNextC(); /獲取下一個(gè)字符bool lexAnalyzer(); /用于詞法分析的函數(shù)bool isLetter(char ch); /判斷ch是否為字母bool isDigit(char ch); /判斷ch是否為數(shù)字void retract(char&a
17、mp; ch); /回退字符int reserve(char* token); /返回保留字對(duì)應(yīng)種別int symbol(); /返回標(biāo)識(shí)符的對(duì)應(yīng)種別int constant(); /返回常數(shù)的對(duì)應(yīng)種別void output_token(const char* token, int kindNum); /按要求格式輸出單詞符號(hào)和種別bool printError(int lineNum, int errNum); /按要求打印錯(cuò)誤提醒void getPath(char* in, char* out); /獲得路徑void getFilename(char* in, char*out); /獲得
18、文件名bool init(int argc, char* argv); /初始化函數(shù)#endif / ! LEXICALANALYZER_H(二) LexicalAnalyzer.cpp#include "LexicalAnalyzer.h"#include <string>#define MAX_COUNT 1024#define ILLEGAL_CHAR_ERROR 1#define UNKNOWN_OPERATOR_ERROR 2FILE *file;bool lexAnalyzer() /用于詞法分析的函數(shù) if (feof(file) return f
19、alse; static int lineNum = 1; char ch; char token17 = "" ch = getNextC(); switch (ch) case 'r': case 'n': /每行后加一ÈEOLNÈ24 output_token("EOLN", 24); lineNum+; break; case EOF: /結(jié)尾加 EOFÈ25 output_token("EOF", 25); return false; case 'a
20、9;: case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case
21、9;r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': ca
22、se 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y
23、9;: case 'Z': while (isLetter(ch)|isDigit(ch) ) char s2 = ch ; strcat(token, s); ch = getchar(); retract(ch); int num; num = reserve(token); if (num != 0) output_token(token, num); else int val; val = symbol(); /標(biāo)識(shí)符 output_token(token, val); break; case '0': case '1': case
24、39;2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while (isDigit(ch) char s2 = ch ; strcat(token, s); ch = getchar(); retract(ch); int val; val = constant(); output_token(token, val); break; case '=': outp
25、ut_token("=", 12); break; case '<': ch = getchar(); if (ch = '>') output_token("<>", 13); else if (ch = '=') output_token("<=", 14); else retract(ch); output_token("<", 15); break; case '>': ch = getchar();
26、if (ch = '=') output_token(">=", 16); else retract(ch); output_token(">", 17); break; case '-': output_token("-", 18); break; case '*': output_token("*", 19); break; case ':': ch = getchar(); if (ch = '=') output_t
27、oken(":=", 20); else printError(lineNum, 2); /輸出“未知運(yùn)算符”錯(cuò)誤 break; case '(': output_token("(", 21); break; case ')': output_token(")", 22); break; case '': output_token("", 23); break; default: printError(lineNum, 1); /輸出"出現(xiàn)字母表以外的非法字
28、符"錯(cuò)誤 return true;bool isLetter(char ch) /判斷ch是否為字母 if (ch >= 'a'&&ch <= 'z') | (ch >= 'A' && ch <= 'Z') return true; else return false;bool isDigit(char ch) /判斷ch是否為數(shù)字 if (ch >= '0')&& (ch <= '9') return t
29、rue; else return false;void retract(char& ch) /回退字符 ungetc(ch, stdin); ch = NULL;int reserve(char* token) /返回保留字對(duì)應(yīng)種別 if (strcmp(token, "begin") = 0) return 1; else if (strcmp(token, "end") = 0) return 2; else if (strcmp(token, "integer") = 0) return 3; else if (strc
30、mp(token, "if") = 0) return 4; else if (strcmp(token, "then") = 0) return 5; else if (strcmp(token, "else") = 0) return 6; else if (strcmp(token, "function") = 0) return 7; else if (strcmp(token, "read") = 0) return 8; else if (strcmp(token, "wr
31、ite") = 0) return 9; else return 0;int symbol() /返回標(biāo)識(shí)符對(duì)應(yīng)種別 return 10;int constant() /返回保常數(shù)對(duì)應(yīng)種別 return 11;void output_token(const char* token, int kindNum) /按要求輸出二元式 printf("%16s %2dn", token, kindNum);bool printError(int lineNum, int errNum) /按要求輸出錯(cuò)誤 char * errInfo; switch (errNum) ca
32、se ILLEGAL_CHAR_ERROR: errInfo = "出現(xiàn)字母表以外的非法字符" break; case UNKNOWN_OPERATOR_ERROR: errInfo = "出現(xiàn)未知運(yùn)算符(“:”后無(wú)“=”)" break; default: errInfo = "未知錯(cuò)誤" if (fprintf(stderr, "*LINE:%d %sn", lineNum, errInfo) >= 0) return true; else return false;char getNextC() /獲取
33、下一個(gè)字符 char ch; ch = getchar(); while (true) if (ch = 'r' | ch = 't' | ch = ' ') / ch = getchar(); else break; return ch; void getPath(char* in, char* out) /獲得路徑 char* name; name = strrchr(in, ''); if (name != NULL) strncpy(out, in, strlen(in) - strlen(name) + 1); else
34、 strcpy(out, "");void getFilename(char* in, char* out) /獲得文件名 char* fullName; char* extension; fullName = strrchr(in, ''); extension = strrchr(in, '.'); if (fullName != NULL) strncpy(out, fullName + 1, strlen(fullName) - 1 - strlen(extension); else strncpy(out, in, strlen(i
35、n) - strlen(extension);bool init(int argc, char* argv) /初始化函數(shù) if (0) return false; else char* inFilename = "test.pas" char outFilenameMAX_COUNT = "" char errFilenameMAX_COUNT = "" char filenameMAX_COUNT = "" char pathMAX_COUNT = "" /獲得文件名(不包括擴(kuò)展名)和路徑
36、getFilename(inFilename, filename); getPath(inFilename, path); /生成輸出文件全部路徑 strcat(outFilename, path); strcat(outFilename, filename); strcat(outFilename, ".dyd"); /生成錯(cuò)誤文件全部路徑 strcat(errFilename, path); strcat(errFilename, filename); strcat(errFilename, ".err"); if (file = freopen(i
37、nFilename, "r", stdin)= NULL) printf("文件打開錯(cuò)誤"); return false; if (file = freopen(outFilename, "w", stdout) = NULL) printf("緩存區(qū)寫入錯(cuò)誤"); return false; if (file = freopen(errFilename, "w", stderr) = NULL) printf("錯(cuò)誤區(qū)寫入錯(cuò)誤"); return false; return
38、 true; (三) main.cpp#include "LexicalAnalyzer.h"#include <stdio.h>int main(int argc, char* argv) if (init(argc, argv) while (lexAnalyzer(); fclose(stdin); fclose(stdout); fclose(stderr); return 0;*以下為實(shí)驗(yàn)二源代碼,共三個(gè)文件*(一)GrammerAnalyzer.h#pragma once#ifndef GRAMMERANALYZER_H#define GRAMMER
39、ANALYZER_Htypedef enum integer types; /types是支持類型的集合typedef struct /記錄變量信息的結(jié)構(gòu)體 char vname17; char vproc17; bool vkind; types vtype; int vlev; int vadr; varRecord;typedef struct /記錄過程信息的結(jié)構(gòu)體 char pname17; types ptype; int plev; int varNum; int fadr; int ladr; int parameter; bool parameterIsDefined; pr
40、oRecord;void A(); /A:程序 A->Bvoid B(); /B:分程序 B->begin C;M endvoid C(); /C:說(shuō)明與句表 C->DC'void C_(); /C_:DC'|void D(); /D:說(shuō)明語(yǔ)句 D->E|Jvoid E(); /E:變量說(shuō)明 E->integer Fvoid F(); /F:變量 F->Gvoid G(); /G:標(biāo)識(shí)符 G->HG' G'->HG'|IG'|void J(); /J:函數(shù)說(shuō)明 J->integer funct
41、ion G(K);Lvoid K(); /K:參數(shù) K->Fvoid L(); /L:函數(shù)體 L->begin C;M endvoid M(); /M:執(zhí)行語(yǔ)句表 M->NM'void M_(); /M'->NM'|void N(); /N:執(zhí)行語(yǔ)句 N->O|P|Q|Wvoid O(); /O:讀語(yǔ)句 O->read(F)void P(); /P:寫語(yǔ)句 P->write(F)void Q(); /Q:賦值語(yǔ)句 Q->F:=Rvoid R(); /R:算術(shù)表達(dá)式 R->SR'void R_(); /R
42、9;->-SR'|void S(); /S:項(xiàng) S->TS'void S_(); /S'->*TS'|void T(); /T:因子 T->F|U|Zvoid U(); /U:常數(shù) U->Vvoid W(); /W:條件語(yǔ)句 W->if X then N else Nvoid X(); /X:條件表達(dá)式 X->RYRvoid Y(); /Y:關(guān)系運(yùn)算符 Y-><|<=|>|>=|=|<>void Z(); /Z:函數(shù)調(diào)用 Z->G(R)bool init(int argc,
43、 char* argv);/初始化函數(shù):從輸入文件讀取數(shù)據(jù),建立各個(gè)文件,初始化全局變量bool final(); /結(jié)束處理函數(shù),將var和pro數(shù)組中的元素輸出到相應(yīng)文件,填充輸出文件bool error(int lineNum, int errNum, const char* sign); /錯(cuò)誤處理函數(shù),參數(shù)分別為行號(hào)、錯(cuò)誤碼和錯(cuò)誤符號(hào)void getPath(char* in, char* out); /獲得所處目錄路徑,包括最后斜杠,或者為空void getFilename(char* in, char* out); /獲得文件名,不包括擴(kuò)展bool nextToken(); /獲
44、得下一符號(hào),true表示已到隊(duì)尾,false表示還未到隊(duì)尾bool nextChar(); /獲得當(dāng)前符號(hào)的下一字符,true表示已到'0'bool isVarExisted(char* vname, char* vproc, bool vkind); /判斷變量是否已存在bool isProExisted(char* vname); /判斷過程是否已存在,參數(shù)為過程名int getNextToken(); /獲得下一符號(hào),指針不變#endif / !GRAMMERANALYZER_H(二)GrammerAnalyzer.cpp#include "GrammerAna
45、lyzer.h"#include <stdio.h>#include <string.h>#include <Windows.h>#define MAX_COUNT 1024#define SIGN_UNDEFINED_ERR 1#define SIGN_REDEFINED_ERR 2#define SIGN_EXECUTE_ERR 3#define NO_SIGN_ERR 4#define SIGN_RESERVE_ERR 5#define NO_PARA_ERR 6char inputMAX_COUNT17;/存放輸入文件所有符號(hào)的數(shù)組int
46、kindMAX_COUNT;int inputCount;/輸入符號(hào)的數(shù)量int pToken;/指向當(dāng)前輸入符號(hào)int pChar;/指向當(dāng)前輸入符號(hào)中的當(dāng)前字符varRecord currentVar;/存放當(dāng)前變量的信息proRecord currentPro;/存放當(dāng)前過程的信息int lineNum;/當(dāng)前行號(hào)varRecord varMAX_COUNT;/存放變量名表項(xiàng)數(shù)組proRecord proMAX_COUNT;/存放過程名表項(xiàng)數(shù)組int varCount;/變量的數(shù)量int proCount;/過程的數(shù)量FILE* inFile;/輸入文件句柄FILE* outFile;/
47、輸出文件句柄FILE* errFile;/錯(cuò)誤文件句柄FILE* varFile;/變量文件句柄FILE* proFile;/過程文件句柄bool init(int argc, char* argv) if (0) return false; else char* inFilename ="test.dyd"/argv1 char outFilenameMAX_COUNT = "" char errFilenameMAX_COUNT = "" char varFilenameMAX_COUNT = "" char
48、proFilenameMAX_COUNT = "" char filenameMAX_COUNT = "" char pathMAX_COUNT = "" /獲得文件名(不包括擴(kuò)展名)和路徑 getFilename(inFilename, filename); getPath(inFilename, path); /生成輸出文件全部路徑 strcat(outFilename, path); /strcat(outFilename, ""); strcat(outFilename, filename); strcat
49、(outFilename, ".dys"); /生成錯(cuò)誤文件全部路徑 strcat(errFilename, path); /strcat(errFilename, ""); strcat(errFilename, filename); strcat(errFilename, ".err"); /生成變量文件全部路徑 strcat(varFilename, path); /strcat(varFilename, ""); strcat(varFilename, filename); strcat(varFilena
50、me, ".var"); /生成過程文件全部路徑 strcat(proFilename, path); /strcat(proFilename, ""); strcat(proFilename, filename); strcat(proFilename, ".pro"); /打開文件句柄 if (inFile = fopen(inFilename, "r") && (outFile = fopen(outFilename, "w") && (errFile = fopen(errFilename, "w") && (varFile = fopen(varFilename, "w") && (proFile = fopen(proFilename, "w") /初始化單詞指針、字符指針、
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 會(huì)博通 文件檔案知識(shí)一體化管理的引領(lǐng)者(單用戶版)
- 廣東省佛山市普通高中高三教學(xué)質(zhì)量檢測(cè)(一)語(yǔ)文試題(含答案)
- 專題06《最動(dòng)聽的聲音》《把奮斗寫進(jìn)明天》《成功的鑰匙》《青年之擔(dān)當(dāng)》
- 購(gòu)書買賣合同
- 產(chǎn)品代銷合同范本
- 幼兒園重陽(yáng)節(jié)主題活動(dòng)策劃方案五篇
- 包裝材料購(gòu)銷合同范本
- 2024年世界旅游產(chǎn)業(yè)發(fā)展投資合同
- 海參海鮮采購(gòu)合同
- 西安二手車買賣合同
- 電力溝施工組織設(shè)計(jì)-電纜溝
- 《法律援助》課件
- 《高處作業(yè)安全》課件
- 鍋爐本體安裝單位工程驗(yàn)收表格
- 一種基于STM32的智能門鎖系統(tǒng)的設(shè)計(jì)-畢業(yè)論文
- 妊娠合并強(qiáng)直性脊柱炎的護(hù)理查房
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 兒童10歲生日-百日宴-滿月酒生日會(huì)成長(zhǎng)相冊(cè)展示(共二篇)
- 《繪本閱讀與指導(dǎo)》課程教學(xué)大綱
- 員工離職登記表(范本模板)
- 2023人教版(PEP)小學(xué)英語(yǔ)(三、四、五、六年級(jí))詞匯及常用表達(dá)法(課本同步)
評(píng)論
0/150
提交評(píng)論