實驗一 簡單詞法分析程式設計

2021-06-13 21:09:41 字數 3338 閱讀 9311

實驗一  簡單詞法分析程式設計

一、實驗目的

了解詞法分析程式的基本構造原理,掌握詞法分析程式的手工構造方法。

二、實驗內容

1、了解編譯程式的詞法分析過程。2、

根據pascal語言的說明語句形式,用手工方法構造乙個對說明語句進行詞法分析的程式。該程式能對從鍵盤輸入或從檔案讀入的形如:

「const count=10,sum=81.5,char1=』f』,string1=」hj」, max=169;」

的常量說明串進行處理,分析常量說明串中各常量名、常量型別及常量值,並統計各種型別常量個數。

三、實驗要求

1、輸入的

常量說明串,要求最後以分號作結束標誌; 2

、根據輸入串或讀入的文字檔案中第乙個單詞是否為「const」判斷輸入串或文字檔案是否為常量說明內容;

3、識別輸入串或開啟的文字檔案中的常量名。常量名必須是識別符號,定義為字母開頭,後跟若干個字母,數字或下劃線;

4、根據各常量名緊跟等號「=」後面的內容判斷常量的型別。其中:字元型常量定義為放在單引號內的乙個字元;字串常量定義為放在雙引號內所有內容;整型常量定義為帶或不帶+、- 號,不以0開頭的若干數字的組合;實型常量定義為帶或不帶+、- 號,不以0開頭的若干數字加上小數點再後跟若干數字的組合; 5

、統計並輸出串或檔案中包含的各種型別的常量個數; 6

、以二元組(型別,值)的形式輸出各常量的型別和值; 7

、根據常量說明串置於高階語言源程式中時可能出現的錯誤情況,模仿高階語言編譯器對不同錯誤情況做出相應處理。

四、執行結果

1、輸入如下正確的常量說明串:

const count=10,sum=81.5,char1=『f』,max=169,str1=「h*54 2..4s!aasj

」, char2=『@』,str2=「aa!+h」;

輸出:count(integer,10)

sum(float,81.5)

char1(char, 『f』)

max(integer,169)

str1(string,「h*542..4s!aasj

」)char2(char, 『@』)

str2(string,「aa!+h

」)int_num=2;char_num=2; string_num=2; float_num=1. 2

、輸入類似如下的保留字const錯誤的常量說明串:

aconstt count=10,sum=81.5,char1=『f』;

輸出類似下面的錯誤提示資訊:

it is not a constant declaration statement!

please input a string again! 3

、輸入類似如下含常量名或常量值錯誤的常量說明串:

const count=10,12sum=81.5,char1=『ff』,max=0016

;輸出類似下面的錯誤提示資訊:

count(integer,10)

12sum(wrong! it is not a identifier!)

char1(wrong! there aremore than one char in 『』.)

max(wrong! the integer can』t be started with 『0』.)

int_num=1;char_num=0; string_num=0; float_num=0. 4

、其他型別的錯誤處理情況(略)。

五、提示

本實驗重點有三個:一是作為

常量名的識別符號的識別;二是如何根據「

=」後出現的內容來判斷常量型別;三是對各種錯誤的處理。難點是對整型和實型常量的判斷必須綜合考慮多種可能情況。

建議:1、用指標或陣列與指標相結合來處理輸入的

常量說明串

;2、對整型和實型常量處理時,重點考慮常數中『

0』的位置。

六、分析與討論

1、若考慮用e或e的科學計數法來表示整數和實數,應該如何實現?

2、若考慮布林型常量,且規定其值只能為true或false,應該如何實現?

3、如何對手工構造的詞法分析程式做進一步的優化,以提高**質量和執行效率?

#include

#include

#include

#include

#define  n 80

#define  m 16

void check_const();

void measure_iden();

void measure_string();

void measure_digit();

void measure_char();

char cha;

int ci=0,cf=0,cc=0,cs=0;

char *p0,*t0,*p1,*t1, *p2,*str,*p3,*t3="const",*digi,*flo;

void main()

else if(*p0=='\"')   /* 處理字串常量 */

else if(isdigit(*p0))  /* 處理數字 */

else if(*p0=='\'') //處理字元常量}}

if(*p0!=';')

else

}/*    檢查輸入串是否以"'const"開頭   */

void check_const()

else}}

void measure_iden()

else if (*p0=='_'||isalpha(*p0))

*p1='\0';

//  printf("%s\n",p0);

p0++;

}printf("%s",t1);

}void measure_string()

p0++;

p2++;

}*p2='\0';

p0++;

cs++;

printf("(string,\"%s\")\n",str);

}void measure_digit()

}if(mark==0)

*p2='\0';

ci++;

printf("(integer,%s)\n",digi);

}if(mark==1)

*p2='\0';

cf++;

printf("(float,%s)\n",flo);}}

void measure_char()

else

printf("(char,'%c')\n",cha);

}

簡單詞法分析

學校作業,分析能力有限。liuxiangj gmail.com 2009.4.7 include include include define maxlength 255 union wordcontent typedef struct wordword int count 0 word sym m...

實驗一 詞法分析實驗

實驗一 詞法分析實驗 專業 商軟2班 姓名 李文輝 學號 201506110168 一 實驗目的 編制乙個詞法分析程式 二 實驗內容和要求 實驗內容 1.對字串表示的源程式 2.從左到右進行掃瞄和分解 3.根據詞法規則 4.識別出乙個乙個具有獨立意義的單詞符號 5.以供語法分析之用 6.發現詞法錯誤...

實驗一 詞法分析實驗

實驗 一 詞法分析實驗 商業軟體工程專業 張煌 201506110130 一 實驗目的 從左至右地對源程式進行掃瞄,按照語言的詞法規則識別各類單詞,並產生以為格式的結果。二 實驗內容和要求 輸入 源程式字串 輸出 二元組 種別,單詞符號本身 三 實驗方法 步驟及結果測試 1.源程式名 壓縮包檔案 r...