編譯原理課程設(shè)計(jì)報(bào)告-詞法語法分析器_第1頁
編譯原理課程設(shè)計(jì)報(bào)告-詞法語法分析器_第2頁
編譯原理課程設(shè)計(jì)報(bào)告-詞法語法分析器_第3頁
編譯原理課程設(shè)計(jì)報(bào)告-詞法語法分析器_第4頁
編譯原理課程設(shè)計(jì)報(bào)告-詞法語法分析器_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理課程設(shè)計(jì)Course Design of Compiling (課程代碼)半期題目: 詞法和語法分析器實(shí)驗(yàn)學(xué)期: 大三第二學(xué)期學(xué)生班級(jí): 2014級(jí)軟件四班學(xué)生學(xué)號(hào): 學(xué)生姓名: 何華均任課教師:丁光耀信息科學(xué)與技術(shù)學(xué)院2017.6課程設(shè)計(jì)1-C語言詞法分析器1.題目C語言詞法分析2.內(nèi)容選一個(gè)能正常運(yùn)行的c語言程序,以該程序出現(xiàn)的字符作為單詞符號(hào)集,不用處理c語言的所有單詞符號(hào)。將解析到的單詞符號(hào)對(duì)應(yīng)的二元組輸出到文件中保存可以將掃描緩沖區(qū)與輸入緩沖區(qū)合成一個(gè)緩沖區(qū),一次性輸入源程序后就可以進(jìn)行預(yù)處理了3.設(shè)計(jì)目的掌握詞法分析算法,設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分

2、析程序,加深對(duì)詞法分析原理的理解4.設(shè)計(jì)環(huán)境(電腦語言環(huán)境)語言環(huán)境:C語言CPU:i7HQ6700內(nèi)存:8G5.概要設(shè)計(jì)(單詞符號(hào)表,狀態(tài)轉(zhuǎn)換圖)5.1 詞法分析器的結(jié)構(gòu)詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構(gòu)成的序列。詞法分析程序可以單獨(dú)為一個(gè)程序;也可以作為整個(gè)編譯程序的一個(gè)子程序,當(dāng)需要一個(gè)單詞時(shí),就調(diào)用此法分析子程序返回一個(gè)單詞.為便于程序?qū)崿F(xiàn),假設(shè)每個(gè)單詞間都有界符或運(yùn)算符或空格隔開,并引入下面的全局變量及子程序:1) ch 存放最新讀進(jìn)的源程序字符2) strToken 存放構(gòu)成單詞符號(hào)的字符串3) Buffer字符緩沖區(qū)4)

3、struct keyType 存放保留字的符號(hào)和種別源程序輸入緩沖區(qū)預(yù)處理子程序掃描緩沖區(qū)1掃描緩沖區(qū)2詞法分析子程序返回一個(gè)單詞調(diào)用數(shù)據(jù)5.2 待分析的簡(jiǎn)單詞法(1)保留字break、case、char、const、int、do、while(2)運(yùn)算符和界符= 、+、 -、 * 、/、%、,、;、(、)、?、#5.3 各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼 單詞符號(hào)種別碼ID0sizeof24INT1static25auto2struct26break3switch27case4typedef28char5union29const6unsigned30continue7void31defau

4、lt8volatile32do9while33double10=34else11+35enum12-36extern 13*37float14/38for15%39goto16,40if17;41int18(42long19)43register20?44return21clear45short22#46signed23lettet(letter|digit)*47dight dight*485.3 狀態(tài)轉(zhuǎn)換圖6.詳細(xì)設(shè)計(jì)(數(shù)據(jù)結(jié)構(gòu),子程序) 算法思想: 首先設(shè)置3個(gè)變量:strToken用來存放構(gòu)成單詞符號(hào)的字符串;ch用來字符;struct keyType用來存放單詞符號(hào)的種別碼。掃描子程

5、序主要部分流程如下圖所示。子程序結(jié)構(gòu):子程序名功能GETCHAR()讀一個(gè)字符到 ch 中GETBC()讀一個(gè)非空白字符到ch 中CONCAT()把CHAR 中字符連接到strToken 之后LETTER()判斷CHAR 中字符是否為字母DIGIT()判斷ch 中字符是否為數(shù)字RESERVE()用strToken中的字符串查找保留字表,并返回保留字種別碼,若返 回零,則非保留字RETRACT()把CHAR 中字符回送到緩沖區(qū)7.程序清單/ ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include "stdafx.h"#include

6、 "stdio.h"#include "stdlib.h"#include "conio.h"#include "string.h"#define N 47char ch;char strToken20;/存放構(gòu)成單詞符號(hào)的字符串char buffer1024;/字符緩沖區(qū)struct keyType char keyname256;int value;KeyN = "$ID",0 , "$INT",1 , "auto",2 , "break&q

7、uot;,3 , "case",4 , "char",5 , "const",6 , "continue",7 , "default",8 , "do",9 , "double",10 , "else",11 , "enum",12 , "extern",13 , "float",14 , "for",15 , "goto",16 , &

8、quot;if",17 , "int",18 , "long",19 , "register",20 , "return",21 , "short",22 , "signed",23 , "sizeof",24 , "static",25 , "struct",26 , "switch",27 , "typedef",28 , "union",29

9、 , "unsigned",30 , "void",31 , "volatile",32 , "while",33 , "=",34 , "+",35 , "-",36 , "*",37 , "/",38 , "%",39 , ",",40 , "",41 , "(",42 , ")",43 , "?&quo

10、t;,44 , "clear",45 , "#",46 ;void GetChar()/讀一個(gè)字符到ch中int i;if (strlen(buffer)>0) ch = buffer0;for (i = 0; i<256; i+)bufferi = bufferi + 1;elsech = '0'void GetBC()/讀一個(gè)非空白字符到ch中int i;while (strlen(buffer) i = 0;ch = bufferi;for (; i<256; i+) bufferi = bufferi + 1;i

11、f (ch != ' '&&ch != 'n'&&ch != '0')break;void ConCat()/把ch連接到strToken之后char temp2;temp0 = ch;temp1 = '0'strcat(strToken, temp);bool Letter()/判斷ch是否為字母if (ch >= 'A'&&ch <= 'Z' | ch >= 'a'&&ch <= 'z

12、')return true;elsereturn false;bool Digit()/判斷ch是否為數(shù)字if (ch >= '0'&&ch <= '9')return true;elsereturn false;int Reserve()/用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字int i;for (i = 0; i<N; i+)if (strcmp(strToken, Keyi.keyname) = 0)return Keyi.value;return 0;void Retra

13、ct()/把ch中的字符回送到緩沖區(qū)int i;if (ch != '0') buffer256 = '0'for (i = 255; i>0; i-)bufferi = bufferi - 1;buffer0 = ch;ch = '0'keyType ReturnWord()strcpy(strToken, "0");int c;keyType tempkey;GetBC();if (ch >= 'A'&&ch <= 'Z' | ch >= 'a

14、'&&ch <= 'z') ConCat();GetChar();while (Letter() | Digit() ConCat();GetChar();Retract();c = Reserve();strcpy(tempkey.keyname, strToken);if (c = 0)tempkey.value = 0;elsetempkey.value = Keyc.value;else if (ch >= '0'&&ch <= '9') ConCat();GetChar();wh

15、ile (Digit() ConCat();GetChar();Retract();strcpy(tempkey.keyname, strToken);tempkey.value = 1;else ConCat();strcpy(tempkey.keyname, strToken);tempkey.value = Reserve();return tempkey;/*主函數(shù)*/int main() /文件操作FILE *fp;if (fp = fopen("E:作業(yè)編譯原理Ccode.txt", "r") = NULL) printf("can

16、not open file/n"); exit(1);while (!feof(fp) if (fgets(buffer, 250, fp) != NULL)printf("E:作業(yè)編譯原理Ccode.txtn"); keyType temp;printf("單詞t種別號(hào)n");while (strlen(buffer) temp = ReturnWord();printf("%st %dnn", temp.keyname, temp.value);printf("the end!n"

17、); getch();return 0;8.運(yùn)行結(jié)果E:/作業(yè)/編譯原理/Code.txt運(yùn)行結(jié)果 九、 實(shí)驗(yàn)體會(huì)通過本次次法分析設(shè)計(jì)實(shí)驗(yàn),我加深了對(duì)詞法分析過程的理解。并在實(shí)際的設(shè)計(jì)過程深入的了解了編譯原理思想。對(duì)編譯原理課程有了更深的理解課程設(shè)計(jì)二:設(shè)計(jì)簡(jiǎn)單的語法分析器一、 題目設(shè)計(jì)簡(jiǎn)單的語法分析器二、 設(shè)計(jì)內(nèi)容用算符優(yōu)先分析方法設(shè)計(jì)一個(gè)分析解釋程序,對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。三、 設(shè)計(jì)目的了解掌握算符優(yōu)先分析的基本方法、內(nèi)容;四、 設(shè)計(jì)環(huán)境語言環(huán)境:C語言CPU:i7HQ6700內(nèi)存:8G五、

18、概要設(shè)計(jì)5.1設(shè)計(jì)思路語法分析的任務(wù): 把單詞符號(hào)作為基本單位,分析程序是否為合法的程序.算符優(yōu)先分析法是自下而上的語法分析方法,即根據(jù)文法,對(duì)輸入字串進(jìn)行歸約,若能正確地歸約為文法的初始符號(hào),則表示輸入字串是合法的.主要研究對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。文法表示: Sv=E|E?|clear EE+T|E-T|T TT*F|T/F|F F (E)|v|c 5.2 單詞種別碼設(shè)計(jì)符號(hào)種別碼=1?2+3-4*5/6(7)8v9c10clear11#12N13六、 詳細(xì)設(shè)計(jì)6.1 變量及函數(shù)說明變量及函數(shù)名表

19、示內(nèi)容及操作int priorityNUMNUM優(yōu)先關(guān)系矩陣struct WordType單詞種別碼結(jié)構(gòu)struct VarWord變量表中的元素結(jié)構(gòu)mainStack歸約棧wordStack單詞串GetwordStack()輸入串轉(zhuǎn)化成單詞串GetWord()從單詞串中取單詞ClearwordStack()、ClearmainStack()清空單詞串和歸約棧CheckvarTable(char a)查看變量在變量表中的位置AddvarTable(VarWord a)變量表添加變量InitmainStack()初始化歸約棧AddmainStack(WordType a)歸約棧添加Handle(

20、)歸約處理程序MainHandle()歸約子程序七、 程序清單 / ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "conio.h"#include "string.h"#define NUM 14#define M 256#define N 47/保留字個(gè)數(shù)char ch = '0'/存放最新讀進(jìn)的源程序字符cha

21、r strToken20 = "0"/存放構(gòu)成單詞符號(hào)的字符串char buffer257 = "0"/字符緩沖區(qū)struct keyType char keyname256;int value;KeyN = "$ID",0 , "$INT",1 , "auto",2 , "break",3 , "case",4 , "char",5 , "const",6 , "continue",7 , &q

22、uot;default",8 , "do",9 , "double",10 , "else",11 , "enum",12 , "extern",13 , "float",14 , "for",15 , "goto",16 , "if",17 , "int",18 , "long",19 , "register",20 , "return

23、",21 , "short",22 , "signed",23 , "sizeof",24 , "static",25 , "struct",26 , "switch",27 , "typedef",28 , "union",29 , "unsigned",30 , "void",31 , "volatile",32 , "while",33 ,

24、"=",34 , "+",35 , "-",36 , "*",37 , "/",38 , "%",39 , ",",40 , "",41 , "(",42 , ")",43 , "?",44 , "clear",45 , "#",46 ;/優(yōu)先關(guān)系矩陣int priorityNUMNUM = 0,0,0,0,0,0,0,0,0,0,0,0

25、,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,1,0 , 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 , 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 , 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0 , 0,0,0,1,1,1,1,0,1,0,0,0,1,0 , 0,0,1,1,1,1,1,0,1,0,0,0,1,0 , 0,0,0

26、,0,0,0,0,0,0,0,0,0,1,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,-1,-1,-1,-1,-1,0,0,0,0,3,0 , 0,0,1,0,0,0,0,0,0,0,0,0,1,0 ;struct VarTable VarWord elemM;int len;varTable;struct OperateStack WordType elemM;/單詞元素int len;OperateStack mainStack;/歸約棧OperateStack wordStack;struct WordType char wordM;int value

27、;wordTypeNUM = "error",0 , "=",1 , "?",2 , "+",3 , "-",4 , "*",5 , "/",6 , "(",7 , ")",8 , "$i",9 , "$c",10 , "clear",11 , "#",12 , "$N",13 ;/* 變量表*/struct VarW

28、ord char varnameM;/變量名char valueM; bool flag;void GetChar()/讀一個(gè)字符到ch中int i;if (strlen(buffer)>0) ch = buffer0;for (i = 0; i<256; i+)bufferi = bufferi + 1;elsech = '0'void GetBC()/讀一個(gè)非空白字符到ch中int i;while (strlen(buffer) i = 0;ch = bufferi;for (; i<256; i+) bufferi = bufferi + 1;if (c

29、h != ' '&&ch != 'n'&&ch != '0')break;void ConCat()/把ch連接到strToken之后char temp2;temp0 = ch;temp1 = '0'strcat(strToken, temp);bool Letter()/判斷ch是否為字母if (ch >= 'A'&&ch <= 'Z' | ch >= 'a'&&ch <= 'z'

30、;)return true;elsereturn false;bool Digit()/判斷ch是否為數(shù)字if (ch >= '0'&&ch <= '9')return true;elsereturn false;int Reserve()/用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字int i;for (i = 0; i<N; i+)if (strcmp(strToken, Keyi.keyname) = 0)return Keyi.value;return 0;void Retract()

31、/把ch中的字符回送到緩沖區(qū)int i;if (ch != '0') buffer256 = '0'for (i = 255; i>0; i-)bufferi = bufferi - 1;buffer0 = ch;ch = '0'keyType ReturnWord()strcpy(strToken, "0");int c;keyType tempkey;GetBC();if (ch >= 'A'&&ch <= 'Z' | ch >= 'a'

32、;&&ch <= 'z') ConCat();GetChar();while (Letter() | Digit() ConCat();GetChar();Retract();c = Reserve();strcpy(tempkey.keyname, strToken);if (c = 0)tempkey.value = 0;elsetempkey.value = Keyc.value;else if (ch >= '0'&&ch <= '9') ConCat();GetChar();while

33、(Digit() ConCat();GetChar();Retract();strcpy(tempkey.keyname, strToken);tempkey.value = 1;else ConCat();strcpy(tempkey.keyname, strToken);tempkey.value = Reserve();return tempkey;bool GetwordStack() int i;wordStack.len = 0;keyType temp;while (strlen(buffer) temp = ReturnWord();/詞法分析器獲得一個(gè)分析詞if (temp.

34、value = 1)/常數(shù)("$c",10)strcpy(wordStack.elemwordStack.len.word, temp.keyname);wordStack.elemwordStack.len.value = 10;else if (temp.value = 0)/變量("$i",9)strcpy(wordStack.elemwordStack.len.word, temp.keyname);wordStack.elemwordStack.len.value = 9;else for (i = 0; i<NUM; i+) if (s

35、trcmp(temp.keyname, wordTypei.word) = 0)/關(guān)鍵字wordStack.elemwordStack.len = wordTypei;break;else if (i = NUM - 1) printf("輸入串中出現(xiàn)未識(shí)別單詞!n");return false;wordStack.len+;wordStack.elemwordStack.len+ = wordType12;return true;/*從單詞串中取單詞*/WordType GetWord() WordType temp = wordStack.elem0;for (int

36、i = 0; i<wordStack.len - 1; i+)wordStack.elemi = wordStack.elemi + 1;wordStack.len-;return temp;void ClearwordStack()/清空單詞串wordStack.len = 0;void ClearmainStack()/清空歸約棧mainStack.len = 0;/*查看變量在變量表中的位置*/int CheckvarTable(char a) for (int i = 0; i<M; i+)if (strcmp(a, varTable.elemi.varname) = 0)

37、return i;else if (i = M - 1)return -1;/*添加變量*/void AddvarTable(VarWord a) varTable.elemvarTable.len = a;varTable.len+;/*初始化歸約棧*/void InitmainStack()mainStack.elem0 = wordType12;mainStack.len = 1;/*添加歸約棧*/void AddmainStack(WordType a)mainStack.elemmainStack.len = a;mainStack.len+;/*歸約*/bool Handle()i

38、nt i;/常量歸約if (mainStack.elemmainStack.len - 1.value = 10) mainStack.elemmainStack.len - 1.value = 13;/變量歸約else if (mainStack.elemmainStack.len - 1.value = 9) mainStack.elemmainStack.len - 1.value = 13;i = CheckvarTable(mainStack.elemmainStack.len - 1.word);if (i<0) printf("n變量 %s 未定義!",

39、 mainStack.elemmainStack.len - 1.word);return false;elsestrcpy(mainStack.elemmainStack.len - 1.word, varTable.elemi.value);/賦值歸約else if (mainStack.elemmainStack.len - 2.value = 1) if (mainStack.elemmainStack.len - 3.value = 9) i = CheckvarTable(mainStack.elemmainStack.len - 3.word);if (i<0) VarWo

40、rd temp;strcpy(temp.varname, mainStack.elemmainStack.len - 3.word);strcpy(temp.value, mainStack.elemmainStack.len - 1.word);temp.flag = true;AddvarTable(temp);elsestrcpy(varTable.elemi.value, mainStack.elemmainStack.len - 1.word);strcpy(mainStack.elemmainStack.len - 3.word, mainStack.elemmainStack.l

41、en - 1.word);mainStack.elemmainStack.len - 3.value = 13;else if (mainStack.elemmainStack.len - 3.value = 13)strcpy(mainStack.elemmainStack.len - 3.word, mainStack.elemmainStack.len - 1.word);mainStack.len = mainStack.len - 2;/運(yùn)算歸約else if (mainStack.elemmainStack.len - 2.value = 3) int a, b;a = atoi(

42、mainStack.elemmainStack.len - 1.word);b = atoi(mainStack.elemmainStack.len - 3.word);a = a + b;itoa(a, mainStack.elemmainStack.len - 3.word, 10);mainStack.len = mainStack.len - 2;else if (mainStack.elemmainStack.len - 2.value = 5) int a, b;a = atoi(mainStack.elemmainStack.len - 1.word);b = atoi(mainStack.elemmainStack.len - 3.word);a = a*b;i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論