編譯原理 PL 0語言詞法分析

2021-10-05 11:37:38 字數 2588 閱讀 7691

/////

/輸入pl/0語言源程式

輸出二元式序列,(單詞種類,單詞的值)

該語言的保留字,識別符號以及數字可用乙個狀態機來識別,其餘符號可用乙個單獨的狀態機來識別。

正規式如下:

字母開頭:letter(letter|digit)*

數字開頭:digit(digit)*

符號省略

將正規式轉換為dfa

首先,規定幾個變數與函式。

大體思想:在識別到乙個完整的字母開頭的單詞後,查詢保留字表,如果為保留字返回對應的編碼,如果不是將該字串識別為ident,整個源程式以 . 結尾,識別到.則結束程式,返回所有二元式序列。

設計思路因人而異,以上為本人設計思路,僅供參考。

#include

#include

#include

char ch;

//全域性變數ch,用來存放讀入字元

char strtoken[

255]=""

;//全域性變數,用來存放構成單詞符號的字串

char table[13]

[10]=

;//保留字表

char symbol[16]

[3]=

;//符號表

void

getchar()

//讀入字元到ch

void

getbc()

//跳過空白符

void

concat()

//將ch中的字元連線到strtoken

intreserve()

}if(index>=0)

return index;

else

return-1

;}//查詢保留字表,strtoken是否為保留字

bool isletter()

//判斷ch是否為字母

bool isdigital()

//判斷ch是否為數字

char

retchar

(int x,

char a)

}//返回保留字對應編碼

void

main()

} code =

reserve()

;if(code !=-1

)else

strcpy

(word,

"ident");

printf (

"(%s,%s)\n"

,word, strtoken);}

//字母開頭識別

elseif(

isdigital()

)strcpy

(word,

"number");

} printf (

"(%s,%s)\n"

,word, strtoken);}

//數字開頭

else

if(ch==

'\n'

)//換行符識別

else

else

if(ch ==

'-')

else

if(ch ==

'*')

else

if(ch ==

'/')

else

if(ch ==

'=')

else

if(ch ==

')else

if(ch ==

'=')

else

printf

("(lss,

}else

if(ch ==

'>'

)else

printf

("(gtr,>)\n");

}else

if(ch ==

':')

else

printf

("(error,:)\n");

}else

if(ch ==

'(')

else

if(ch ==

')')

else

if(ch ==

',')

else

if(ch ==

';')

else

if(ch ==

'.')

}//符號與界符

}//主體迴圈

}

輸入:

const a=10;

var b,c;

begin

read(b);

c:=a+b;

write(c)

end.

測試結果:

編譯原理實驗(一)PL 0 語言詞法分析

pl 0語言詞法分析 一 實驗目的 通過完成詞法分析程式,了解詞法分析的過程。編制乙個讀單詞程式,對pl 0 語言進行詞法分析,把輸入的字串形式的源程式分割成乙個個單詞符號,即基本保留字 識別符號 常數 運算子 界符五大類。二 實驗環境 作業系統 window xp 編寫環境 visual c c ...

編譯原理 實驗1 PL 0語言詞法分析

pl 0語言詞法分析 一 實驗目的 通過完成詞法分析程式,了解詞法分析的過程。編制乙個讀單詞程式,對pl 0 語言進行詞法分析,把輸入的字串形式的源程式分割成乙個個單詞符號,即基本保留字 識別符號 常數 運算子 界符五大類。二 實驗環境 作業系統 window xp 編寫環境 visual c c ...

pl0語言的語法分析

實驗內容 1 算術表示式文法 vn 其中 e為開始符號 vt 其中 id代表識別符號,要求是長度不超過10的字母序列 num代表常數,要求是正整數 文法規則集如下 e te e te te t ft t ft ft f e id num 2 實驗步驟 1 按照文法求出每個非終結符的first和fol...