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

2021-06-26 11:11:44 字數 3980 閱讀 9577

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) 界符:,,.

,;,#

表1 各種單詞符號對應型別表

單詞符號

型別plus

minus

times

slash

lparen

rparen

eqlcomma

perio

neqsemicolon

begin

beginsym

call

callsym

const

constsym

dodosym

endendsym

ififsym

oddoddsym

procedure

proceduresym

read

readsym

then

thensym

varvarsym

while

whilesym

write

writesym

getsym函式功能:

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

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

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

sym中。如

if的對應值

ifsym

,then

的對應值為

thensym

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

(3) 識別保留字  對使用者定義的識別符號將ident

放在sym

中,識別符號本身的值放在id中

(4) 拼數  當掃瞄到數字串時,將字串形式的十進位制數轉換為二進位制數,然後把數的類別number

放在sym

中,數值本身的值放在

num中

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

、<=

等單詞,識別後將類別送

sym中

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

四、 實驗結果

要分析的內容如下:

const a=36;

var c,d;

procedure p;

begin

var g;

g:=1234567890000000;

write(g);

end;

begin

read(c,d);

if c<=d then c:=a;

write(c,d);

call p;

end.

pl0.h 標頭檔案

#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);

主函式

#include #include #include "pl0.h"

void error(int n)

int getch()

ll = 0;

cc = 0;

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

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

ch = ' ';

while(ch != 10)

printf("%c", ch);

fprintf(fa1, "%c", ch);

line[ll] = ch;

ll++;

}printf("\n");

//fprintf(fa1, "\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)

}else

else

}else

else

}else

else

}else

else

return -1;}}

}}

}return 0;

}void init()

int main()

printf("分析完畢");

}else

printf("\n");

return 0;

}

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

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

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

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

編譯原理 C語言詞法分析器

本程式預設的種別碼的編碼 主介面 功能1提到的input.txt檔案的內容可以是任意c語言 這裡我的input.txt隨便打了一段c語言 進入1功能,直接從input.txt檔案讀取 這裡沒寫路徑輸入,必須把input.txt和本程式的cpp檔案放在同一目錄下 經過分析後得到結果 沒做清屏處理,寫得...