為給定程式語言設計詞法分析器
1、 單詞結構
注釋:以「//」開頭到該行尾部為注釋
關鍵字(共6個):int real if then else while
識別符號:以字母開頭,後跟字母或數字的符號串,最長為64個字元。(注意:關鍵字不是識別符號)
操作符(共11個< <= > >= !=
分隔符(共5個
數字(用正規式描述):
digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
整數 digit最大整數為231)
exponent edigit+ (最大指數為128)
fraction . digit+
實數 digit+ exponent | digit+ fraction ( exponent | )
2、 詞法分析器要求
將詞法分析部分設計為乙個子程式(以備隨後的語法分析器呼叫)。
輸入:其內容為指定程式語言的一段程式**。
輸出:其內容為四元組形式(單詞型別,單詞本身,行號,列號),output檔案中的每一行對應乙個單詞的資訊。四元組形式中,第一項為單詞型別,第二項為單詞本身,第三項為單詞所在的行號,第四項為單詞所在的列號。
注意:詞法分析器需要濾掉注釋,即在詞法分析過程中遇到注釋則跳過,繼續分析隨後的單詞資訊,詞法分析器的輸出資訊中不含注釋。
1、 對於設計詞法分析器來說,首先應明確詞法分析器是做什麼的,然後進行分析和設計,最後程式設計實現並測試。即先分析問題,再想解決問題的辦法,然後再著手解決問題。
2、 程式設計實現詞法分析器後,是否進行了測試?特別是,你設計的詞法分析器能否濾掉注釋?能否識別小數?
3、 在進行詞法分析時,會遇到什麼樣的錯誤?詞法分析器能否識別這些錯誤?當遇到這些錯誤後,詞法分析器如何繼續進行分析?
1、 詞法分析器設計思路.doc,其內容包含各類單詞的dfa描述、詞法分析器的處理流程等;
2、 詞法分析器源程式;
3、 測試輸入檔案及詞法分析輸出檔案
這三類資料打包,檔名命名為「學號姓名實驗二」,上交至郵箱:
詞法分析程式參考文件
一、 實驗目的
設計、編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。
二、 實驗要求
2.1 待分析的簡單的詞法
(1)關鍵字:
begin if then while do end
所有的關鍵字都是小寫。
(2)運算子和界符
< <= <> > >
(3)其他單詞是識別符號(id)和整型常數(sum),通過以下正規式定義:
id = letter (letter | digit)*
num = digit digit*
(4)空格有空白、製表符和換行符組成。空格一般用來分隔id、sum、運算子、界符和關鍵字,詞法分析階段通常被忽略。
2.2 各種單詞符號對應的種別碼:
表2.1 各種單詞符號對應的種別碼
2.3 詞法分析程式的功能:
輸入:所給文法的源程式字串。
輸出:二元組(syn,token或sum)構成的序列。
其中:syn為單詞種別碼;
token為存放的單詞自身字串;
sum為整型常數。
例如:對源程式begin x:=9: if x>9 then x:=2*x+1/3; end #的原始檔,經過詞法分析後輸出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
三、詞法分析程式的演算法思想:
演算法的基本任務是從字串表示的源程式中識別出具有獨立意義的單詞符號,其基本思想是根據掃瞄到單詞符號的第乙個字元的種類,拼出相應的單詞符號。
3.1 主程式示意圖:
主程式示意圖如圖3-1所示。其中初始包括以下兩個方面:
⑴ 關鍵字表的初值。
關鍵字作為特殊識別符號處理,把它們預先安排在一張**中(稱為關鍵字表),當掃瞄程式識別出識別符號時,查關鍵字表。如能查到匹配的單詞,則該單詞為關鍵字,否則為一般識別符號。關鍵字表為乙個字串陣列,其描述如下:
char *rwtab[6] = ;否是
圖3-1
(2)程式中需要用到的主要變數為syn,token和sum
3.2 掃瞄子程式的演算法思想:
首先設定3個變數:①token用來存放構成單詞符號的字串;②sum用來存放整型單詞;③syn用來存放單詞符號的種別碼。掃瞄子程式主要部分流程如圖3-2所示。
是否字母數字其他
運算子符號
界符等符號否是
圖 3-2
四、詞法分析程式的c++語言程式源**:
#include""
#include"" //包含getch函式的標頭檔案
#include"" //包含exit函式的標頭檔案
#include <>
#include <>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]=;
scaner();
main()
while(ch!='#');
p=0;
do }while(syn!=0);
getch();
} scaner()
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
}else if((ch>='0')&&(ch<='9'))
p--;
syn=11;
}else switch(ch)
{ case '<':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
syn=22;
token[m++]=ch;
else
syn=20;
p--;
break;
詞法分析器實驗
姓名 孫曉龍 學號 220800320 日期 2011 5 10 實驗目的 詞法分析的目的是將輸入的源程式進行劃分,給出基本符號 token 的序列,並掠過註解和空格等分隔符號。基本符號是與輸入的語言定義的詞法所規定的終結符。設計 編制 除錯乙個詞法分析子程式 識別單詞,加深對詞法分析原理的理解。功...
實驗一詞法分析器
一實驗目的 1 通過本實驗加深對詞法分析程式的功能及實現方法的理解 2 使用flex實現詞法分析程式。二實驗內容 下面是簡單c語言的詞法 1.關鍵字 else if int return void while 所有的關鍵字都是保留字,並且必須是小寫。2.下面是專用符號 3.其他標記是id 和num ...
詞法分析器實驗報告
一 實驗內容 設計 編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。1.待分析的簡單詞法 1 關鍵字 所有的關鍵字都是小寫 begin if then while do end 2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 num 通過以下正規式定義 id letter lett...