詞法分析器(分析C語言)

2021-08-09 04:26:46 字數 3656 閱讀 7553

用c或c++語言編寫乙個簡單的詞法分析程式,掃瞄c語言小子集的源程式,根據給定的詞法規則,識別單詞,填寫相應的表。如果產生詞法錯誤,則顯示錯誤資訊、位置,並試圖從錯誤中恢復。簡單的恢復方法是忽略該字元(或單詞)重新開始掃瞄。

相關詞法規則

《識別符號》::=《字母》

《識別符號》::=《識別符號》《字母》

《識別符號》::=《識別符號》《數字》

《常量》::=《無符號整數》

《無符號整數》::=《數字序列》

《數字序列》::=《數字序列》《數字》

《數字序列》::=《數字》

《字母》::=a|b|c|……|x|y|z

《數字》::=0|1|2|3|4|5|6|7|8|9

《加法運算子》::=+|-

《乘法運算子》::=*|/

《關係運算子》::=|!=|>=|<=|==

《分界符》::=,|;|(|)|

《保留字》::=main|int|if|else|while|do

(1)確定所要翻譯的語言(或其子集)。

c語言

(2)設計屬性字,及各類**,如識別符號表、常量表、符號及其機內表示對照表等。

與詞法分析有關的**:

1. 字元表

保留字:main,int,if,else,while,do

字母(全小寫):a|b|c|……|x|y|z

數字:0,1,2,3,4,5,6,7,8,9

運算子和界符:,!=,>=,<=,==,,,;,(,),

2. 特定單詞機內表示表

3.畫出總控流程圖及各個子程式的流程圖。

4. 程式

輸入:乙個存放c語言程式的s.txt檔案

輸出:存放以(單詞,種別碼)形式輸出的result.txt檔案

需要6個陣列:

1. 儲存關鍵字 key[6]

2. 儲存對應下標關鍵字的種別碼 keynum[6]

3. 儲存運算子和界符 symbol[17]

4. 儲存運算子對應下標的種別碼 symbolnum[17]

5. 儲存從檔案中取出的每個字元(不包括括號)letter[1000]

主要函式:

takeword();

功能:將檔案letter中每個字元進行提取,找出關鍵字,輸出種別碼

num作為全域性變數儲存提取到字元的哪個下標

1. 先提取乙個字元,如果是字母,進入case1,呼叫identifier(),不斷的提取字母或數字進行連線,沒連線乙個字元用int iskeyword()程式(返回關鍵字種別碼)判斷是否為關鍵字,是就退出函式返回string,不是就繼續執行函式,直到連線的字元不再是字母或數字,即此時字串為識別符號

2. 如果是數字,進入case 2,呼叫number()函式,不斷進行字串連線,知道下乙個連線字元不再是數字

3. 如果是符號,進入case 3,呼叫symbolstr()函式,如果是=,>,

其他輔助函式:

int issymbol()判斷運算子和界符,並返回種別碼

bool isnum() 判斷是否為數字

bool isletter()判斷是否為字母

int iskeyword()判斷是否為關鍵字,是返回種別碼

int typeword()返回單個字元的型別

string identifier()識別符號的連線

string symbolstr()符號和界符的連線

string number()數字的連線

void print()輸出

#include 

#include

#include

#include

using namespace std;

//關鍵字

string key[6]=;

//關鍵字的種別碼

int keynum[6]=;

//運算子和界符

string symbol[17]=","+","-","*","/","="};

//char symbol[12]='};

//運算子和界符的種別碼

int symbolnum[17]=;

//存放檔案取出的字元

string letter[1000];

//將字元轉換為單詞

string words[1000];

int length; //儲存程式中字元的數目

int num;

int issymbol(string s)

return

0;}

//判斷是否為數字

bool isnum(string s)

//判斷是否為字母

bool isletter(string s)

//判斷是否為關鍵字,是返回種別碼

int iskeyword(string s)

return0;}

//返回單個字元的型別

int typeword(string str)"

||str=="+"||str=="-"||str=="*"||str=="/") //判斷運算子和界符

return

3; }

string identifier(string s,int n)

j++;

}else

} num=j;

return s;

}string symbolstr(string s,int n)

num=j;

return s;

}string number(string s,int n)

else

}num=j;

return s;

}void print(string s,int n)

case

2:

case

3: }}

}int main() //去掉程式中的空格

}takeword();

// for(j=0;j

// cout/ }

fclose(stdin);//關閉檔案

fclose(stdout);//關閉檔案

詞法分析器 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 詞法分析器

編譯原理實驗 一 實驗題目 設計 編制 除錯乙個識別一簡單語言單詞的詞法分析程式。程式能夠識別基本字 識別符號 無符號整數 浮點數 運算子和界符 單詞符號及種別表如下 單詞符號 種別編碼 begin1if 2then 3while4do 5end 6l l d 10dd 11 13 14 15 16...

c語言詞法分析器

include include include void main void int reserver char void main void if output fopen output.txt wt null fprintf output,4s t 8s t 16s t 4s n 位置 符號型別...