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...