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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pl-0語言編譯程序分析.htm

?? PL-0語言編譯程序分析
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
        (* 參數說明:fsys: 如果出錯可用來恢復語法分析的符號集合 *)
        procedure factor(fsys: symset);
        var 
          i: integer;
        begin
          test(facbegsys, fsys, 24); (* 開始因子處理前,先檢查當前token是否在facbegsys集合中。 *)
                                     (* 如果不是合法的token,拋24號錯誤,并通過fsys集恢復使語法處理可以繼續進行 *)         
          while sym in facbegsys do (* 循環處理因子 *)
          begin
            if sym = ident then (* 如果遇到的是標識符 *)
            begin
              i := position(id); (* 查符號表,找到當前標識符在符號表中的位置 *)
              if i = 0 then (* 如果查符號表返回為0,表示沒有找到標識符 *)
                error(11) (* 拋出11號錯誤 *)
              else
                with table[i] do (* 如果在符號表中找到了當前標識符的位置,開始生成相應代碼 *)
                  case kind of
                    constant: gen(lit, 0, val); (* 如果這個標識符對應的是常量,值為val,生成lit指令,把val放到棧頂 *)
                    variable: gen(lod, lev - level, adr); (* 如果標識符是變量名,生成lod指令, *)
                                                          (* 把位于距離當前層level的層的偏移地址為adr的變量放到棧頂 *)
                    procedur: error(21) (* 如果在因子處理中遇到的標識符是過程名,出錯了,拋21號錯 *)
                  end;
              getsym (* 獲取下一token,繼續循環處理 *)
            end
            else
              if sym = number then (* 如果因子處理時遇到數字 *)
              begin
                if num > amax then (* 如果數字的大小超過允許最大值amax *)
                begin
                  error(31); (* 拋出31號錯 *)
                  num := 0 (* 把數字按0值處理 *)
                end;
                gen(lit, 0, num); (* 生成lit指令,把這個數值字面常量放到棧頂 *)
                getsym (* 獲取下一token *)
              end
              else
                if sym = lparen then (* 如果遇到的是左括號 *)
                begin
                  getsym; (* 獲取一個token *)
                  expression( [rparen] + fsys ); (* 遞歸調用expression子程序分析一個子表達式 *)
                  if sym = rparen then (* 子表達式分析完后,應遇到右括號 *)
                    getsym (* 如果的確遇到右括號,讀取下一個token *)
                  else
                    error(22) (* 否則拋出22號錯誤 *)
                end;
            test(fsys, facbegsys, 23) (* 一個因子處理完畢,遇到的token應在fsys集合中 *)
                                      (* 如果不是,拋23號錯,并找到下一個因子的開始,使語法分析可以繼續運行下去 *)
          end
        end(* factor *);
      begin (* term *)
        factor([times, slash] + fsys); (* 每一個項都應該由因子開始,因此調用factor子程序分析因子 *)
        while sym in [times, slash] do (* 一個因子后應當遇到乘號或除號 *)
        begin
          mulop := sym; (* 保存當前運算符 *)
          getsym; (* 獲取下一個token *)
          factor(fsys + [times, slash]); (* 運算符后應是一個因子,故調factor子程序分析因子 *)
          if mulop = times then (* 如果剛才遇到乘號 *)
            gen(opr, 0, 4) (* 生成乘法指令 *)
          else
            gen(opr, 0, 5) (* 不是乘號一定是除號,生成除法指令 *)
        end
      end (* term *);
    begin (* expression *)
      if sym in [plus, minus] then (* 一個表達式可能會由加號或減號開始,表示正負號 *)
      begin
        addop := sym; (* 把當前的正號或負號保存起來,以便下面生成相應代碼 *)
        getsym; (* 獲取一個token *)
        term(fsys + [plus, minus]); (* 正負號后面應該是一個項,調term子程序分析 *)
        if addop = minus then (* 如果保存下來的符號是負號 *)
          gen(opr, 0, 1) (* 生成一條1號操作指令:取反運算 *)
        (* 如果不是負號就是正號,不需生成相應的指令 *)
      end
      else (* 如果不是由正負號開頭,就應是一個項開頭 *)
        term(fsys + [plus, minus]); (* 調用term子程序分析項 *) 
      while sym in [plus, minus] do (* 項后應是加運算或減運算 *)
      begin
        addop := sym; (* 把運算符保存下來 *)
        getsym; (* 獲取下一個token,加減運算符后應跟的是一個項 *)
        term(fsys + [plus, minus]); (* 調term子程序分析項 *)
        if addop = plus then (* 如果項與項之間的運算符是加號 *)
          gen(opr, 0, 2) (* 生成2號操作指令:加法 *)
        else (* 否則是減法 *)
          gen(opr, 0, 3) (* 生成3號操作指令:減法 *)
      end
    end (* expression *);
    (* 條件處理過程condition *)
    (* 參數說明:fsys: 如果出錯可用來恢復語法分析的符號集合 *)
    procedure condition(fsys: symset);
    var 
      relop: symbol; (* 用于臨時記錄token(這里一定是一個二元邏輯運算符)的內容 *)
    begin
      if sym = oddsym then (* 如果是odd運算符(一元) *)
      begin
        getsym; (* 獲取下一個token *)
        expression(fsys); (* 對odd的表達式進行處理計算 *)
        gen(opr, 0, 6); (* 生成6號操作指令:奇偶判斷運算 *)
      end
      else (* 如果不是odd運算符(那就一定是二元邏輯運算符) *)
      begin
        expression([eql, neq, lss, leq, gtr, geq] + fsys); (* 對表達式左部進行處理計算 *)
        if not (sym in [eql, neq, lss, leq, gtr, geq]) then (* 如果token不是邏輯運算符中的一個 *)
          error(20) (* 拋出20號錯誤 *)
        else
        begin
          relop := sym; (* 記錄下當前的邏輯運算符 *)
          getsym; (* 獲取下一個token *)
          expression(fsys); (* 對表達式右部進行處理計算 *)
          case relop of (* 如果剛才的運算符是下面的一種 *)
            eql: gen(opr, 0, 8); (* 等號:產生8號判等指令 *)
            neq: gen(opr, 0, 9); (* 不等號:產生9號判不等指令 *)
            lss: gen(opr, 0, 10); (* 小于號:產生10號判小指令 *)
            geq: gen(opr, 0, 11); (* 大于等號號:產生11號判不小于指令 *)
            gtr: gen(opr, 0, 12); (* 大于號:產生12號判大于指令 *)
            leq: gen(opr, 0, 13); (* 小于等于號:產生13號判不大于指令 *)
          end
        end
      end
    end (* condition *);
  begin (* statement *)
    if sym = ident then (* 所謂"語句"可能是賦值語句,以標識符開頭 *)
    begin
      i := position(id); (* 在符號表中查到該標識符所在位置 *)
      if i = 0 then (* 如果沒找到 *)
        error(11) (* 拋出11號錯誤 *)
      else
        if table[i].kind <> variable then (* 如果在符號表中找到該標識符,但該標識符不是變量名 *) 
        begin
          error(12); (* 拋出12號錯誤 *)
          i := 0 (* i置0作為錯誤標志 *)
        end;
      getsym; (* 獲得下一個token,正常應為賦值號 *)
      if sym = becomes then (* 如果的確為賦值號 *)
        getsym (* 獲取下一個token,正常應為一個表達式 *)
      else
        error(13); (* 如果賦值語句的左部標識符號后所接不是賦值號,拋出13號錯誤 *)
      expression(fsys); (* 處理表達式 *)
      if i <> 0 then (* 如果不曾出錯,i將不為0,i所指為當前語名左部標識符在符號表中的位置 *)
        with table[i] do
          gen(sto, lev - level, adr) (* 產生一行把表達式值寫往指定內存的sto目標代碼 *)
    end
    else
      if sym = readsym then (* 如果不是賦值語句,而是遇到了read語句 *)
      begin
        getsym; (* 獲得下一token,正常情況下應為左括號 *)
        if sym <> lparen then (* 如果read語句后跟的不是左括號 *)
          error(34) (* 拋出34號錯誤 *)
        else
          repeat (* 循環得到read語句括號中的參數表,依次產生相應的“從鍵盤讀入”目標代碼 *)
            getsym; (* 獲得一個token,正常應是一個變量名 *)
            if sym = ident then (* 如果確為一個標識符 *) 
            (* 這里略有問題,還應判斷一下這個標識符是不是變量名,如果是常量名或過程名應出錯 *)
              i := position(id) (* 查符號表,找到它所在位置給i,找不到時i會為0 *)
            else
              i := 0; (* 不是標識符則有問題,i置0作為出錯標志 *)
            if i = 0 then (* 如果有錯誤 *)
              error(35) (* 拋出35號錯誤 *)
            else (* 否則生成相應的目標代碼 *)
              with table[i] do
              begin
                gen(opr, 0, 16); (* 生成16號操作指令:從鍵盤讀入數字 *)
                gen(sto, lev - level, adr) (* 生成sto指令,把讀入的值存入指定變量所在的空間 *)
              end;
            getsym (* 獲取下一個token,如果是逗號,則read語還沒完,否則應當是右括號 *)
          until sym <> comma; (* 不斷生成代碼直到read語句的參數表中的變量遍歷完為止,這里遇到不是逗號,應為右括號 *)
        if sym <> rparen then (* 如果不是我們預想中的右括號 *)
        begin
          error(33); (* 拋出33號錯誤 *)
          while not (sym in fsys) do (* 依靠fsys集,找到下一個合法的token,恢復語法分析 *)
            getsym
        end
        else
          getsym (* 如果read語句正常結束,得到下一個token,一般為分號或end *)
      end
      else
        if sym = writesym then (* 如果遇到了write語句 *)
        begin
          getsym; (* 獲取下一token,應為左括號 *)
          if sym = lparen then (* 如確為左括號 *)
          begin
            repeat (* 依次獲取括號中的每一個值,進行輸出 *)
              getsym; (* 獲得一個token,這里應是一個標識符 *)
              expression([rparen, comma] + fsys); (* 調用expression過程分析

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品1区2区| 日韩一区二区在线看片| 国产大陆a不卡| 久久爱www久久做| 久久爱www久久做| 国产一区二区三区免费播放 | 最新日韩av在线| 日韩一区日韩二区| 亚洲五码中文字幕| 免费人成网站在线观看欧美高清| 久久99在线观看| 国产毛片精品视频| 白白色 亚洲乱淫| 欧美性视频一区二区三区| 欧美午夜在线一二页| 欧美一区二区三区免费大片| 亚洲精品一区在线观看| 欧美国产日韩a欧美在线观看 | 国产v日产∨综合v精品视频| 粉嫩绯色av一区二区在线观看 | 精品剧情在线观看| 国产片一区二区三区| 亚洲免费av高清| 蜜桃视频一区二区| 国产成人午夜高潮毛片| 欧美主播一区二区三区| 日韩精品在线看片z| 国产精品视频yy9299一区| 亚洲国产aⅴ天堂久久| 亚洲成人激情自拍| 国产精品1区2区| 欧美人妇做爰xxxⅹ性高电影| 精品欧美一区二区久久| 亚洲精品中文字幕在线观看| 久久成人免费日本黄色| 91丨九色丨尤物| 日韩女优视频免费观看| 中文字幕综合网| 精久久久久久久久久久| 91国产福利在线| 国产亚洲一区二区三区在线观看| 亚洲一区二区免费视频| 国产东北露脸精品视频| 欧美喷潮久久久xxxxx| 欧美激情中文字幕| 免费在线观看精品| 色琪琪一区二区三区亚洲区| 久久午夜老司机| 天天影视色香欲综合网老头| 91偷拍与自偷拍精品| 久久久.com| 黄一区二区三区| 制服丝袜成人动漫| 亚洲综合在线五月| 97se亚洲国产综合自在线| 欧美精品一区二区三| 日韩精品1区2区3区| 欧美主播一区二区三区| 亚洲欧美偷拍卡通变态| 成人久久久精品乱码一区二区三区 | 精品福利一二区| 青青草国产成人99久久| 欧美日韩一区 二区 三区 久久精品| 国产精品美女久久久久aⅴ国产馆| 蜜臀av一区二区三区| 欧美日韩一区高清| 亚洲最新视频在线观看| 91视视频在线直接观看在线看网页在线看| 久久综合狠狠综合久久综合88| 日韩国产高清影视| 欧美男女性生活在线直播观看| 亚洲人妖av一区二区| 不卡一卡二卡三乱码免费网站| 国产免费观看久久| 粉嫩av亚洲一区二区图片| www亚洲一区| 粉嫩aⅴ一区二区三区四区五区| 久久久91精品国产一区二区三区| 国产精品一区免费视频| 中国av一区二区三区| 成年人网站91| 有码一区二区三区| 欧美日韩免费视频| 日韩电影一区二区三区四区| 欧美mv和日韩mv的网站| 国产一区久久久| 中文字幕一区二区在线播放| 99精品欧美一区| 亚洲国产日韩a在线播放| 欧美精品黑人性xxxx| 久久97超碰国产精品超碰| 久久伊人蜜桃av一区二区| 国产不卡高清在线观看视频| 亚洲欧洲中文日韩久久av乱码| 欧美色欧美亚洲另类二区| 日韩av中文在线观看| 国产午夜亚洲精品不卡| 91视频一区二区| 日韩电影免费一区| 久久久久久久久久久久电影| 成人97人人超碰人人99| 天天av天天翘天天综合网色鬼国产| 日韩视频国产视频| av亚洲精华国产精华| 日韩国产成人精品| 国产精品二三区| 日韩一级片在线观看| 成人动漫一区二区三区| 亚洲高清不卡在线观看| 久久精品夜色噜噜亚洲aⅴ| 91免费国产视频网站| 免费成人在线播放| 玉米视频成人免费看| 久久久精品中文字幕麻豆发布| 91久久线看在观草草青青| 精品在线免费视频| 亚洲一区二区三区四区在线免费观看 | 中文字幕av不卡| 7777精品伊人久久久大香线蕉经典版下载 | 天堂av在线一区| 国产网站一区二区| 91麻豆精品国产91久久久久 | 欧美激情综合五月色丁香| 7777精品伊人久久久大香线蕉 | 国产成人精品在线看| 日韩精品一二三| 亚洲精品视频自拍| 欧美激情在线看| 欧美精品一区男女天堂| 在线观看视频91| 成人在线一区二区三区| 美女www一区二区| 亚洲一区二区视频在线观看| 国产精品午夜春色av| 欧美成人精品1314www| 欧美蜜桃一区二区三区 | 日韩和欧美一区二区| 亚洲色图视频免费播放| 久久久久久久久99精品| 日韩视频中午一区| 欧美一区二区福利视频| 欧美四级电影网| 欧亚洲嫩模精品一区三区| 91视频观看视频| 波多野结衣欧美| 岛国精品一区二区| 国产91精品一区二区麻豆网站| 久久超碰97人人做人人爱| 蜜桃视频一区二区| 久久66热偷产精品| 久久成人精品无人区| 韩国欧美国产一区| 国产高清无密码一区二区三区| 精品一区二区三区在线观看国产| 七七婷婷婷婷精品国产| 成人性色生活片免费看爆迷你毛片| 激情伊人五月天久久综合| 激情国产一区二区| 国产aⅴ综合色| 91啪亚洲精品| 欧美日韩国产综合一区二区三区| 欧美三级日韩三级| 91精品国产综合久久蜜臀| 欧美大片拔萝卜| 国产欧美日韩麻豆91| 亚洲欧洲综合另类| 日韩国产精品大片| 夫妻av一区二区| 色狠狠av一区二区三区| 欧美视频日韩视频在线观看| 日韩一区二区三区av| 国产日韩欧美精品综合| 亚洲欧美激情小说另类| 亚洲电影视频在线| 精品亚洲成av人在线观看| 99久久精品国产一区二区三区| 欧美午夜不卡视频| 久久久久久久精| 一区二区三区四区视频精品免费| 蜜臀av国产精品久久久久| 成人午夜私人影院| 欧美日韩国产一二三| 久久麻豆一区二区| 亚洲自拍另类综合| 国产麻豆精品一区二区| 91福利国产成人精品照片| 日韩女优视频免费观看| 亚洲男人的天堂在线aⅴ视频| 日本va欧美va瓶| 色婷婷精品久久二区二区蜜臀av | 成人深夜福利app| 欧美精品在线观看播放| 国产精品天美传媒沈樵| 视频一区欧美日韩| 99久久精品国产导航| 日韩一二三区不卡| 亚洲一区影音先锋| 成人自拍视频在线| 日韩精品一区二区三区在线| 亚洲一区二区高清|