資源描述:
《編譯原理實(shí)驗(yàn)三實(shí)驗(yàn)報告》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、實(shí)驗(yàn)報告第1頁專業(yè)____軟件工程________班級____2_____姓名_71李飛強(qiáng)77歐藝欣81吳文浩89張?zhí)蝊_組別:第四組實(shí)驗(yàn)日期:2014年3月26日報告退發(fā)(訂正、重做)課程編譯原理實(shí)驗(yàn)名稱遞歸下降的預(yù)測分析一、實(shí)驗(yàn)?zāi)康?.學(xué)會用語法圖來形式化地描述一門簡單的語言;2.掌握遞歸下降的預(yù)測分析;3.掌握詞法分析。二、實(shí)驗(yàn)環(huán)境VisualStudio或GCC或Eclipse三、實(shí)驗(yàn)內(nèi)容、步驟和結(jié)果分析實(shí)驗(yàn)內(nèi)容:請基于遞歸下降的分析方法(教材P55頁),編寫一個“語法圖.doc”所對應(yīng)語言的語法分析
2、器。該語法分析器能讀入一個源代碼文件(如“test.c”文件所示),并判斷其中的源代碼是否符合“語法圖.doc”的規(guī)定。如果符合,打印出Yes;如果不符合,打印出No。(所用編程語言不限)C語言版:#include#include#include#defineMaxIdLen20//標(biāo)志符的最大長度#defineKeyWordsCount5//該語言擁有的關(guān)鍵字個數(shù)#defineBoolValueCount2//bool類型可能取值的個數(shù)#defineS
3、ymTypeCount17//symType個數(shù)enumSymType//枚舉{OR,//或AND,//與LP,//左括號RP,//右括號ID,//標(biāo)志符ASSIGN,//賦值LB,//左大括號RB,//右大括號COMMA,//逗號SEMICOLON,//分號UNDEFINED,//未定義BOOLVALUE,//bool類型的值IF,//ifELSE,//elseWHILE,//whilePRINTF,//printfBOOL,//bool};enumboolValue{TRUE,F(xiàn)ALSE,};//關(guān)鍵字st
4、aticchar*keywords[KeyWordsCount]={"if","else","while","printf","bool",};//關(guān)鍵字對應(yīng)類別staticintkeyType[KeyWordsCount]={IF,ELSE,WHILE,PRINTF,BOOL,};//staticchar*boolvalue[BoolValueCount]={"true","false",};staticintboolValueType[BoolValueCount]={TRUE,FALSE,};charch
5、='';//當(dāng)前字符charid[MaxIdLen+1];//當(dāng)前符號串inttoken;//當(dāng)前記號(的類型)intvalue;//當(dāng)前記號的值FILE*fp;//用來打開要識別的源代碼文件intlineNum=1;//要識別的代碼行數(shù)boolisPass=false;//判斷識別的代碼是否全部合法voidgetToken();voidprogram();voidprogram();voidstatement();voiddefinition();voidterm();voidfactor();voidexp
6、ression();voidmatch(intt);voidmain(){fopen_s(&fp,"D:\test.c","r");getToken();program();if(isPass)printf("Y");elseprintf("N");fclose(fp);}/****************************************lexical*****************************************/intgetKeyWord(char*str){fo
7、r(inti=0;i8、h){return(ch>='A'&&ch<='Z')
9、
10、(ch>='a'&&ch<='z');}boolisDigit(charch){returnch>='0'&&ch<='9';}voidnextChar(){ch=fgetc(fp);}voidgetToken(){while(ch==''
11、
12、ch=='t'
13、
14、ch=='r'
15、
16、ch==''){if(ch=='')l