講稿編譯原理_第1頁
講稿編譯原理_第2頁
講稿編譯原理_第3頁
講稿編譯原理_第4頁
講稿編譯原理_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

PL/0編譯程序PL/0編譯程PL/0編譯程序PL/0編譯程序總體結PL/0語言簡《編譯原理類P-code虛擬PL/0編譯程序的詞法分PL/0編譯程序的語法分析PL/0編譯程序的語義分析PL/0編譯程序的錯誤處理PL/0編譯程序的P-code代碼生PL/0編譯程序總體結《編譯原PL/0編譯程序總體結《編譯原理T- 類P-PL/0編譯程序總體結《編譯原理PL/0編譯程序總體結《編譯原理PL/0PL/0語言簡《編譯原理PL/0語言簡《編譯原理PL/0語言為一種簡化的類Pascal語PL/0程序示PL/0語言的語法描述PL/0語言的EBNF表語言的語義規(guī)PL/0程序示《編譯原理/*主程序常量說明部分/*主程序PL/0程序示《編譯原理/*主程序常量說明部分/*主程序變量說明部分/*主程序過程說明部分/*過程P的局部變量說明部分/*過程P的局部過程說明部分/*過程Q的局部變量說明部分CONSTVARD;VARX;WHILECALLQ;Q的過程P的過程主程序的過程CALLPL/0程序示計算最大公約《編譯PL/0程序示計算最大公約《編譯原理為了方便,規(guī)定mnifm<nthenr:=m:=n:=r;callgcd;varm,n,r,{計算m和n的最大公約數(shù)whileq:=m/r:=m-q*n;m:=n;n:=r;PL/0程序示《編譯原PL/0程序示《編譯原理計sum=1!+2!+...+(n從控制臺讀入varn,m,fact,遞歸計算factm!procedurefactorial;ifm>0thenfact:=fact*m;m:=m-1;callfactorial;{讀入nsum:=0;whilen>0dom:=n;fact:=1;callsum:=sum+fact;n:=n-1;{輸出n!}語言的語法描《編譯原理語言的語法描《編譯原理每個節(jié)點都可以到達出有兩種類型的節(jié)內(nèi)的文字表示所用到的其他語法單內(nèi)的文字表示單詞符或語言的語法描《編譯原理例:程序和分程序語法單位的語法描述.語言的語法描《編譯原理例:程序和分程序語法單位的語法描述.=,;,;;;PL/0語言的EBNF表《編譯原PL/0語言的EBNF表《編譯原理EBNF造‘<成分,或稱語法單位,為非終結符‘::=該符號的左部由右部定義,可讀作‘定義為’‘|’表示‘或’,即左部可由多個右部定義‘{}表示花括號內(nèi)的語法成分可以重復;在不加上‘[]’表示方括號內(nèi)的成分為任選‘’表示圓括號內(nèi)的成分PL/0語言的EBNFPL/0語言的EBNF表例:PL/0語言的EBNF表<程序分程序<分程序[<常量說明部分><變量說明部分>][<過程說明部分>]<語句><常量說明部分CONST<常量定義常量定義<常量定義標識符無符號整數(shù)<無符號整數(shù)數(shù)字數(shù)字<變量說明部分VAR<標識符標識符<標識符字母字母>|<數(shù)字<過程說明部分>::=<過程首部><分程序>{;<過程說明部分><過程首部PROCEDURE<標識符《編譯原理PL/0語言的EBNFPL/0語言的EBNF表例:PL/0語言的EBNF表<語句賦值語句|條件語句|當型循環(huán)語句<過程調(diào)用語句|讀語句|寫語句|復合語句|空<賦值語句標識符表達式<復合語句BEGIN<語句{;<語句><條件表達式關系運算符表達式|ODD<表達式<表達式|<項加法運算符><項<因子>::=<標識符|無符號整數(shù)|(’<表達式《編譯原理PL/0語言的EBNF表例PL/0語言的EBNF表例:PL/0語言的EBNF表<加法運算符|<乘法運算符*|《編譯原理<關系運算符|||||<條件語句> IF<條件>THEN<語句<過程調(diào)用語句CALL<標識符<當型循環(huán)語句WHILE<條件DO<語句<讀語句>::=READ(<標識符標識符><寫語句::=WRITE‘(<表達式>{,<表達式>}<字母a|b||X|Y|<數(shù)字0|1|2||8|語言的語義《編譯原理語言的語義《編譯原理類型、上下文約束與作用域規(guī)9位的十進制數(shù)3層PL/0程PL/0程類P-code語一種棧式機的此類棧式機沒有累加器和通用寄存器,有一類P-code語一種棧式機的此類棧式機沒有累加器和通用寄存器,有一存器I,指令地址寄存器P,棧頂寄存器T和基址寄存B),算邏運算都在棧指令格層次差(標識符引用層減去定義層flafla指令0AA等于該過程的局部變量數(shù)加3個特殊的T返回靜態(tài)T..指令0AA等于該過程的局部變量數(shù)加3個特殊的T返回靜態(tài)T.....A-3.指令0置指令地址寄存器P為RA’T=TB=B......指令0置指令地址寄存器P為RA’T=TB=B......指令L調(diào)用地址為A的過程(置指令地址寄存器為L為調(diào)用過程與被調(diào)用過程的層差設置被調(diào)用過程的3個聯(lián)系單元T=B置SLSL’置P為....指令L調(diào)用地址為A的過程(置指令地址寄存器為L為調(diào)用過程與被調(diào)用過程的層差設置被調(diào)用過程的3個聯(lián)系單元T=B置SLSL’置P為......指令0立即數(shù)存入棧頂,即置T所指存儲單元的值為T加指令L將層差為L、指令0立即數(shù)存入棧頂,即置T所指存儲單元的值為T加指令L將層差為L、偏移量為A的存儲單元的值取到棧T加指令LT減指令0指令0指令0指令0數(shù),結果為0;結果值留在棧頂指令0T減指令0T減指令0T指令0T減指令0T減指令0T減指令0T減指令0若相等,結果為0;存結果至次棧頂;T減指令0若不相等,結果為0;存結果至次棧頂;T減指令0若小于,結果為0;存結果至次棧頂;T減指令0若相等,結果為0;存結果至次棧頂;T減指令0若不相等,結果為0;存結果至次棧頂;T減指令0若小于,結果為0;存結果至次棧頂;T減指令0若大于等于,結果為0;存結果至次棧頂;T減指令0若大于,結果為0;存結果至次棧頂;T減指令0若小于等于,結果為0;存結果至次棧頂;T減指令0A,即置指令地址寄存器為指令0若棧頂為指令0A,即置指令地址寄存器為指令0若棧頂為0,則轉移至地址A減器為A指令0減T指令0指令0指令0減T指令0指令0T加類P-解釋ints[stacksize]{enum類P-解釋ints[stacksize]{enumfct /*操作碼/*引用層與聲明層的層差intint /*因不同的f各異}iintp;intint類P-解釋(1)初始類P-解釋(1)初始(2)取指令到指令寄存i=code[p];(3)分析并解釋執(zhí)行指令(4)若程序未結束(p0),轉(5)例constp例constp退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;bt例const例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;pbt例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;pt000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t5p000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;tp5000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t5p5000b例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t055p000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t15p000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t50p00b例const例const常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0pwhileb#0docallp;bt005000例const例const常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0ptwhileb#0docallp;00b5000例const例const常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0t5pwhileb#0docallp;00b5000例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0tpwhileb#0docallp;b5005000例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0twhileb#0docallp;pb005000例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;tpb005000例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t5p000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t25p000b例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t250p00b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t50p00b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t500p0b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t5000pb例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t05000bp例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t0000bp例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;pt0000b例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;tpb00000例const退棧并返回調(diào)用點從命令行讀入值置于棧頂例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;tpb000000例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;tpb00000例const退棧并返回調(diào)用點例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;t0000bp例const例const退棧并返回調(diào)用點從命令行讀入值置于棧頂常數(shù)值2無條件轉到循環(huán)入口(1)jmp0(2)int0(3)lod1(4)lit0(5)opr0(6)sto1(7)opr0(8)int0(9)opr0sto0lod0lit0opr0jpc0cal0lit0lod0opr0opr0opr0opr0sto0jmp0whileb#0docallp;btPL/0編譯程序的詞法詞法分析子程《編譯原理PL/0編譯程序的詞法詞法分析子程《編譯原理getsym(功從當前輸入符號起掃描下一個詞法單位,即通過下列全局變量傳遞單詞的類enum/*al為標識符的最大長度idPL/0編譯程序的詞法單詞類《編PL/0編譯程序的詞法單詞類《編譯原理BEGINENDIFTHEN、運算、、、、:=、=、、、、標識常如:10,25,100界‘)’、PL/0編譯程序的詞法《編譯原理PL/0編譯程序的詞法《編譯原理詞法分析子程序getsym()的處理流從源程序掃描下一個字符(調(diào)用getch子程序忽略空格、換行和TAB(每忽略一個,掃描下一個enum(每掃描過一個字符,調(diào)用一次getch子程序根據(jù)單詞類別設置sym,idPL/0編譯程序的詞法單PL/0編譯程序的詞法單詞的識《編譯原理保留字單詞的識別可以在識別標識符單詞基礎上,再去檢索保留字PL/0編譯程序的詞法實現(xiàn)單詞識別的狀態(tài)轉換《編譯原理空字母字非字母PL/0編譯程序的詞法實現(xiàn)單詞識別的狀態(tài)轉換《編譯原理空字母字非字母數(shù)標識符/保留非負賦值小于等于小于號大于等于大于號單字符符數(shù)數(shù)非數(shù)==非=:<>非,+-(編譯程序的語法分《編譯原編譯程序的語法分《編譯原理功分 源程序的單詞流是否符PL/0報告語法錯產(chǎn)生源程序的語法分析結果,以語法分析樹或編譯程序的語法分《編譯程序的語法分《編譯原理分析方語法分析樹的根節(jié)點為<程序>成源程序的單詞,每個內(nèi)部節(jié)點代表構成源程序的各種不同的語法單位編譯程序的語法分《編譯原理自頂向下分析舉VAR<程序.<分程序<變量說編譯程序的語法分《編譯原理自頂向下分析舉VAR<程序.<分程序<變量說明部分<語句;<復合語句<標識符A<語句<讀語句遞歸下降()<標識符A編譯程序的語法分《編譯程序的語法分《編譯原理實現(xiàn)方遞歸子程序可以自然實現(xiàn)遞歸下降分遞歸下降分析過程從調(diào)用語法單位<程序>應的子程序開始,運行時的調(diào)用關系反映了編譯程序的語法分《編編譯程序的語法分《編譯原理遞歸子程序的設沿語法分析圖箭頭所指方向進行如下工作遇到一個語法單元,調(diào)用相應的子程遇到一個詞法單位,則判斷當前讀入的單詞是否與該詞法單位相匹配,若匹配,再讀取下一個單詞繼續(xù)分析;若不匹配,則進行出錯處理利用EBNF的方法與此相編譯程序的語法分《編譯原理遞歸子程序的設計實編譯程序的語法分《編譯原理遞歸子程序的設計實<表達式|項(+|)<項int{if(sym==plus||sym==minus){/*此時表達式被看作正的或負的項/*處理<項term}{/*/*處理<項term}while(sym==plus||{/*處理<項term}return}編譯程序的語法分《編譯原理遞歸子編譯程序的語法分《編譯原理遞歸子程序的設計實<項因子>(*|)<因子int{/*處理<因子while(sym==times||{factor/*處理<因子}return}編譯程序的語法分《編譯原理遞歸子程序編譯程序的語法分《編譯原理遞歸子程序的設計實<因子>::=<標識符|<無符號整數(shù)|‘(’<表達式‘)int{{/*<因子>為常量或變量if/*<因子>為立即數(shù)if/*<因子>為立即數(shù)elseif{if(sym==rparen)/*提示22號出錯信息:缺少右括號}return}編譯程序的語法分《編譯原理PL/0語法編譯程序的語法分《編譯原理PL/0語法<程序::=<分程序.int{/*初始化/*讀寫文件*//*處理<分程序…if(sym!=/*9號出錯信息:缺少程序…return}編譯程序的語法分《編譯原理主要語法單位相應子程序之間的調(diào)用關<語句<因編譯程序的語法分《編譯原理主要語法單位相應子程序之間的調(diào)用關<語句<因子>編譯程序的語義分《編編譯程序的語義分《編譯原理功借助符號表進行上下文相關的提示語義錯誤編譯程序的語義分《編譯原理符號表編譯程序的語義分《編譯原理符號表結EnumobjectStruct{char/*al-名字最大長度enumobject/*constant標識符的數(shù)值intval;intadr;intsize;/*標識符所在的層,constant標識符不用/*標識符相對地址,constant標識符不用/*需分配的數(shù)據(jù)區(qū)大小,僅procedur標識符用到/*txmax-符號表容量Structtablestruct編譯程序的語義分《編譯編譯程序的語義分《編譯原理符號表結例:右邊程序的說CONSTVARC,D,E;PROCEDUREP;VARG,X,Y,ZNAME:ANAME:NAME:CNAME:NAME:ENAME:NAME:KIND:CONSTANT KIND:CONSTANT KIND:VARIABLELEVEL:LEVADDR:DXKIND:VARIABLELEVEL:LEVADDR:DX+1KIND:VARIABLELEVEL:LEVADDR:KIND:PROCEDURLEVEL:LEV SIZE:KIND:VARIABLELEVEL:LEV+1ADDR:編譯程序的語義分《編譯原理consta=25;varx,y;procedurep;var編譯程序的語義分《編譯原理consta=25;varx,y;procedurep;varz;procedurer;varx,s;varv;符號表與作用域規(guī)例:右邊程序在VAL/t 編譯程序的語義分《編譯原理編譯程序的語義分《編譯原理符號表管-登錄(在符號表中插入一項voidenter(enumobjectk,int*ptx,intlev,int*const,varor當前應分配變量的相對地址,分配后增加/*k:查-intposition(char*idt,int/* 返回所查標識符在符號表棧中的位置,沒查到則返回編譯程序的語義分《編譯原編譯程序的語義分《編譯原理語義處理舉變量聲明語句的處<變量說明部分if(symvarsym){getsymdo;do{var標識符>{,<標識符/*收到變量聲明符號,開始處理變量聲明/*getsym的宏/*見下頁while(sym==comma){getsymdo;}if(symsemicolon){}else}while(sym==}編譯程序的語義分《編譯原理編譯程序的語義分《編譯原理語義處理舉變量聲明語句的處(接上頁intvardeclaration(int*ptx,intlev,int*/*ptx符號表尾位置lev當前層pdx在當前層的偏移量{if(sym==enter(variableptxlevpdx);//填寫名字}{/*var后應是標識符}return}編譯程序的語義分《編譯原編譯程序的語義分《編譯原理變量引用的處語義處理舉若在符號表有過正確定義,檢查引用與說的屬性是否一致,若不一致則報編譯程序的語義分《編譯原理語義處理編譯程序的語義分《編譯原理語義處理舉理(以賦值語ifsymident){/*準備按照賦值語句處理*/i=position(id,*ptx);if(i==/*變量未找到{if(table[i].kind!=variable)/*賦值語句格式錯i=0;{/*生成目標代碼gendo(sto,}}}編譯程序的錯誤處《編譯原理編譯程序的錯誤處《編譯原理錯誤處理的原盡可能準確指出錯誤位置和錯誤屬盡可能進行校PL/0編譯程序的錯誤處短語層恢復(phrase-編譯程序的錯誤處《編譯原理短語層恢在進入某個編譯程序的錯誤處《編譯原理短語層恢在進入某個語法單位時,調(diào)用TEST函數(shù),符號是否屬于該語法單位的開始符號集合在語法單位分析結束時,調(diào)用TEST函數(shù)檢查當前合編譯程序的錯誤處《編譯原理開始符號集合與后跟符號集編譯程序的錯誤處《編譯原理開始符號集合與后跟符號集constvarprocedureidentIfcallbeginwhilereadwrite.identcallifwhileread.;odd+-(identThen+-ident.;)ropendthen項identnumber.;)rop+-endthenidentnumber.;)rop+-*/endthen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論