實驗一:詞法分析
一、實驗目的
通過設計編制除錯乙個具體的詞法分析程式,加深對詞法分析原理的理解。並掌握在對程式語言源程式進行掃瞄過程中將其分解為各類單詞的詞法分析方法。
編制乙個讀單詞過程,從輸入的源程式中,識別出各個具有獨立意義的單詞,即基本保留字、識別符號、常數、運算子、分隔符五大類。並依次輸出各個單詞的內部編碼及單詞符號自身值。
二、實驗預習提示
1、 詞法分析器的功能和輸出格式
詞法分析器的功能是輸入源程式,輸出單詞符號。詞法分析器的單詞符號常常表示成以下的二元式(單詞種別碼,單詞符號的屬性值)。本實驗中,採用的是一類符號一種別碼的方式。
2、 單詞的bnf表示
《識別符號》----> 《字母》《字母數字串》
《無符號整數》----> 《數字》《數字串》
《加法運算子》----> +
《減法運算子》----> -
等等3、 模組結構(見課本p95-96)(可根據自己的理解適當修改)
三、實驗過程和指導:
(一) 準備:
閱讀課本有關章節,明確語言的語法,寫出基本保留字、識別符號、常數、運算子、分隔符和程式例。
初步編制好程式。
準備好多組測試資料。
(二) 上機:
(三) 程式要求:
1.要求用c++builder或者dephi或者vb或者vc或者j**a等視覺化程式設計工具編寫;要求有介面(即一般windows下應用程式介面)。
2.輸入為某語言源**。
程式輸入/輸出示例:
main()
int a,b;
a=10;
b=a+20;
要求輸出如下(也可以以檔案形式輸出)。
(2,」main」)
(5,」(「)
(5,」)「)
(5,」
(1,」int」)
(2,」a」)
(5,」,」)
(2,」b」)
(5,」;」)
(2,」a」)
(4,」=」)
(3,」10」)
(5,」;」)
(2,」b」)
(4,」=」)
(2,」a」)
(4,」+」)
(3,」20」)
(5,」;」)
(5,」)「) 注:為右大括號
要求(可根據實際情況加以擴充和修改):
識別保留字:if、int、for、while、do、return、break、continue等等;單詞種別碼為1。
其他的都識別為識別符號;單詞種別碼為2。
常數為無符號數;單詞種別碼為3。
運算子包括:+、-、*、/、=、>、《等;可以考慮更複雜情況》=、<=、!= ;單詞種別碼為4。
分隔符包括: 「,」「;」「(」「)」「」等; 單詞種別碼為5。
定義部分:定義常量、變數、資料結構。
初始化:從檔案將源程式輸入到字元緩衝區中。
取單詞前:去掉多餘空白。呼叫過程getnb();
提取字元組成單詞,利用課本轉換圖構造單詞掃瞄過程scan(),需要根據實際情況加以修改。
判斷單詞的種別碼,呼叫過程lookup();
顯示(匯出)結果。
view code
#include #include#include
#include
#include
using
namespace
std;
char *key=; //
保留字表(c語言32個保留字)
vector
token(0);//
存放構成單詞串
vector num(0); //
存放構成數字串
vector yunsuan(0); //
存放構成運算子串,如 ==,!=,<= 等。
vector
v(0);//
存放源程式串
void openfile(void)//
從檔案裡掃瞄源程式,放入向量v中。
char
next;
while(!in_stream.eof())
v.pop_back();
}int is_class(char ch)//
判斷乙個字元是屬於哪一類的。
') return
4;//
分界符類
//else return -1;
//其他非法字元
}void getnum(void)//
獲取當前的第乙個數字串,第乙個符號必定是數字類
}void getnb(void)//
獲取當前的第乙個單詞串,第乙個符號必定是字母類
}void getyunsuan(void)}
int is_key(vector &p)//
判斷字串是否是保留字,是則返回1,否則返回0.
str[i]='\0'
;
for(i=0; i)
}if(flag==0) return0;
}void print(vector &q)
cout
<
}int
main()
else
if(is_class(v[i])==1
)
}else
if(is_class(v[i])==2
)
else
while(len--)
}else
if(is_class(v[i])==3
)
}else
if(is_class(v[i])==4
)
else
}return0;
}
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...
詞法分析(編譯原理)
詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...