編譯原理課作業要求自己寫乙個詞法分析器,我嘗試寫了一下。
詞法分析:電腦科學中將字串行轉換為單詞(token)序列的過程。進行詞法分析的程式或者函式叫作詞法分析器(lexical analyzer),也叫掃瞄器(scanner)。詞法分析器一般以函式的形式存在,供語法分析器呼叫。 完成詞法分析任務的程式稱為詞法分析程式或詞法分析器或掃瞄器。完成詞法分析任務的程式稱為詞法分析程式或詞法分析器或掃瞄器。從左至右地對源程式進行掃瞄,按照語言的詞法規則識別各類單詞,並產生相應單詞的屬性字。
詞法分析是編譯器對源**進行編譯處理的第一步。編寫指定程式語言的詞法分析器需要構造相應的有限自動機,然後根據其編寫。
目標:對下面的一段程式進行語法分析,輸出分詞。
var有限自動機在紙上手畫的,這個語言的詞法比較簡單,算符界符表,保留字表比較少,我直接寫到**裡了(*^▽^*)n, f;
begin
n := 0
; f := 1
;
while n # 10
dobegin
n := n + 1
; f := f *n;
end;
call print;
end.
#include#include最後的輸出:#include
using
namespace
std;
bool isdigit(char
ch);
bool isletter(char
ch);
int reserve(string
s);int
main()
if(isletter(ch))//
進入字母狀態
code = reserve(strtoken);//
查詢保留字
if(code==0) //
不是保留字
else
continue
; }
else
if(isdigit(ch))//
進入數字狀態
cout
<
<
", 常量 >
"<
continue
; }
else
if(ch == '
+') cout<
< + , 算符 >
"<
else
if(ch == '
-') cout<
< - , 算符 >
"<
else
if(ch == '
*') cout<
< * , 算符 >
"<
else
if(ch == '
/') cout<
< / , 算符 >
"<
else
if(ch == '
<
') cout<
< < , 算符 >
"<
else
if(ch == '
>
') cout<
< > , 算符 >
"<
else
if(ch == ':'
)
else
if(ch == 0x23) cout<
"<
else
if(ch == 0x28) cout<
< ( , 界符 >
"<
else
if(ch == 0x29) cout<
< ) , 界符 >
"<
else
if(ch == 0x2c) cout<
< , , 界符 >
"<
else
if(ch == 0x2e) cout<
< . , 界符 >
"<
else
if(ch == 0x3b) cout<
< ; , 界符 >
"<
else
if(ch=='
'||ch=='
\r'||ch=='
\n') continue
;
else cout<
error :
"infile>>ch;
if(infile.eof()) break
; }
infile.close();
//關閉檔案輸入流
return0;
}bool isdigit(char
ch)bool isletter(char
ch)int reserve(string
s)
編譯原理 詞法分析器
1 從源程式檔案中讀入字元。2 統計行數和列數用於錯誤單詞的定位。3 刪除空格類字元,包括回車 製表符空格。4 按拼寫單詞,並用 內碼,屬性 二元式表示。屬性值 token 的機內表示 5 如果發現錯誤則報告出錯 6 根據需要是否填寫識別符號表供以後各階段使用 int tag 0 設立標誌 一開始本...
編譯原理(一)詞法分析器
詞法分析器的功能是輸入源程式,輸出單詞符號。單詞符號是乙個程式語言的基本語法符號。程式語言的符號一般可以定義為以下幾種 關鍵字 是由程式語言定義的具有固定意義的識別符號,也稱這些識別符號為保留字或基本字。例如 c 語言中的define do for while if else等 識別符號用來表示各種...
編譯原理之詞法分析器(C C)
從乙個檔案中讀取原始碼,執行後可以直接看到結果,也可在指定檔案中檢視結果。這個詞法分析器只實現了部分關鍵字 字元等的識別,可在key陣列自行新增,種別碼的判別與新增用case更加方便,可寫下試試。include include include include include using namesp...