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

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

?? parser.java

?? 完成編譯器的基本功能,并且有界面,簡單好用
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
                                    break;

                              case plus:
                                    nextSym();
                                    startid = PL0.lex.num;

                                    break;
                              case minus:
                                    nextSym();
                                    startid = -PL0.lex.num;

                                    break;

                        }
                        table.get(table.tx).adr = table.get(table.tx).adr -
                            startid;
                        nextSym();
                        nextSym();
                        switch (sym) {
                              case ident:
                                    endid = table.get(table.position(lex.id)).
                                        val;
                                    table.get(table.tx).size = endid - startid +
                                        1;
                                    break;
                              case number:
                                    endid = PL0.lex.num;
                                    table.get(table.tx).size = endid - startid +
                                        1;
                                    break;
                              case plus:
                                    nextSym();
                                    endid = PL0.lex.num;
                                    table.get(table.tx).size = endid - startid +
                                        1;
                                    break;
                              case minus:
                                    nextSym();
                                    endid = -PL0.lex.num;
                                    table.get(table.tx).size = endid - startid +
                                        1;
                                    break;

                        }
                        dx = dx + endid - startid; //dx在判斷為var時已經++運算過
                        nextSym();
                        nextSym();
                  }
            }
            else {
                  String ss1 = err.report(4); // var 后應是標識
                  ss = ss + ss1 + "\n";
            }
      }

      /**
       * 分析<語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      void parseStatement(SymSet fsys, int lev) {
            SymSet nxtlev;
            // Wirth 的 PL/0 編譯器使用一系列的if...else...來處理
            // 但是你的助教認為下面的寫法能夠更加清楚地看出這個函數的處理邏輯
            switch (sym) {
                  case ident:
                        parseAssignStatement(fsys, lev);
                        break;
                  case readsym:
                        parseReadStatement(fsys, lev);
                        break;
                  case writesym:
                        parseWriteStatement(fsys, lev);
                        break;
                  case callsym:
                        parseCallStatement(fsys, lev);
                        break;
                  case ifsym:
                        parseIfStatement(fsys, lev);
                        break;
                  case beginsym:
                        parseBeginStatement(fsys, lev);
                        break;
                  case whilesym:
                        parseWhileStatement(fsys, lev);
                        break;
                  default:
                        nxtlev = new SymSet(symnum);
                        test(fsys, nxtlev, 19);
                        break;
            }
      }

      /**
       * 分析<當型循環語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseWhileStatement(SymSet fsys, int lev) {
            int cx1, cx2;
            SymSet nxtlev;

            cx1 = interp.cx; // 保存判斷條件操作的位置
            nextSym();
            nxtlev = (SymSet) fsys.clone();
            nxtlev.set(Symbol.dosym); // 后跟符號為do
            parseCondition(nxtlev, lev); // 分析<條件>
            cx2 = interp.cx; // 保存循環體的結束的下一個位置
            interp.gen(Fct.JPC, 0, 0); // 生成條件跳轉,但跳出循環的地址未知
            if (sym == Symbol.dosym) {
                  nextSym();
            }
            else {
                  String ss1 = err.report(18); // 缺少do
                  ss = ss + ss1 + "\n";
            }
            parseStatement(fsys, lev); // 分析<語句>
            interp.gen(Fct.JMP, 0, cx1); // 回頭重新判斷條件
            interp.code[cx2].a = interp.cx; // 反填跳出循環的地址,與<條件語句>類似
      }

      /**
       * 分析<復合語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseBeginStatement(SymSet fsys, int lev) {
            SymSet nxtlev;

            nextSym();
            nxtlev = (SymSet) fsys.clone();
            nxtlev.set(Symbol.semicolon);
            nxtlev.set(Symbol.endsym);
            parseStatement(nxtlev, lev);
            // 循環分析{; <語句>},直到下一個符號不是語句開始符號或收到end
            while (statbegsys.get(sym) || sym == Symbol.semicolon) {
                  if (sym == Symbol.semicolon) {
                        nextSym();
                  }
                  else {
                        String ss1 = err.report(10); // 缺少分號
                        ss = ss + ss1 + "\n";
                  }
                  parseStatement(nxtlev, lev);
            }
            if (sym == Symbol.endsym) {
                  nextSym();
            }
            else {
                  String ss1 = err.report(17); // 缺少end或分號
                  ss = ss + ss1 + "\n";
            }
      }

      /**
       * 分析<條件語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseIfStatement(SymSet fsys, int lev) {
            int cx1;

            SymSet nxtlev;

            nextSym();
            nxtlev = (SymSet) fsys.clone();
            nxtlev.set(Symbol.thensym); // 后跟符號為then或do ???
            nxtlev.set(Symbol.dosym);
            parseCondition(nxtlev, lev); // 分析<條件>
            if (sym == Symbol.thensym) {
                  nextSym();
            }
            else {
                  String ss1 = err.report(16); // 缺少then
                  ss = ss + ss1 + "\n";
            }
            cx1 = interp.cx; // 保存當前指令地址
            interp.gen(Fct.JPC, 0, 0); // 生成條件跳轉指令,跳轉地址未知,暫時寫0
            parseStatement(fsys, lev); // 處理then后的語句
            interp.code[cx1].a = interp.cx; // 經statement處理后,cx為then后語句執行
            // 完的位置,它正是前面未定的跳轉地址

            if (sym == Symbol.elsesym) {
                  interp.code[cx1].a++;
                  nextSym();
                  int cx2;
                  cx2 = interp.cx;
                  interp.gen(Fct.JMP, 0, 0);
                  parseStatement(fsys, lev);
                  interp.code[cx2].a = interp.cx;
            }
      }

      /**
       * 分析<過程調用語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseCallStatement(SymSet fsys, int lev) {
            int i;
            nextSym();
            if (sym == Symbol.ident) {
                  i = table.position(lex.id);
                  if (i == 0) {
                        String ss1 = err.report(11); // 過程未找到
                        ss = ss + ss1 + "\n";
                  }
                  else {
                        Table.Item item = table.get(i);
                        if (item.kind == Objekt.procedure) {
                              interp.gen(Fct.CAL, lev - item.level, item.adr);
                        }
                        else {
                              String ss1 = err.report(15); // call后標識符應為過程
                              ss = ss + ss1 + "\n";
                        }
                  }
                  nextSym();
            }
            else {
                  String ss1 = err.report(14); // call后應為標識符
                  ss = ss + ss1 + "\n";
            }
      }

      /**
       * 分析<寫語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseWriteStatement(SymSet fsys, int lev) {
            SymSet nxtlev;

            nextSym();
            if (sym == Symbol.lparen) {
                  do {
                        nextSym();
                        nxtlev = (SymSet) fsys.clone();
                        nxtlev.set(Symbol.rparen);
                        nxtlev.set(Symbol.comma);
                        parseExpression(nxtlev, lev);
                        interp.gen(Fct.OPR, 0, 14);
                  }
                  while (sym == Symbol.comma);

                  if (sym == Symbol.rparen) {
                        nextSym();
                  }
                  else {
                        String ss1 = err.report(33); // write()中應為完整表達式
                        ss = ss + ss1 + "\n";
                  }
            }
            interp.gen(Fct.OPR, 0, 15);
      }

      /**
       * 分析<讀語句>
       * @param fsys 后跟符號集
       * @param lev 當前層次
       */
      private void parseReadStatement(SymSet fsys, int lev) {
            int i;

            nextSym();
            if (sym == Symbol.lparen) {
                  do {
                        nextSym();
                        if (sym == Symbol.ident) {
                              i = table.position(lex.id);
                        }
                        else {
                              i = 0;
                        }

                        if (i == 0) {
                              String ss1 = err.report(35); // read()中應是聲明過的變量名
                              ss = ss + ss1 + "\n";
                        }
                        else {
                              Table.Item item = table.get(i);
                              if (item.kind != Objekt.variable) {
                                    String ss1 = err.report(32); // read()中的標識符不是變量, thanks to amd
                                    ss = ss + ss1 + "\n";
                              }
                              else {
                                    nextSym();
                                    if (sym != Symbol.lparen) { //非數組,即變量
                                          interp.gen(Fct.OPR, 0, 16);
                                          interp.gen(Fct.STO, lev - item.level,
                                              item.adr);
                                    }
                                    else { //TODO 數組
                                          nextSym();
                                          SymSet nxtlev = (SymSet) fsys.clone();
                                          nxtlev.set(Symbol.rparen);
                                          parseExpression(nxtlev, lev);
                                          int ltmp = lev - item.level;
                                          int adrtmp = item.adr;
                                          interp.gen(Fct.OPR, 0, 16);
                                          interp.gen(Fct.STA, ltmp, adrtmp);
                                          nextSym(); //右)
                                          //nextSym();//讀下個

                                    }
                              }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产suv一区二区三区88区| 国产精品99久久久久久有的能看| 国产三级一区二区| 精品国产人成亚洲区| 欧美一区二区福利在线| 日韩一区二区在线免费观看| 777奇米四色成人影色区| 欧美电影在线免费观看| 欧美日本国产视频| 欧美一级精品在线| 精品对白一区国产伦| 国产女主播视频一区二区| 久久久久久久网| 亚洲欧洲国产专区| 亚洲五码中文字幕| 日本伊人色综合网| 国产精品资源网站| 成人免费视频视频| 欧美日韩高清在线播放| 欧美精品丝袜久久久中文字幕| 欧美一级黄色大片| 久久精品人人做人人爽人人| 中文字幕一区二区视频| 午夜精品久久久久久久久久久| 麻豆精品在线观看| 99视频在线精品| 6080yy午夜一二三区久久| 精品国产乱码久久久久久久| 中文字幕亚洲一区二区va在线| 亚洲永久精品国产| 国产精品一卡二卡在线观看| 91在线观看高清| 欧美一区二区三区男人的天堂| 国产女同性恋一区二区| 亚洲福利一二三区| 成人午夜av电影| 欧美日韩二区三区| 中文字幕欧美区| 亚洲福利视频导航| 成熟亚洲日本毛茸茸凸凹| 欧美日韩在线免费视频| 国产精品色眯眯| 青青草91视频| 欧美在线观看视频一区二区三区| 日韩一级在线观看| 一区二区三区国产精品| 国产九九视频一区二区三区| 欧美日韩国产高清一区| 亚洲色图在线视频| 国产成人av电影在线| 欧美成人伊人久久综合网| 一区二区三区精品在线| 成人国产电影网| 国产亚洲一区二区三区在线观看| 亚洲已满18点击进入久久| av电影在线不卡| 久久九九久久九九| 狠狠v欧美v日韩v亚洲ⅴ| 欧美久久久久久蜜桃| 亚洲专区一二三| 在线一区二区三区四区五区| 精品美女在线播放| 日韩成人免费看| 777xxx欧美| 日韩激情中文字幕| 欧美日韩一区二区不卡| 亚洲成av人片一区二区梦乃 | 欧美电影在线免费观看| 亚洲视频在线一区| av电影在线观看完整版一区二区| 国产午夜三级一区二区三| 久久99精品久久久| 日韩精品一区国产麻豆| 青青草原综合久久大伊人精品优势| 在线视频一区二区三区| 亚洲精品美国一| 一本一本久久a久久精品综合麻豆| 国产精品二三区| 91麻豆国产福利精品| 一区二区三区小说| 欧美日韩成人一区| 免费av成人在线| 亚洲精品一线二线三线| 国产在线一区观看| 国产精品三级视频| 91欧美一区二区| 亚洲无人区一区| 欧美丰满美乳xxx高潮www| 日本不卡一二三区黄网| 欧美一二三四区在线| 国产一区二区三区在线看麻豆| 精品国产91洋老外米糕| 国产成人99久久亚洲综合精品| 国产精品久久久久久久久动漫| 色哟哟精品一区| 蜜臀久久久99精品久久久久久| www国产精品av| 色偷偷久久一区二区三区| 午夜精品福利在线| 久久久av毛片精品| 色综合咪咪久久| 热久久久久久久| 国产精品天美传媒沈樵| 在线亚洲+欧美+日本专区| 久久综合综合久久综合| 国产精品美女久久久久久2018| 欧美综合在线视频| 紧缚奴在线一区二区三区| 亚洲欧美偷拍三级| 日韩一区二区三区免费观看| 成人动漫在线一区| 全国精品久久少妇| 亚洲免费av观看| 精品国产免费视频| 色成年激情久久综合| 狠狠色狠狠色合久久伊人| 一区二区三区高清不卡| 久久久天堂av| 日韩免费观看高清完整版在线观看| 国产成人精品一区二区三区网站观看| 亚洲综合小说图片| 国产欧美日韩精品a在线观看| 777a∨成人精品桃花网| 91在线观看下载| 国产成人av一区二区三区在线| 亚洲成人黄色小说| 亚洲欧洲韩国日本视频| 久久久午夜精品理论片中文字幕| 欧美性一级生活| 99国产麻豆精品| 国产精品资源网| 久久99精品国产.久久久久| 一区二区三区色| 国产精品成人在线观看| 久久久久久97三级| 日韩三级av在线播放| 欧美色男人天堂| 色一情一伦一子一伦一区| 99免费精品在线观看| 国产精品羞羞答答xxdd| 精品在线一区二区三区| 天堂一区二区在线| 亚洲午夜久久久久久久久电影网 | 国产在线国偷精品免费看| 无吗不卡中文字幕| 亚洲午夜免费视频| 一区二区三区四区高清精品免费观看 | 久久亚洲欧美国产精品乐播| 91精品在线免费观看| 欧美最新大片在线看| 在线亚洲一区二区| 日本韩国欧美国产| 欧美综合色免费| 在线免费精品视频| 欧美无乱码久久久免费午夜一区 | 国产精品天美传媒| 国产精品美女久久久久aⅴ| 国产精品日产欧美久久久久| 国产精品欧美一区喷水| 国产精品蜜臀av| 亚洲伦在线观看| 亚洲一区二区三区精品在线| 一区二区在线观看av| 亚洲综合一二区| 琪琪久久久久日韩精品| 国产综合久久久久久鬼色| 国产成人午夜精品影院观看视频| 岛国av在线一区| 日本高清不卡在线观看| 欧美精选午夜久久久乱码6080| 日韩欧美中文一区| 久久久精品免费网站| 亚洲日本中文字幕区| 亚洲电影中文字幕在线观看| 蜜臀久久久99精品久久久久久| 国产精品99久久久久久久女警| av影院午夜一区| 欧美伦理视频网站| 国产欧美日产一区| 亚洲一级二级在线| 精品影院一区二区久久久| av男人天堂一区| 日韩欧美在线综合网| 国产精品护士白丝一区av| 亚洲风情在线资源站| 国产精品综合视频| 欧美三级三级三级| 国产片一区二区| 天天色图综合网| 成人天堂资源www在线| 欧美日韩成人综合在线一区二区| 国产精品久久久久久妇女6080| 亚洲欧美一区二区三区久本道91| 全国精品久久少妇| 91在线观看高清| 久久精品亚洲精品国产欧美kt∨ | 亚洲精品自拍动漫在线| 免费在线观看成人| 91麻豆自制传媒国产之光| 精品美女一区二区三区|