freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

編譯原理第2版第二章pl_0編譯程序(編輯修改稿)

2025-08-28 17:49 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 pl0 分程序 block 語(yǔ)句 statement 條件 condition 表達(dá)式 expression 項(xiàng) term 因子 factor 語(yǔ) 法 調(diào) 用 關(guān) 系 圖 編譯系統(tǒng)總體流程圖 啟動(dòng)置初值調(diào)用GETSYM取單詞調(diào)用BLOCK過(guò)程當(dāng)前單詞是否為源程序結(jié)束符39。.39。?出錯(cuò)源程序中是否有錯(cuò)誤?調(diào)用解釋過(guò)程INTERPRET解釋執(zhí)行目標(biāo)程序打印錯(cuò)誤結(jié)束NYYN PL/0編譯程序語(yǔ)義分析的設(shè)計(jì)與實(shí)現(xiàn) PL/0編譯程序語(yǔ)法、語(yǔ)義分析的的核心 程序是 BLOCK過(guò)程 哪些語(yǔ)義分析工作? 如何實(shí)現(xiàn)? 語(yǔ)義分析環(huán)境(符號(hào)表) ?說(shuō)明部分的分析 與處理 ?表格管理 ?過(guò)程體 (語(yǔ)句)的分析 與處理 〈 因子 〉 ∷= 〈 標(biāo)識(shí)符 〉 |〈 無(wú)符號(hào)整數(shù) 〉 |‘( ’ 〈 表達(dá)式 〉 ‘) ’ 語(yǔ)義分析 int factor(bool* fsys, int* ptx, int lev) ? { if(sym == ident) /* 因子為常量或變量 */ ? { ? i = position(id, *ptx)。 /* 查找名字 */ ? if (i == 0) ? {error(11)。 /* 標(biāo)識(shí)符未聲明 */ ? } ? else ? {switch (table[i].kind) ? {case constant: /* 名字為常量 */ ? break。 ? case variable: /* 名字為變量 */ ? break。 ? case procedur: /* 名字為過(guò)程 */ ? error(21)。 /* 不能為過(guò)程名 */ ? …… 登錄符號(hào)表 說(shuō)明部分的分析 與處理 對(duì)每個(gè)過(guò)程(含主程序) 說(shuō)明的對(duì)象 ( 變量 , 常量 和 過(guò)程 ) 造符號(hào)表 登錄 標(biāo)識(shí)符的 屬性 。 標(biāo)識(shí)符的屬性 :種類,所在 層次 ,值 和分配的 相對(duì)位置 。 登錄信息由 ENTER過(guò)程完成。 符號(hào)表結(jié)構(gòu) Enum object { constant, variable, procedur }。 Struct tablestruct { char name[al]。 enum object kind。 int val。 int level。 int adr。 int size。 }。 Struct tablestruct table[txmax]。 符號(hào)表結(jié)構(gòu) ?說(shuō)明種類的定義: object= (constant, variable,procedur) ( 定義 純量 /枚舉 類型) ?符號(hào)表的定義 table:array[0..txmax] of record name:alfa。 case kind:object of constant:(val:integer)。 variable:procedur:(level,adr,size: integer)。 NAME : A NAME : B NAME : C NAME : D NAME : E NAME : P KIND : CONSTANT KIND : CONSTANT KIND : VARIABLE KIND : VARIABLE KIND : VARIABLE KIND : PROCEDUR VAL : 35 VAL : 49 LEVEL : LEV LEVEL : LEV LEVEL : LEV LEVEL : LEV ADR : DX ADR : DX+1 ADR : DX+2 ADR : S I Z E : 4 NAME : G …… KIND : VARIABLE …… LEV EL : L E V + 1 …… ADR : DX …… 例程序說(shuō)明部分為: CONST A=35, B=49; VAR C, D, E; PROCEDURE P; VAR G ; … 符號(hào)表 名字 種類 層次 /值 地址 存儲(chǔ)空間 對(duì)應(yīng)名字表 tx : table表的下標(biāo)指針 ,是以 值參數(shù) 形式使用的。 dx: 計(jì)算每個(gè)變量在運(yùn)行棧中相對(duì)本 過(guò)程 基地址 的偏移量 , 放在 table表 中的 adr域, 生成 目標(biāo)代碼 時(shí)再 放在 code中的 a域 變量定義語(yǔ)句的處理 (C) 語(yǔ)法: 變量說(shuō)明部分 : := var 標(biāo)識(shí)符 {, 標(biāo)識(shí)符 }; 程序: if (sym == varsym){ /* 收到變量聲明符號(hào),開始處理變量聲明 */ getsymdo。 do { vardeclarationdo(amp。tx, lev, amp。dx)。 while (sym == ma) { getsymdo。 vardeclarationdo(amp。tx, lev, amp。dx)。 } if (sym == semicolon){ getsymdo。 }else error(5)。 } while (sym == ident)。 } 注意: amp。tx 變量說(shuō)明處理 (C) int vardeclaration(int* ptx,int lev,int* pdx) { if (sym == ident){ enter(variable, ptx, lev, pdx)。//填寫名字表 getsymdo。 }else { error(4)。 /* var后應(yīng)是標(biāo)識(shí) 符 */ } return 0。 } 變量定義語(yǔ)句的處理 語(yǔ)法: 變量說(shuō)明部分 : := var 標(biāo)識(shí)符 {, 標(biāo)識(shí)符 }; 程序: if sym=varsym then begin getsym。 repeat vardeclaration。(*變量說(shuō)明處理 *) while sym=ma do begin getsym。 vardeclaration end。 if sym=semicolon then getsym else error(5) until symident。 end。 變量說(shuō)明處理 procedure vardeclaration。 begin if sym=ident then begin enter(variable)。 getsym end else error(4) end(*vardeclaration*)。 過(guò)程 ENTER的實(shí)現(xiàn) (C) /* * 在名字表中加入一項(xiàng) * * k: 名字種類 const,var or procedure * ptx: 名字表尾指針的指針 * lev: 名字所在的層次 ,以后所有的 lev都是這樣 * pdx: 當(dāng)前應(yīng)分配變量的相對(duì)地址,分配后增加 1 */ void enter(enum object k, int* ptx, int lev, int* pdx) 過(guò)程 ENTER的實(shí)現(xiàn) (C) { (*ptx)++。 strcpy(table[(*ptx)].name, id)。 /* 全局變量 id中已存有當(dāng)前名字的名字 */ table[(*ptx)].kind = k。 switch (k){ case constant: /* 常量名字 */ if (num amax) { error(31)。/* 數(shù)越界 */ num = 0。 } table[(*ptx)].val = num。 break。 過(guò)程 ENTER的實(shí)現(xiàn) (C) case variable: /* 變量名字 */ table[(*ptx)].level = lev。 table[(*ptx)].adr = (*pdx)。 (*pdx)++。 break。 case procedur: /* 過(guò)程名字 */ table[(*ptx)].level = lev。 break。 } } 過(guò)程 ENTER的實(shí)現(xiàn) tx : table表的指針 procedure enter(k:object )。 begin (* enter object into table *) tx:=tx+1。 with table[tx] do (* 開域 語(yǔ)句 *) begin name:=id。(* 表示 table[tx].name:=id。*) kind:=k。(* 表示 table[tx].kind:=k。* ) 過(guò)程 ENTER的實(shí)現(xiàn) case k of constant: begin if numamax then begin error(31)。 num:=0。 end。 val:=num。(* table[tx].val:=num。*) end。 過(guò)程 ENTER的實(shí)現(xiàn) variable: begin level:=lev。 ( *表示 table[tx].level:=lev*) adr:=dx。 ( *表示 table[tx].adr:=dx*) dx:=dx+1。 end。 procedur: level:=lev (* 表示 table[tx].level:=lev。*) end(* case *)。 end end(*enter*)。 過(guò)程體的處理 /* * 編譯程序主體 * * lev: 當(dāng)前分程序所在層 * tx: 名字表當(dāng)前尾指針 * fsys: 當(dāng)前模塊后跟符號(hào)集合 */ int block(int lev, int tx, bool* fsys) 過(guò)程體的處理 ......//main()函數(shù) if(1 == block(0, 0, nxtlev)){ ...... } ...... if (sym != period) error(9)。 ...... interpret()。/* 調(diào)用解釋執(zhí)行程序 */ ...... 過(guò)程體的處理 while (sym == procsym) // block()函數(shù) { getsymdo。 if (sym == ident){ enter(procedur, amp。tx, lev, amp。dx)。 ..... }
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1