/////
/輸入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...