用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 位置 符號型別...