編譯原理課程設計實現
一,概述
1、詞法分析
2、語法分析
3、語義分析
1)實驗教材資訊學院ftp>incoming>教師專用》編譯原理》編譯原理實驗題目
2)其他資料
《程式實現c語言詞法分析器的設計》:http://pro.jxyd.net/a921/zhuye/analy1.cpp
3)lex$yacc使用
二,正文
1,詞法分析器
4月21日,花了幾個小時的時間,把以前有過一定準備的詞法分析器基本完成。
首先介紹詞法分析器的流程(由於我太懶,沒有重新劃,直接copy自老師的課件):
下面簡單介紹一下設計過程算拉:
由於編譯原理課程中對詞法分析的基本原理講得非常清楚(當然,還是有好多值得思考和**的地方哦),甚至都給出了基本的演算法,所以我們要做的只是用某乙個語言把它實現拉。
我的做法是:
1)理清詞法分析的功能
詞法分析器又稱掃瞄器,輸入源程式,進行詞法分析,輸出單詞符號。
這樣我們就弄清楚了詞法分析器的基本功能,該過程的輸入與輸出,接著就是要「如何實現詞法分析」,從相應的輸入獲得相應的輸出。
2)詞法分析器的設計
這個過程基本上是進一步弄清詞法分析器的工作過程,從輸入(預處理)——>單詞符號的識別(超前搜尋)——>畫出狀態轉化圖(實現過程流程化)——>實現狀態轉換圖(演算法實現,子過程劃分等)
3)用某一門具體語言編寫**,演算法程式化
我用的是c語言哦,實現的時候還是蠻方便的。不過由於有好長一段時間沒有用c,好多語法都有些陌生拉。
總結:通過詞法分析器的設計,發現了自己好多問題,比如由於好長時間沒有用c語言進行程式設計,所以導致無法積累這方面的程式設計經驗。另外,由於該實驗兩個禮拜以前就已經布置,但我到現在才麻煩完成,說明我對時間的把握還是比較欠缺的。
/***********==前言*************************=
subjest:pascal語言子集詞法分析器
author:falcon
*****====pascal語言子集要求***************
關鍵字 begin do else end if then var while
-----------------------------------------
分界符 , ; . := ( )
-----------------------------------------
算術運算子
(code,運算子)
10h +
11h -
20h *
21h /
------------------------------------------
關係運算子
(code,運算子)
00h <
01h <=
02h =
03h >
04h >=
05h <>
------------------------------------------
字元種類 code type
關鍵字 指標,0
分界符 指標,1
算術運算子 code,2
關係運算子 code,3
識別符號 指標,4
常數表 指標,5
****************************************===
*//***正文*/
#include
#include
#include// exit 包含的標頭檔案
/*涉及到的字符集*/
char* key[6]=;
/*定義關鍵字*/
char* par[6]=; /*定義分界符*/
typedef struct /*定義運算子結構體*/
ope;
opeariope[4]=,,,},relope[6]=,,,,,};
char mask[200][8],cons[200][8];
/*識別符號和常數陣列,最好是弄成動態分配*/
int maski=-1,consi=-1; /*上述陣列對應的指標*/
/*詞法分析用到的一些變數*/
char strtoken[8],ch,instring[500]; /*字串、字元、檔案緩衝變數*/
int si=0,searchi=0; /*對應的指標*/
int tempi; /*迴圈過程中用到指標*/
/*返回結果形式的結構體*/
typedef struct
retct;
/*各個子過程*/
void getchar() /*取得乙個字元*/
void getbc()
/*取得乙個字元並且為非空*/
void concat()
/*把最近取得的字元(ch)連線到字串(strtoken)*/
int isletter() /*判斷某個字元是否為字母*/
int isdigit() /*判斷某個字元是否為數字*/
int reserve() /*查詢保留字表,返回它的編碼*/
return 0;
}
void retract()
/*回退乙個字元,並且置ch為空*/
int insertid()
/*把strtoken插入識別符號表,返回標識表指標*/
else code=-1;
ret.code=code;
ret.type=type;
return ret;
}/*開啟檔案讀取源***/
void readsource()
cha=fgetc(fp);
while(cha!=eof)
cha=fgetc(fp);
}fclose(fp);
instring[searchi]='#';
/*在源**緩衝區的最後插入乙個標記作為結束標誌*/
searchi=0;
}/*主函式過程*/
int main()
else
printf("%d,%d/n",rettmp.code,rettmp.type);
}while(instring[searchi]!='#');
return 1;
}///
txt 檔案內容:
var a:=0;
do a:=a+1;
while(a<=5);
用C語言寫的Pascal語言詞法分析器
雖然只是個詞法分析器,但是重拾c語言好難!好久沒用過c了。放在這兒勉勵自己做事一定要有始有終 trans.c main,trans include include include include char name char sign int match code 0 char buffer1 25...
詞法分析器 C語言
include include include include include int i,row 0,line 0 char test 1000 test檔案中的字元 int number 100 常數表 char mark 100 5 識別符號表 詞法分析 int wordanalysis in...
詞法分析器(分析C語言)
用c或c 語言編寫乙個簡單的詞法分析程式,掃瞄c語言小子集的源程式,根據給定的詞法規則,識別單詞,填寫相應的表。如果產生詞法錯誤,則顯示錯誤資訊 位置,並試圖從錯誤中恢復。簡單的恢復方法是忽略該字元 或單詞 重新開始掃瞄。相關詞法規則 識別符號 字母 識別符號 識別符號 字母 識別符號 識別符號 數...