通過編寫和除錯乙個詞法分析程式,掌握在對程式語言的源程式進行掃瞄的過程中,將字元形式的源程式流轉化為乙個由各類單詞符號組成的流的詞法分析方法。
語言中具有的單詞包括五個關鍵字begin、end、if、then、else;識別符號;整型常數;六種關係運算子;乙個賦值符和四個算術運算子。參考實現方法簡述如下。
單詞的分類:構造上述語言中的各類單詞符號及其分類碼表。
表i 語言中的各類單詞符號及其分類碼表
識別表i所列語言中的部分單詞的dfa及相關的語義過程
將表i單詞集中的整常數改為無符號常數,無符號常數的單詞分類碼助記符:ucon
描述無符號數的正規文法和狀態轉換圖:
無符號數的右線性文法g1[《無符號數》]如下:
〈無符號數〉→ d〈餘留無符號數〉
〈無符號數〉→ ·〈小數部分〉
〈無符號數〉→ d
〈餘留無符號數〉→ d〈餘留無符號數〉
〈餘留無符號數〉→ ·〈十進小數〉
〈餘留無符號數〉→ e〈指數部分〉
〈餘留無符號數〉→ d
〈餘留無符號數〉→ ·
〈十進小數〉→ e〈指數部分〉
〈十進小數〉→ d〈十進小數〉
〈十進小數〉→ d
〈小數部分〉→ d〈十進小數〉
〈小數部分〉→ d
〈指數部分〉→ d〈餘留整指數〉
〈指數部分〉→ +〈整指數〉
〈指數部分〉→ -〈整指數〉
〈指數部分〉→ d
〈整指數〉→ d〈餘留整指數〉
〈整指數〉→ d
〈餘留整指數〉→ d〈餘留整指數〉
〈餘留整指數〉→ d
圖所示為上述文法的狀態轉換圖,其中編號0、1、2、…、6分別代表非終結符號《無符號數》、《餘留無符號數》、《十進小數》、《小數部分》、《指數部分》、《整指數》及《餘留整指數》。
文法g1[《無符號數》]的狀態轉換圖
包含語義處理過程的識別無符號數的狀態矩陣
lex.h
#ifndef _lex_h
#define _lex_h
#define max_length 256
#define max_ket_number 6
#define endstate -1
#define begin 1
#define end 2
#define if 3
#define then 4
#define else 5
#define id 6
#define ucon 7
#define lt 8
#define le 9
#define eq 10
#define ne 11
#define gt 12
#define ge 13
#define is 14
#define pl 15
#define mi 16
#define di 17
#define mul 18
#define div 19
#define plus 20
#define minus 21
#define lkuohao 22
#define rkuohao 23
#define jing 40
無符號數識別有關定義
#define digit 51
#define point 52
#define other 53
#define power 54
#define zheng 55
#define fu 56
#endif
lex.c
#include
#include
#include"lex.h"
#include
#include
#include
int isint=1;//數的型別 1 整數 0 小數
static int currentstate=0;
int number_state_switch(int state, char c);
char token[max_length];//存放識別符號串
const char *key_work[max_ket_number]=;
const char *map=
else
int type;
while(isstop)
printf("詞法分析完成,儲存在out.txt檔案中!\n");
fclose(ifp);
fclose(ofp);
}void out(int type,char *token)//輸出單詞以二元組的形式
else
}else
fputc(')',ofp);
fputc('\n',ofp);
}int lookup(char *token) //查詢符號串的型別
} return id;
}void report_error()
int lex() //詞法分析函式
token[i]='\0';
if(ch==eof)
isstop=0;
else
return lookup(token);
}else if(isdigit(ch))//數字開頭無符號數
while(currentstate!=endstate);
token[i-1]='\0';
if(ch==eof)
isstop=0;
else
return ucon;
}else //其他符號是運算子
else
{fseek(ifp,-1,1);
編譯原理實驗報告
軟體學院驗證性實驗報告 專業 軟體開發 net方向 年級 班級 2010級 2012 2013學年第一學期 1 實驗目的及實驗專案簡介 運用編譯程式,完成下述源程式的編譯,了解源程式的預處理功能 即通過編譯程式,將高階語言程式 源程式 翻譯成低階語言程式 目標程式 源程式的輸入 設源程式如下所示,其...
編譯原理實驗報告
姓名 專業 班級 學號 指導老師 一 實驗內容 求解乙個文法的first follow select集合並判斷是不是ll 1 文法。一 實驗目的 通過實驗熟練掌握first follow select集合的求解演算法,加深對理論知識的理解。二 實驗原理 集的求解 1 若x vt,則first x 2...
編譯原理實驗報告
設計 編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。2.1 待分析的簡單的詞法 1 關鍵字 begin if then while do end 所有的關鍵字都是小寫。2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 sum 通過以下正規式定義 id letter letter d...