複製鏈接
請複製以下鏈接發送給好友

plo

(計算機編程語言)

鎖定
PL0語言是一種類PASCAL語言,是教學用程序設計語言,它比PASCAL語言簡單,作了一些限制。PL0的程序結構比較完全,賦值語句作為基本結構,構造概念有順序執行、條件執行和重複執行,分別由BEGIN/END、IF和WHILE語句表示。
中文名
plo
關係運算符
條件語句
文法規則
::=
包    含
唯一的整型
語    種
類PASCAL

ploplo簡介

此外,PL0還具有子程序概念,包括過程説明和過程調用語句。在數據類型方面,PL0只包含唯一的整型,可以説明這種類型的常量變量。運算符有+,-,*,/,=,<>,<,>,<=,>=,(,)。説明部分包括常量説明、變量説明和過程説明。

plo文法規則

<程序>::=<分程序>. <分程序>::=[<常量説明部分>;][<變量説明部分>;]{<過程説明部分>;}<語句部分> <常量説明部分>::=const<常量定義>{,<常量定義>} <常量定義>::=<標識符>=<無符號整數> <無符號整數>::=<數字>{<數字>} <變量説明部分>::=var<標識符>{<標識符>} <標識符>::=<字母>{<字母>|<數字>} <過程説明部分>::=<過程首部><分程序>
<過程首部>::=procedure<標識符>
<語句部分>::=<語句>|<複合語句>
<複合語句>::=begin<語句>{;<語句>}end
<語句>::=<賦值語句>|<條件語句>|<當型循環語句>|<過程調用語句>|
<讀語句>|<寫語句>|<複合語句>|<空語句> <賦值語句>::=<標識符>:=<表達式> <條件>::=<表達式><關係運算符><表達式>|odd<表達式> <表達式>::=[+|-]<項>|<表達式><加法運算符><項>
<項>::=<因子>|<項><乘法運算符><因子>
<因子>::=<標識符>|<常量>|(<表達式>)
<常量>::=<無符號整數>
<加法運算符>::=+|-
<乘法運算符>::=*|/
<關係運算符>::=<|>|<>|>=|<=|=
<條條件語句>::=if<條件>then<語句>
<過程調用語句>::=call<標識符>
<當型循環語句>::=while<條件>do<語句>
<讀語句>::=read(<標識符>{,<標識符>})
<寫語句>::=write(<表達式>{,<表達式>})
<字母>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

plo設計思想

編譯程序的設計可以採用自頂向下和自底向上兩種不同的方法。由於許多高級語言(如PASCAL,C)中的語法成分都是遞歸定義的,PL0也是如此,所以本實驗採用遞歸子程序法,這是一種自頂向下的的編譯方法,其基本思想是對源程序的每個(或若干個)語法成分編制一個處理子程序,從處理<程序>這個語法成分的子程序開始,在分析過程中調用一系列過程或函數,對源程序進行語法和語義分析,直到整個源程序處理完畢為止。
我們給出用PASCAL語言編寫的PL0的編譯程序,要求學生先讀懂它,然後再用自己熟悉的高級語言改寫它,能力強的同學可以按照所學知識,自行設計實現方案。

plo編譯程序的功能

(1)語法分析 對由PL/0語言編制的程序作語法分析,確定是否屬於PL/0語言,同時揭示出程序的內在結構。
(2)語法錯誤檢查 根據PL/0語言的文法規則設置檢測手段,通過查錯子程序和一些查錯語句,報告源程序出錯位置、性質等,直至整個程序結束為止。 (3)生成目標代碼 PL/0語言的目標代碼是建立在一個假想的處理機上,此處理機稱為PL/0處理機。 (4)執行目標代碼 PL/0處理機是一種假想的處理機,其目標代碼不能在實際的機器上執行,故此編譯程序設置了一個子程序,它對PL/0語言的目標代碼逐條解釋執行,最後得出所需結果。

plo過程及函數

在PL/0語言的編譯文本中,除了常量變量説明外,共有18個相互嵌套或並列的過程(或函數)。現對這些過程和函數作扼要説明。
(1)error(n):其功能是報告PL/0源程序的出錯信息。n為錯誤類型號,共可查出36種錯誤。
(2)getsym:詞法分析子程序。其功能為讀單詞。
getch:讀字符子程序。它嵌套於讀單詞子程序中。
(3)gen(x,y,z),偽代碼生成子程序。其功能是根據不同的x、y、z生成不同的偽代碼。x表示指令碼,y表示層差,z表示位移量或數。
(4)test(sl,s2,n):查錯子程序。其功能是檢測源程序中的語法錯誤。s1為可允許的下一個符號的集合。如當前符號不在此集合內,立即得到了一個錯誤。s2為另加的停止符號集,這些符號的出現雖然無疑是錯的,但是它們絕不應被忽略而跳過。n表示錯誤的類型號。
(5)block(1ev,tx,fsys):分程序處理模塊。其功能為對分程序進行處理。lev表示層差,tx表示標識符表的下標,fsys是符號集,表示可能出現的符號。
分程序處理模塊是整個編譯程序的核心,它包含以下的過程和函數。
①enter(k):其功能是造符號表table。k表示符號的類型,其取值範圍是(constant, variable,proceable),即此子程序常量變量和過程造符號表table,以備檢查標識符是否説明過。
②position(id):其功能是查符號表,它是一個函數。 id是所檢查的標識符,若查到則給出標識符id在標識符表中的位置,否則給0。
③constdeclaration:常量造表子程序。其功能是為常量造一張常量表,內填常量名、常量值。它通過調用子程序enter(k)完成,此時k=constant。
④vardeclaration:變量造表子程序。其功能是為變量造一張變量表,內填變量名、所處層號。它也是通過調用子程序enter(k)來完成的,此時k=variable。
⑤listcode,打印(偽)代碼子程序。其功能是輸出生成的目標代碼
⑥statement(fsys):語句處理子程序。其功能是處理語句,它是遞歸調用的核心部分。其遞歸調用順序如下:
expression(fsys):處理算術表達式子程序;
term(fsys):處理項子程序;
condition(fsys):處理因子子程序。
(6)interpret,執行目標代碼子程序。其功能是對編譯過程中生成的目標代碼(偽代碼)逐條解釋執行
base(l):提供計算靜態鏈信息子程序。它為過程調用提供調用所需的基地址。
整個PL/0編譯程序通過主程序調用分程序處理模塊block,再通過block遞歸調用上述的子程序,達到對PL/0語言的程序進行編譯的目的。

plo編譯步驟

程序中用數組word存貯PL/0語言的所有保留字。保留字有begin、call、const、do、end、if、odd、procedure、read、then、var、while、write;
數組swym存貯保留字所對應的符號表symbol中的符號;
數組ssym存貯關係運算符及特殊符號+、-、*、/、(、)、=、,、<、>及;所對應的符號表symbol中的符號;
數組mnemonic存貯目標代碼的指令碼部分。
其具體步驟如下:
①在主程序中給出編譯程序所需的初始值。置字符字數cc、行長ll、代碼分配下標cx、錯誤個數err等為0。調getsym讀單詞;
②調block模塊,進入分程序處理;
③判斷所讀單詞是否為常量説明符號constsym,是則轉(4),否則轉(5)。
④讀單詞並作常量説明處理;查所讀單詞是否為“,”,是則重複本步;否則判斷此單詞是否為“;”,是則讀單詞,否則給出出錯信息。進行下一步;
⑤所讀單詞是否為變量説明符號variable,是則讀單詞並作變量説明處理,再讀單詞並判斷是否為“,”,是則重複本步;否則判斷此單詞是否為“;”,是則讀單詞,否則給出出錯信息。進行下一步;
⑥cxl:=cx,並生成jmp 0,0指令,判斷所讀單詞是否為過程説明符號proceduresym,是則讀單詞轉(7),否則轉(11);
⑦判斷所讀單詞是否為標識符,是則轉(8),否則給出出錯信息再進行下一步;
⑧標識符填表,再讀單詞。判斷所讀單詞是否為“;”,是則讀單詞,否則給出出錯信息。進行下一步;
遞歸調用分程序處理子程序block;
⑩最近所讀單詞是否為“;”,是則繼續讀一單詞,否則給出出錯信息。轉(6);
⑾code[cxl].a:=cx,生成分配局部變量指令,語句處理,生成opr 0,0指令;
⑿返回主程序,err是否為0,是則調子程序interpret,轉(13),否則給出出錯信息,結束編譯;
⒀解釋執行生成的目標代碼,列出結果

plo編程注意事項

PL/0語言可以看成PASCAL語言的子集,它的編譯程序是一個編譯解釋執行系統。PL/0的目標程序為假想棧式計算機的彙編語言,與具體計算機無關。
PL/0的編譯程序目標程序解釋執行程序都是用PASCAL語言書寫的,因此PL/0語言可在配備PASCAL語言的任何機器上實現 。其編譯過程採用一趟掃描方式,以語法分析程序為核心,詞法分析代碼生成程序都作為一個獨立的過程,當語法分析需要讀單詞時就調用詞法分析程序,而當語法分析正確需要生成相應的目標代碼時,則調用代碼生成程序。
用表格管理程序建立變量常量和過程表示符的説明與引用之間的信息聯繫。
源程序編譯正確時,PL/0編譯程序自動調用解釋執行程序,對目標代碼進行解釋執行,並按用户程序的要求輸入數據和輸出運行結果。