編譯技術上機實驗題目
實驗一一、題目
編制c語言子集的詞法分析程式
二、目的
通過設計、編制、除錯乙個具體的詞法分析程式,加深對詞法分析原理的理解,並掌握在對程式語言源程式進行掃瞄過程中將其分解為各類單詞的詞法分析方法。
三、要求
1.根據具體情況,由同學們自己選取c語言的乙個適當大小的子集(可取一類典型單詞,也可以盡可能使各種型別的單詞都兼顧到),如課本表2.1;在上機前一定要製出相應的表。
2.程式功能
輸入:字串。
輸出:二元式(種別編碼,單詞自身)構成的序列。
舉例:輸入:a=$;#
輸出:(6,a)
(12,=)
found error
(13,;)
#include
#include
using namespace std;
string key[6] = ; //關鍵字
bool iskey( string str, int &syn) //判斷是否為關鍵字,若是傳回相應關鍵碼的種別名
}return false;
}bool isletter(char c) //是否為字母
bool isdigit(char c) //是否為數字
void analyse(file *filep)
else if(isletter(c)) //字母開頭的
else //操作符等
; //關鍵字
bool iskey( string str, int &syn) //判斷是否為關鍵字,若是傳回相應關鍵碼的種別名
return false;
}bool isletter(char c) //是否為字母
bool isdigit(char c) //是否為數字
void analyse(file *filep)
{ int n;
char c;
string str = "";
while((c = fgetc(filep)) != eof)
{if(cc == '\n' || c == '\t')
continue;
else if(isdigit(c)) //數字
while(isdigit(c))
str += c;
c = fgetc(filep);
fseek(filep, -1, seek_cur);
cout << "(11, " << str << ")" << endl;
str = "";
else if(isletter(c)) //字母開頭的
while(isdigit(c) || isletter(c))
str += c;
c = fgetc(filep);
fseek(filep, -1, seek_cur);
if(iskey(str, n))
cout << "(" << n << ", " << str << ")" << endl; //關鍵碼
else
cout << "(10, " << "\'"<< str << "\'" << ")" << endl; //標誌符
str = "";
else //操作符等
switch(c)
case '+':
cout << "(13, +)" << endl;
break;
case '-':
cout << "(14, -)" << endl;
break;
case '*':
cout << "(15, *)" << endl;
break;
case '/':
cout << "(16, /)" << endl;
break;
case ':':
if(c=fgetc(filep) == '=')
cout << "(18, :=)" << endl;
else
cout << "(17, " << endl;
fseek(filep, -1, seek_cur);
編譯原理上機指導
第一部分詞法分析 實驗一 簡單的掃瞄器設計 一 實驗目的 熟悉並實現乙個簡單的掃瞄器 二 實驗內容 1 設計掃瞄器的自動機 2 設計翻譯 生成token的演算法 3 編寫 並上機除錯執行通過。要求 輸入 源程式檔案 輸出 1 相應的token序列 2 關鍵字 界符表,符號表,常數表。三 掃瞄器設計 ...
編譯原理實驗報告
通過編寫和除錯乙個詞法分析程式,掌握在對程式語言的源程式進行掃瞄的過程中,將字元形式的源程式流轉化為乙個由各類單詞符號組成的流的詞法分析方法。語言中具有的單詞包括五個關鍵字begin end if then else 識別符號 整型常數 六種關係運算子 乙個賦值符和四個算術運算子。參考實現方法簡述如...
編譯原理實驗報告
軟體學院驗證性實驗報告 專業 軟體開發 net方向 年級 班級 2010級 2012 2013學年第一學期 1 實驗目的及實驗專案簡介 運用編譯程式,完成下述源程式的編譯,了解源程式的預處理功能 即通過編譯程式,將高階語言程式 源程式 翻譯成低階語言程式 目標程式 源程式的輸入 設源程式如下所示,其...