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

2021-08-17 00:21:23 字數 3338 閱讀 3207

pl/0語言詞法分析

一、 實驗目的

通過完成詞法分析程式,了解詞法分析的過程。編制乙個讀單詞程式,對pl/0

語言進行詞法分析,把輸入的字串形式的源程式分割成乙個個單詞符號,即基本保留字、識別符號、常數、運算子、界符五大類。

二、 實驗環境

作業系統:window xp

編寫環境:visual c++ 

、c-free

、turbo c

編寫語言:c

語言分析語言:pl/0

三、 實驗內容

對pl/0

語言進行詞法分析,把輸入的字串形式的源程式分割成乙個個單詞符號,其詞法描述如下:

(1) 關鍵字:begin

,call

,const,do

,end,if

,odd

,procedure

,read

,then

,var

,while

,write

(2) 識別符號:用來表示各種名字,必須以字母開頭小於10

位字元組成

(3) 數字:以0-9

組成小於

14位的數字

(4) 運算子:+,-

,*,/

,:=,<

,<=

,>

,>=,#

(5) 界符:, ,. 

,; ,( ,)

getsym函式功能:

(1) 濾空格  空格在詞法分析時是一種不可缺少的界符,而在語法分析時則是無用的,所以必須過濾

(2) 識別保留字  主程式定義了乙個以字元為元素的一維陣列word

,稱保留字表。對字母開頭的字母、數字字串要查此表。若查著則識別為保留字

。若查不著,則認為是使用者定義的識別符號

(3) 識別保留字  對使用者定義的識別符號,識別符號本身的值放在id中

(4) 拼數  當掃瞄到數字串時,將字串形式的十進位制數轉換為二進位制數,數值本身的值放在

num中

(5) 拼合複合詞  對兩個字元組成的算符,如:>=、:=

、<=

等單詞(6) 輸出源程式  為邊讀入字元邊輸出(可輸出在檔案中)

初稿(c語言版)

#include #include #define norw 13         /*關鍵字個數*/

#define nmax 14 //number的最大位數

#define al 10 //符號的最的長度 符號就是+ - 神馬的

#define cxmax 200 //最多的虛擬機器**數

/*enum symbol ;

*/file* fa1; //輸出分析的檔案和首位址 首位址是虛擬機器指標

char ch; //getch讀取的字元

//enum symbol sym;

char id[al+1]; //當前的ident

int num;

int cc, ll; //getch計數器

int cx; //虛擬機器**指標,取值範圍0-cxmax-1

char line[81];

char a[al+1]; //讀取乙個符號 暫時存在這裡

char word[norw][al]; //保留字13個 就是begin end if 什麼的

//enum symbol wsym[norw]; //保留字對應的符號 begin對應beginsym

//enum symbol ssym[256]; //單字元的符號值

file* fin;

file* fout;

char fname[al]; //輸入的檔名

int err;

#define getchdo if(-1==getch()) return -1;

void error(int n);

void error(int n)

int getch()

ll = 0;

cc = 0;

//printf("%d ", cx);

//fprintf(fa1, "%d", cx);

ch = ' ';

while(ch != 10)

printf("%c", ch);

line[ll] = ch;

ll++;

}printf("\n");

}ch = line[cc];

cc++;

return 0;

}int getsym()

if(ch >= 'a' && ch <= 'z')

getchdo;

}while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9');

a[k] = '\0';

strcpy(id, a);

i = 0;

j = norw-1;

dowhile(i <= j);

if(i-1 > j)

else

}else

while(ch >= '0' && ch <= '9');

k--;

if(k > nmax)

printf("整 數 (2,'%d')\n",num);

}else

else

}else

else

}else

else

}else

else if(ch=='-')

else if(ch=='*')

else if(ch=='/')

else if(ch=='#')

else if(ch=='(')

else if(ch==')')

else if(ch==',')

else if(ch==';')

else if(ch=='.')

else}}

}}}return 0;

}void init()

int main()

}else

printf("\n");

return 0;

}

輸出樣圖:

備註:

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

輸入pl 0語言源程式 輸出二元式序列,單詞種類,單詞的值 該語言的保留字,識別符號以及數字可用乙個狀態機來識別,其餘符號可用乙個單獨的狀態機來識別。正規式如下 字母開頭 letter letter digit 數字開頭 digit digit 符號省略 將正規式轉換為dfa 首先,規定幾個變數與函...

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

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

lex實現擴充套件的pl0語言的詞法分析器(附原始碼)

源 和相關檔案都放在了github上 github link 設計思路 實驗步驟 源 理解編譯器的工作機制,掌握編譯器的工作原理 掌握詞法分析器生成工具lex的用法 輸出型別 輔助定義 digit 0 9 letter a za z identifier integer real ee 0 9 wh...