亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? pl-0語(yǔ)言編譯程序分析.htm

?? PL-0語(yǔ)言編譯程序分析
?? HTM
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
        if ch = '>' then (* 如果讀到大于號(hào),處理過(guò)程類似于處理小于號(hào) *)
        begin
          getch; (* 再讀一個(gè)字符 *)
          if ch = '=' then (* 如果讀到等號(hào) *)
          begin
            sym := geq; (* 購(gòu)成一個(gè)大于等于號(hào) *)
            getch (* 讀一個(gè)字符 *)
          end
          else (* 如果大于號(hào)后不是跟的等號(hào) *)
            sym := gtr (* 那就是一個(gè)單獨(dú)的大于號(hào) *)
        end
        else(* 如果讀到不是字母也不是數(shù)字也不是冒號(hào)也不是小于號(hào)也不是大于號(hào) *)
        begin (* 那就說(shuō)明它不是標(biāo)識(shí)符/保留字,也不是復(fù)雜的雙字節(jié)操作符,應(yīng)該是一個(gè)普通的符號(hào) *)
          sym := ssym[ch]; (* 直接成符號(hào)表中查到它的類型,賦給sym *)
          getch (* 讀下一個(gè)字符 *)
        end 
  (* 整個(gè)if語(yǔ)句判斷結(jié)束 *)
end (* getsym *);
(* 詞法分析過(guò)程getsym總結(jié):從源文件中讀出若干有效字符,組成一個(gè)token串,識(shí)別它的類型
   為保留字/標(biāo)識(shí)符/數(shù)字或是其它符號(hào)。如果是保留字,把sym置成相應(yīng)的保留字類型,如果是
   標(biāo)識(shí)符,把sym置成ident表示是標(biāo)識(shí)符,于此同時(shí),id變量中存放的即為保留字字符串或標(biāo)識(shí)
   符名字。如果是數(shù)字,把sym置為number,同時(shí)num變量中存放該數(shù)字的值。如果是其它的操作符,
   則直接把sym置成相應(yīng)類型。經(jīng)過(guò)本過(guò)程后ch變量中存放的是下一個(gè)即將被識(shí)別的字符 *)
(* 目標(biāo)代碼生成過(guò)程gen *)
(* 參數(shù):x:要生成的一行代碼的助記符 *)
(*       y, z:代碼的兩個(gè)操作數(shù) *)
(* 本過(guò)程用于把生成的目標(biāo)代碼寫入目標(biāo)代碼數(shù)組,供后面的解釋器解釋執(zhí)行 *)
procedure gen(x: fct; y, z: integer);
begin
  if cx > cxmax then (* 如果cx>cxmax表示當(dāng)前生成的代碼行號(hào)大于允許的最大代碼行數(shù) *)
  begin
    write('program too long'); (* 輸出"程序太長(zhǎng)",退出 *)
    close(fa);
    close(fa1);
    close(fin);
    halt(0)       
    {goto 99}
    (* 我修改的代碼,由于Turbo Pascal 7.0中不允許跨過(guò)程的goto,就只能用上面的方法退出程序了。 *)
  end;
  with code[cx] do (* 把代碼寫入目標(biāo)代碼數(shù)組的當(dāng)前cx所指位置 *)
  begin
    f := x;
    l := y;
    a := z;
  end;
  cx := cx + 1 (* 移動(dòng)cx指針指向下一個(gè)空位 *)
end (* gen *);
(* 測(cè)試當(dāng)前單詞是否合法過(guò)程test *)
(* 參數(shù):s1:當(dāng)語(yǔ)法分析進(jìn)入或退出某一語(yǔ)法單元時(shí)當(dāng)前單詞符合應(yīng)屬于的集合 *)
(*       s2:在某一出錯(cuò)狀態(tài)下,可恢復(fù)語(yǔ)法分析正常工作的補(bǔ)充單詞集合 *)
(*       n:出錯(cuò)信息編號(hào),當(dāng)當(dāng)前符號(hào)不屬于合法的s1集合時(shí)發(fā)出的出錯(cuò)信息 *)
procedure test(s1, s2: symset; n: integer);
begin
  if not (sym in s1) then (* 如果當(dāng)前符號(hào)不在s1中 *)
  begin
    error(n); (* 發(fā)出n號(hào)錯(cuò)誤 *)
    s1 := s1 + s2; (* 把s2集合補(bǔ)充進(jìn)s1集合 *)
    while not (sym in s1) do (* 通過(guò)循環(huán)找到下一個(gè)合法的符號(hào),以恢復(fù)語(yǔ)法分析工作 *)
      getsym
  end
end (* test *);
(* 語(yǔ)法分析過(guò)程block *)
(* 參數(shù):lev:這一次語(yǔ)法分析所在的層次 *)
(*       tx:符號(hào)表指針 *)
(*       fsys:用于出錯(cuò)恢復(fù)的單詞集合 *)
procedure block(lev, tx: integer; fsys: symset);
var 
  dx: integer; (* data allocation index *) (* 數(shù)據(jù)段內(nèi)存分配指針,指向下一個(gè)被分配空間在數(shù)據(jù)段中的偏移位置 *)
  tx0: integer;  (* initial table index *) (* 記錄本層開(kāi)始時(shí)符號(hào)表位置 *)
  cx0: integer;  (* initial code index *) (* 記錄本層開(kāi)始時(shí)代碼段分配位置 *)
  (* 登陸符號(hào)表過(guò)程enter *)
  (* 參數(shù):k:欲登陸到符號(hào)表的符號(hào)類型 *)
  procedure enter(k: object1);
  begin (* enter object into table *)
    tx := tx + 1; (* 符號(hào)表指針指向一個(gè)新的空位 *)
    with table[tx] do (* 開(kāi)始登錄 *)
    begin
      name := id; (* name是符號(hào)的名字,對(duì)于標(biāo)識(shí)符,這里就是標(biāo)識(shí)符的名字 *)
      kind := k; (* 符號(hào)類型,可能是常量、變量或過(guò)程名 *)
      case k of (* 根據(jù)不同的類型進(jìn)行不同的操作 *)
        constant: (* 如果是常量名 *)
        begin
          if num > amax then (* 在常量的數(shù)值大于允許的最大值的情況下 *)
          begin
            error(31); (* 拋出31號(hào)錯(cuò)誤 *)
            num := 0; (* 實(shí)際登陸的數(shù)字以0代替 *)
          end;
          val := num (* 如是合法的數(shù)值,就登陸到符號(hào)表 *)
        end;
        variable: (* 如果是變量名 *)
        begin
          level := lev; (* 記下它所屬的層次號(hào) *)
          adr := dx; (* 記下它在當(dāng)前層中的偏移量 *)
          dx := dx+1; (* 偏移量自增一,為下一次做好準(zhǔn)備 *)
        end;
        procedur: (* 如果要登陸的是過(guò)程名 *)
          level := lev (* 記錄下這個(gè)過(guò)程所在層次 *)
      end
    end
  end (* enter *);
  (* 登錄符號(hào)過(guò)程沒(méi)有考慮到重復(fù)的定義的問(wèn)題。如果出現(xiàn)重復(fù)定義,則以最后一次的定義為準(zhǔn)。 *)
  
  (* 在符號(hào)表中查找指定符號(hào)所在位置的函數(shù)position *)
  (* 參數(shù):id:要找的符號(hào) *)
  (* 返回值:要找的符號(hào)在符號(hào)表中的位置,如果找不到就返回0 *)
  function position (id: alfa): integer;
  var 
    i: integer;
  begin (* find identifier in table *)
    table[0].name := id; (* 先把id放入符號(hào)表0號(hào)位置 *)
    i := tx; (* 從符號(hào)表中當(dāng)前位置也即最后一個(gè)符號(hào)開(kāi)始找 *)
    while table[i].name <> id do (* 如果當(dāng)前的符號(hào)與要找的不一致 *)
      i := i - 1; (* 找前面一個(gè) *)
    position := i (* 返回找到的位置號(hào),如果沒(méi)找到則一定正好為0 *)
  end(* position *);
  (* 常量聲明處理過(guò)程constdeclaration *)
  procedure constdeclaration;
  begin
    if sym = ident then (* 常量聲明過(guò)程開(kāi)始遇到的第一個(gè)符號(hào)必然應(yīng)為標(biāo)識(shí)符 *)
    begin
      getsym; (* 獲取下一個(gè)token *)
      if sym in [eql, becomes] then (* 如果是等號(hào)或賦值號(hào) *)
      begin
        if sym = becomes then (* 如果是賦值號(hào)(常量生明中應(yīng)該是等號(hào)) *)
          error(1); (* 拋出1號(hào)錯(cuò)誤 *)
        (* 這里其實(shí)自動(dòng)進(jìn)行了錯(cuò)誤糾正使編譯繼續(xù)進(jìn)行,把賦值號(hào)當(dāng)作等號(hào)處理 *)
        getsym; (* 獲取下一個(gè)token,等號(hào)或賦值號(hào)后應(yīng)接上數(shù)字 *)
        if sym = number then (* 如果的確是數(shù)字 *) 
        begin
          enter(constant); (* 把這個(gè)常量登陸到符號(hào)表 *)
          getsym (* 獲取下一個(gè)token,為后面作準(zhǔn)備 *)
        end
        else
          error(2) (* 如果等號(hào)后接的不是數(shù)字,拋出2號(hào)錯(cuò)誤 *)
      end
      else
        error(3) (* 如果常量標(biāo)識(shí)符后接的不是等號(hào)或賦值號(hào),拋出3號(hào)錯(cuò)誤 *)
    end
    else
      error(4) (* 如果常量聲明過(guò)程遇到的第一個(gè)符號(hào)不為標(biāo)識(shí)符,拋出4號(hào)錯(cuò)誤 *)
  end(* constdeclaration *);
  (* 變量聲明過(guò)程vardeclaration *)  
  procedure vardeclaration;
  begin
    if sym = ident then (* 變量聲明過(guò)程開(kāi)始遇到的第一個(gè)符號(hào)必然應(yīng)為標(biāo)識(shí)符 *)
    begin
      enter(variable); (* 將標(biāo)識(shí)符登陸到符號(hào)表中 *)
      getsym (* 獲取下一個(gè)token,為后面作準(zhǔn)備 *)
    end
    else
      error(4) (* 如果變量聲明過(guò)程遇到的第一個(gè)符號(hào)不是標(biāo)識(shí)符,拋出4號(hào)錯(cuò)誤 *)
  end(* vardeclaration *);
  (* 列出當(dāng)前一層類PCODE目標(biāo)代碼過(guò)程listcode *) 
  procedure listcode;
  var 
    i: integer;
  begin (* list code generated for this block *)
    if listswitch then (* 如果用戶選擇是要列出代碼的情況下才列出代碼 *)
    begin
      for i := cx0 to cx - 1 do (* 從當(dāng)前層代碼開(kāi)始位置到當(dāng)前代碼位置-1處,即為本分程序塊 *)
        with code[i] do
        begin
          writeln(i: 4, mnemonic[f]: 5, l: 3, a: 5); (* 顯示出第i行代碼的助記符和L與A操作數(shù) *)
          (* 我修改的代碼:原程序此處在輸出i時(shí),沒(méi)有指定占4個(gè)字符寬度,不美觀也與下面一句不配套。 *)
          writeln(fa, i: 4, mnemonic[f]: 5, l: 3, a: 5) (* 同時(shí)把屏顯打印到文件 *)
        end;
    end
  end(* listcode *);
  (* 語(yǔ)句處理過(guò)程statement *)
  (* 參數(shù)說(shuō)明:fsys: 如果出錯(cuò)可用來(lái)恢復(fù)語(yǔ)法分析的符號(hào)集合 *)
  procedure statement(fsys: symset);
  var 
    i, cx1, cx2: integer;
    (* 表達(dá)式處理過(guò)程expression *)
    (* 參數(shù)說(shuō)明:fsys: 如果出錯(cuò)可用來(lái)恢復(fù)語(yǔ)法分析的符號(hào)集合 *)
    procedure expression(fsys: symset);
    var 
      addop: symbol;
      (* 項(xiàng)處理過(guò)程term *)
      (* 參數(shù)說(shuō)明:fsys: 如果出錯(cuò)可用來(lái)恢復(fù)語(yǔ)法分析的符號(hào)集合 *)
      procedure term(fsys: symset);
      var 
        mulop: symbol;
        (* 因子處理過(guò)程factor *)

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本在线看| 日韩欧美高清一区| www国产成人| 夜夜揉揉日日人人青青一国产精品| 国产一区二区三区不卡在线观看| 欧美自拍偷拍一区| 日本一区二区三区久久久久久久久不| 日韩中文欧美在线| 色噜噜狠狠成人网p站| 国产日韩欧美麻豆| 久久精品国产网站| 欧美日精品一区视频| 亚洲视频综合在线| 国产伦精品一区二区三区在线观看| 精品视频123区在线观看| 国产精品久久久久久福利一牛影视 | 成人综合婷婷国产精品久久| 日韩三级视频在线观看| 亚洲高清视频在线| 91在线无精精品入口| 久久久99久久| 麻豆成人久久精品二区三区红| 91国产丝袜在线播放| 国产精品婷婷午夜在线观看| 国产一区91精品张津瑜| 日韩三级在线免费观看| 人人爽香蕉精品| 欧美喷水一区二区| 亚洲小说欧美激情另类| 在线观看欧美黄色| 亚洲人成电影网站色mp4| caoporn国产精品| 日本一区二区免费在线| 国产aⅴ精品一区二区三区色成熟| 欧美成人精品福利| 美女在线一区二区| 日韩一区二区免费电影| 日本不卡不码高清免费观看| 91精品视频网| 美女尤物国产一区| 欧美mv和日韩mv的网站| 国内精品伊人久久久久av一坑 | 日韩小视频在线观看专区| 天天亚洲美女在线视频| 制服丝袜激情欧洲亚洲| 五月激情综合网| 欧美高清www午色夜在线视频| 日韩高清不卡在线| 欧美一区二区日韩一区二区| 天堂va蜜桃一区二区三区| 制服丝袜亚洲网站| 麻豆91小视频| 久久婷婷国产综合国色天香| 六月丁香综合在线视频| www国产精品av| 国产91丝袜在线观看| 中文字幕一区二区三区av| www.66久久| 一区二区三区色| 欧美精品一二三区| 精品一区二区三区欧美| 久久精品男人天堂av| 成人国产在线观看| 一区二区三区在线观看欧美| 欧美日韩午夜影院| 麻豆免费精品视频| 国产肉丝袜一区二区| 成人免费视频一区| 亚洲精品乱码久久久久久久久 | 国产精品白丝jk白祙喷水网站 | 欧美一区二区三区啪啪| 国精品**一区二区三区在线蜜桃| 国产日韩欧美麻豆| 91久久线看在观草草青青| 日韩精品一区第一页| 精品国精品国产| 粉嫩aⅴ一区二区三区四区 | 国产视频一区二区在线观看| 91一区二区在线| 婷婷中文字幕综合| 欧美精品一区在线观看| 99久久精品99国产精品| 亚洲成av人**亚洲成av**| 欧美成人综合网站| 成人网在线播放| 亚洲午夜久久久久久久久电影院| 日韩精品中文字幕一区二区三区 | 国产一区亚洲一区| 国产精品久久久久久久久免费相片| 在线视频一区二区三| 极品瑜伽女神91| 亚洲色图.com| 日韩一级高清毛片| 成人国产视频在线观看| 日本va欧美va欧美va精品| 国产精品青草久久| 777色狠狠一区二区三区| 国产成人aaa| 丝袜美腿亚洲综合| 国产精品视频一二| 在线播放日韩导航| 成人免费视频网站在线观看| 日本成人在线网站| 日韩毛片精品高清免费| 精品国产精品网麻豆系列| 91免费国产在线| 久久爱www久久做| 一区二区三区四区国产精品| 久久男人中文字幕资源站| 欧美性色欧美a在线播放| 国产成人综合亚洲91猫咪| 视频一区二区三区入口| 亚洲欧美日韩久久| 久久久不卡网国产精品一区| 欧美日韩国产一级| 99精品欧美一区二区三区小说| 麻豆成人久久精品二区三区红 | 综合中文字幕亚洲| 精品欧美久久久| 欧美日韩高清影院| 91麻豆精东视频| 国产麻豆视频精品| 麻豆一区二区在线| 五月婷婷激情综合网| **欧美大码日韩| 久久久久久日产精品| 欧美一区二区三区人| 欧美色网一区二区| 99精品视频免费在线观看| 国产激情视频一区二区在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲国产视频一区| 亚洲人成伊人成综合网小说| 中文字幕久久午夜不卡| 欧美大尺度电影在线| 欧美精品777| 欧美在线观看一区| 91久久一区二区| 色综合av在线| 成人妖精视频yjsp地址| 99久久伊人精品| 婷婷中文字幕综合| 一片黄亚洲嫩模| 亚洲素人一区二区| 国产精品网站在线播放| 国产午夜精品一区二区三区嫩草| 欧美mv日韩mv亚洲| 欧美一级黄色大片| 欧美一二三区精品| 4438x成人网最大色成网站| 欧美日韩精品久久久| 欧美性xxxxxxxx| 欧美三级中文字幕在线观看| 欧洲av在线精品| 欧美中文字幕亚洲一区二区va在线 | 亚洲精品乱码久久久久久久久| 亚洲欧洲一区二区在线播放| 国产精品九色蝌蚪自拍| 国产精品网站在线| 亚洲欧美在线aaa| 中文字幕欧美一区| 亚洲精品免费在线播放| 亚洲免费高清视频在线| 亚洲综合色噜噜狠狠| 亚洲一二三四在线| 亚洲国产精品人人做人人爽| 亚洲电影中文字幕在线观看| 性感美女久久精品| 日av在线不卡| 狠狠色狠狠色合久久伊人| 国产一区二区三区日韩| 国产电影精品久久禁18| av在线播放成人| 在线视频亚洲一区| 6080国产精品一区二区| 精品国产乱码久久久久久免费| 久久久久久久电影| 中文字幕亚洲一区二区va在线| 一区二区在线看| 天堂成人国产精品一区| 国产在线播放一区三区四| 成人午夜电影网站| 色综合视频一区二区三区高清| 欧美色中文字幕| 日韩免费在线观看| 久久久高清一区二区三区| 亚洲人快播电影网| 五月综合激情网| 国产真实乱偷精品视频免| 成人黄色在线看| 欧美性一区二区| 日韩一区二区精品在线观看| 一区二区三区视频在线看| 日本不卡一区二区三区高清视频| 黑人巨大精品欧美黑白配亚洲| 成人国产免费视频| 欧美日韩亚洲综合在线| 26uuu亚洲| 亚洲欧美日韩国产手机在线| 日本不卡视频在线|