Pascal語言子集詞法分析器

2021-04-13 04:56:02 字數 3810 閱讀 5206

編譯原理課程設計實現

一,概述

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語言小子集的源程式,根據給定的詞法規則,識別單詞,填寫相應的表。如果產生詞法錯誤,則顯示錯誤資訊 位置,並試圖從錯誤中恢復。簡單的恢復方法是忽略該字元 或單詞 重新開始掃瞄。相關詞法規則 識別符號 字母 識別符號 識別符號 字母 識別符號 識別符號 數...