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

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

?? cc3.c

?? 功能強大的小型 c 編譯器,適合學習編譯原理,操作系統
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
** Small-C Compiler -- Part 3 -- Expression Analyzer.
** Copyright 1982, 1983, 1985, 1988 J. E. Hendrix
** All rights reserved.
*/

#include <stdio.h>
#include "cc.h"

#define ST 0   /* is[ST] - symbol table address, else 0 */
#define TI 1   /* is[TI] - type of indirect obj to fetch, else 0 */
#define TA 2   /* is[TA] - type of address, else 0 */
#define TC 3   /* is[TC] - type of constant (INT or UINT), else 0 */
#define CV 4   /* is[CV] - value of constant (+ auxiliary uses) */
#define OP 5   /* is[OP] - code of highest/last binary operator */
#define SA 6   /* is[SA] - stage address of "op 0" code, else 0 */

extern char
 *litq, *glbptr, *lptr,  ssname[NAMESIZE],  quote[2];
extern int
  ch,  csp,  litlab,  litptr,  nch,  op[16],  op2[16],
  opindex,  opsize, *snext;

/***************** lead-in functions *******************/

constexpr(val) int *val; {
  int const;
  int *before, *start;
  setstage(&before, &start);
  expression(&const, val);
  clearstage(before, 0);     /* scratch generated code */
  if(const == 0) error("must be constant expression");
  return const;
  }

expression(con, val) int *con, *val;  {
  int is[7];
  if(level1(is)) fetch(is);
  *con = is[TC];
  *val = is[CV];
  }

test(label, parens)  int label, parens;  {
  int is[7];
  int *before, *start;
  if(parens) need("(");
  while(1) {
    setstage(&before, &start);
    if(level1(is)) fetch(is);
    if(match(",")) clearstage(before, start);
    else break;
    }
  if(parens) need(")");
  if(is[TC]) {             /* constant expression */
    clearstage(before, 0);
    if(is[CV]) return;
    gen(JMPm, label);
    return;
    }
  if(is[SA]) {             /* stage address of "oper 0" code */
    switch(is[OP]) {       /* operator code */
      case EQ12:
      case LE12u: zerojump(EQ10f, label, is); break;
      case NE12:
      case GT12u: zerojump(NE10f, label, is); break;
      case GT12:  zerojump(GT10f, label, is); break;
      case GE12:  zerojump(GE10f, label, is); break;
      case GE12u: clearstage(is[SA], 0);      break;
      case LT12:  zerojump(LT10f, label, is); break;
      case LT12u: zerojump(JMPm,  label, is); break;
      case LE12:  zerojump(LE10f, label, is); break;
      default:    gen(NE10f, label);          break;
      }
    }
  else gen(NE10f, label);
  clearstage(before, start);
  }

/*
** test primary register against zero and jump if false
*/
zerojump(oper, label, is) int oper, label, is[]; {
  clearstage(is[SA], 0);       /* purge conventional code */
  gen(oper, label);
  }

/***************** precedence levels ******************/

level1(is) int is[];  {
  int k, is2[7], is3[2], oper, oper2;
  k = down1(level2, is);
  if(is[TC]) gen(GETw1n, is[CV]);
       if(match("|="))  {oper =        oper2 = OR12;}
  else if(match("^="))  {oper =        oper2 = XOR12;}
  else if(match("&="))  {oper =        oper2 = AND12;}
  else if(match("+="))  {oper =        oper2 = ADD12;}
  else if(match("-="))  {oper =        oper2 = SUB12;}
  else if(match("*="))  {oper = MUL12; oper2 = MUL12u;}
  else if(match("/="))  {oper = DIV12; oper2 = DIV12u;}
  else if(match("%="))  {oper = MOD12; oper2 = MOD12u;}
  else if(match(">>=")) {oper =        oper2 = ASR12;}
  else if(match("<<=")) {oper =        oper2 = ASL12;}
  else if(match("="))   {oper =        oper2 = 0;}
  else return k;
                        /* have an assignment operator */
  if(k == 0) {
    needlval();
    return 0;
    }
  is3[ST] = is[ST];
  is3[TI] = is[TI];
  if(is[TI]) {                             /* indirect target */
    if(oper) {                             /* ?= */
      gen(PUSH1, 0);                       /* save address */
      fetch(is);                           /* fetch left side */
      }
    down2(oper, oper2, level1, is, is2);   /* parse right side */
    if(oper) gen(POP2, 0);                 /* retrieve address */
    }
  else {                                   /* direct target */
    if(oper) {                             /* ?= */
      fetch(is);                           /* fetch left side */
      down2(oper, oper2, level1, is, is2); /* parse right side */
      }
    else {                                 /*  = */
      if(level1(is2)) fetch(is2);          /* parse right side */
      }
    }
  store(is3);                              /* store result */
  return 0;
  }

level2(is1)  int is1[]; {
  int is2[7], is3[7], k, flab, endlab, *before, *after;
  k = down1(level3, is1);                   /* expression 1 */
  if(match("?") == 0) return k;
  dropout(k, NE10f, flab = getlabel(), is1);
  if(down1(level2, is2)) fetch(is2);        /* expression 2 */
  else if(is2[TC]) gen(GETw1n, is2[CV]);
  need(":");
  gen(JMPm, endlab = getlabel());
  gen(LABm, flab);
  if(down1(level2, is3)) fetch(is3);        /* expression 3 */
  else if(is3[TC]) gen(GETw1n, is3[CV]);
  gen(LABm, endlab);

  is1[TC] = is1[CV] = 0;
  if(is2[TC] && is3[TC]) {                  /* expr1 ? const2 : const3 */
    is1[TA] = is1[TI] = is1[SA] = 0;
    }
  else if(is3[TC]) {                        /* expr1 ? var2 : const3 */
    is1[TA] = is2[TA];
    is1[TI] = is2[TI];
    is1[SA] = is2[SA];
    }
  else if((is2[TC])                         /* expr1 ? const2 : var3 */
       || (is2[TA] == is3[TA])) {           /* expr1 ? same2 : same3 */
    is1[TA] = is3[TA];
    is1[TI] = is3[TI];
    is1[SA] = is3[SA];
    }
  else error("mismatched expressions");
  return 0;
  }

level3 (is) int is[]; {return skim("||", EQ10f, 1, 0, level4,  is);}
level4 (is) int is[]; {return skim("&&", NE10f, 0, 1, level5,  is);}
level5 (is) int is[]; {return down("|",            0, level6,  is);}
level6 (is) int is[]; {return down("^",            1, level7,  is);}
level7 (is) int is[]; {return down("&",            2, level8,  is);}
level8 (is) int is[]; {return down("== !=",        3, level9,  is);}
level9 (is) int is[]; {return down("<= >= < >",    5, level10, is);}
level10(is) int is[]; {return down(">> <<",        9, level11, is);}
level11(is) int is[]; {return down("+ -",         11, level12, is);}
level12(is) int is[]; {return down("* / %",       13, level13, is);}

level13(is)  int is[];  {
  int k;
  char *ptr;
  if(match("++")) {                 /* ++lval */
    if(level13(is) == 0) {
      needlval();
      return 0;
      }
    step(rINC1, is, 0);
    return 0;
    }
  else if(match("--")) {            /* --lval */
    if(level13(is) == 0) {
      needlval();
      return 0;
      }
    step(rDEC1, is, 0);
    return 0;
    }
  else if(match("~")) {             /* ~ */
    if(level13(is)) fetch(is);
    gen(COM1, 0);
    is[CV] = ~ is[CV];
    return (is[SA] = 0);
    }
  else if(match("!")) {             /* ! */
    if(level13(is)) fetch(is);
    gen(LNEG1, 0);
    is[CV] = ! is[CV];
    return (is[SA] = 0);
    }
  else if(match("-")) {             /* unary - */
    if(level13(is)) fetch(is);
    gen(ANEG1, 0);
    is[CV] = -is[CV];
    return (is[SA] = 0);
    }
  else if(match("*")) {             /* unary * */
    if(level13(is)) fetch(is);
    if(ptr = is[ST]) is[TI] = ptr[TYPE];
    else             is[TI] = INT;
    is[SA] =       /* no (op 0) stage address */
    is[TA] =       /* not an address */
    is[TC] = 0;    /* not a constant */
    is[CV] = 1;    /* omit fetch() on func call */
    return 1;
    }
  else if(amatch("sizeof", 6)) {    /* sizeof() */
    int sz, p;  char *ptr, sname[NAMESIZE];
    if(match("(")) p = 1;
    else           p = 0;
    sz = 0;
    if     (amatch("unsigned", 8))  sz = BPW;
    if     (amatch("int",      3))  sz = BPW;
    else if(amatch("char",     4))  sz = 1;
    if(sz) {if(match("*"))          sz = BPW;}
    else if(symname(sname)
         && ((ptr = findloc(sname)) ||
             (ptr = findglb(sname)))
         && ptr[IDENT] != FUNCTION
         && ptr[IDENT] != LABEL)    sz = getint(ptr+SIZE, 2);
    else if(sz == 0) error("must be object or type");
    if(p) need(")");
    is[TC] = INT;
    is[CV] = sz;
    is[TA] = is[TI] = is[ST] = 0;
    return 0;
    }
  else if(match("&")) {             /* unary & */
    if(level13(is) == 0) {
      error("illegal address");
      return 0;
      }
    ptr = is[ST];
    is[TA] = ptr[TYPE];
    if(is[TI]) return 0;
    gen(POINT1m, ptr);
    is[TI] = ptr[TYPE];
    return 0;
    }
  else {
    k = level14(is);
    if(match("++")) {               /* lval++ */
      if(k == 0) {
        needlval();
        return 0;
        }
      step(rINC1, is, rDEC1);
      return 0;
      }
    else if(match("--")) {          /* lval-- */
      if(k == 0) {
        needlval();
        return 0;
        }
      step(rDEC1, is, rINC1);
      return 0;
      }
    else return k;
    }
  }

level14(is)  int *is; {
  int k, const, val;
  char *ptr, *before, *start;
  k = primary(is);
  ptr = is[ST];
  blanks();
  if(ch == '[' || ch == '(') {
    int is2[7];                     /* allocate only if needed */
    while(1) {
      if(match("[")) {              /* [subscript] */
        if(ptr == 0) {
          error("can't subscript");
          skip();
          need("]");
          return 0;
          }
        if(is[TA]) {if(k) fetch(is);}
        else       {error("can't subscript"); k = 0;}
        setstage(&before, &start);
        is2[TC] = 0;
        down2(0, 0, level1, is2, is2);
        need("]");
        if(is2[TC]) {
          clearstage(before, 0);
          if(is2[CV]) {             /* only add if non-zero */
            if(ptr[TYPE] >> 2 == BPW)
                 gen(GETw2n, is2[CV] << LBPW);
            else gen(GETw2n, is2[CV]);
            gen(ADD12, 0);
            }
          }
        else {
          if(ptr[TYPE] >> 2 == BPW) gen(DBL1, 0);
          gen(ADD12, 0);
          }
        is[TA] = 0;
        is[TI] = ptr[TYPE];
        k = 1;
        }
      else if(match("(")) {         /* function(...) */
        if(ptr == 0) callfunc(0);
        else if(ptr[IDENT] != FUNCTION) {
          if(k && !is[CV]) fetch(is);
          callfunc(0);
          }
        else callfunc(ptr);
        k = is[ST] = is[TC] = is[CV] = 0;
        }
      else return k;
      }
    }
  if(ptr && ptr[IDENT] == FUNCTION) {
    gen(POINT1m, ptr);
    is[ST] = 0;
    return 0;
    }
  return k;
  }

primary(is)  int *is; {
  char *ptr, sname[NAMESIZE];
  int k;
  if(match("(")) {                  /* (subexpression) */ 
    do k = level1(is); while(match(","));
    need(")");
    return k;
    }
  putint(0, is, 7 << LBPW);         /* clear "is" array */
  if(symname(sname)) {              /* is legal symbol */
    if(ptr = findloc(sname)) {      /* is local */
      if(ptr[IDENT] == LABEL) {
        experr();
        return 0;
        }
      gen(POINT1s, getint(ptr+OFFSET, 2));
      is[ST] = ptr;
      is[TI] = ptr[TYPE];
      if(ptr[IDENT] == ARRAY) {
        is[TA] = ptr[TYPE];
        return 0;
        }
      if(ptr[IDENT] == POINTER) {
        is[TI] = UINT;
        is[TA] = ptr[TYPE];
        }
      return 1;
      }
    if(ptr = findglb(sname)) {      /* is global */
      is[ST] = ptr;
      if(ptr[IDENT] != FUNCTION) {
        if(ptr[IDENT] == ARRAY) {
          gen(POINT1m, ptr);
          is[TI] = 
          is[TA] = ptr[TYPE];
          return 0;
          }
        if(ptr[IDENT] == POINTER)
          is[TA] = ptr[TYPE];
        return 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区二区三区高清 | 精品少妇一区二区三区日产乱码| 欧美成人性福生活免费看| 中文字幕av一区二区三区免费看| 偷窥国产亚洲免费视频 | 久久成人18免费观看| 日本高清成人免费播放| 久久久久久久久伊人| 蜜乳av一区二区| 欧美浪妇xxxx高跟鞋交| 亚洲色图视频网站| 成人免费毛片app| 国产亚洲一区字幕| 久久91精品久久久久久秒播| 欧美精品aⅴ在线视频| 亚洲精品国产一区二区精华液 | 18欧美乱大交hd1984| 国产伦理精品不卡| 欧美成人video| 免费高清成人在线| 欧美精品xxxxbbbb| 午夜精品视频一区| 欧美中文一区二区三区| 亚洲精品国产无天堂网2021| 福利一区二区在线观看| 国产欧美日韩精品a在线观看| 久久97超碰国产精品超碰| 日韩一区二区三区电影| 无码av免费一区二区三区试看 | 波多野结衣中文字幕一区| 精品成人a区在线观看| 麻豆91免费观看| 精品国产区一区| 激情深爱一区二区| 久久久精品国产免大香伊| 国产真实乱对白精彩久久| 亚洲精品一线二线三线无人区| 毛片av一区二区三区| 欧美精品一区二区三区蜜臀 | 91亚洲精品久久久蜜桃| 亚洲欧洲日韩综合一区二区| 色综合久久天天综合网| 亚洲一区二区偷拍精品| 欧美精品 日韩| 捆绑变态av一区二区三区| 欧美精品一区二区三区一线天视频| 国产在线视频一区二区| 国产精品久久久久aaaa| 色综合婷婷久久| 三级成人在线视频| 日韩欧美国产一区二区在线播放| 久久91精品久久久久久秒播| 日本一区二区三区国色天香| 色综合久久久久综合体桃花网| 亚洲一区二区中文在线| 欧美一区二区大片| 成人污污视频在线观看| 有码一区二区三区| 日韩亚洲欧美高清| 99国产精品国产精品久久| 亚洲午夜羞羞片| 国产色产综合产在线视频| 色综合久久综合| 美女视频第一区二区三区免费观看网站| 欧美va在线播放| 色老汉一区二区三区| 久久国产精品99精品国产| 国产精品国产馆在线真实露脸 | 国产欧美1区2区3区| 欧美网站大全在线观看| 国产成a人亚洲精| 亚洲成人tv网| 中文字幕亚洲视频| 欧美一区二区观看视频| 97久久人人超碰| 极品少妇xxxx偷拍精品少妇| 亚洲人成电影网站色mp4| 欧美成人a∨高清免费观看| 色狠狠色狠狠综合| 国产成人午夜视频| 麻豆免费看一区二区三区| 亚洲男人电影天堂| 国产女同性恋一区二区| 日韩一级黄色片| 欧美日韩精品一区二区在线播放| 成人深夜在线观看| 国内精品嫩模私拍在线| 亚洲超碰97人人做人人爱| 国产精品传媒入口麻豆| 精品裸体舞一区二区三区| 欧美日韩一区二区三区在线 | 国产麻豆视频精品| 石原莉奈一区二区三区在线观看| 国产精品久久一卡二卡| 337p粉嫩大胆噜噜噜噜噜91av| 欧美四级电影在线观看| 99久久久免费精品国产一区二区| 麻豆国产精品777777在线| 一区二区在线看| 中文字幕在线观看不卡视频| 国产三级欧美三级日产三级99| 日韩一区二区三区四区| 日韩亚洲欧美成人一区| 欧美视频完全免费看| 日本韩国一区二区三区视频| 9久草视频在线视频精品| 国产精品 日产精品 欧美精品| 午夜成人在线视频| 亚洲成人1区2区| 亚洲最新在线观看| 亚洲电影视频在线| 午夜伦理一区二区| 日韩va亚洲va欧美va久久| 石原莉奈在线亚洲三区| 日韩av一级电影| 韩国三级电影一区二区| 日本不卡视频在线观看| 蜜臀av在线播放一区二区三区| 免费看精品久久片| 精品制服美女丁香| 国产一区二区h| 粉嫩绯色av一区二区在线观看| 国产成人免费在线视频| 成人一级视频在线观看| 丰满少妇久久久久久久| 北岛玲一区二区三区四区| 99久久免费国产| 欧美日韩在线播放三区四区| 欧美高清视频不卡网| 日韩免费在线观看| 国产色爱av资源综合区| 亚洲人亚洲人成电影网站色| 亚洲美女电影在线| 日本成人中文字幕在线视频| 精品一区在线看| 不卡的av中国片| 精品视频资源站| 精品国产伦一区二区三区观看体验| 26uuu亚洲综合色欧美| 一区在线播放视频| 日韩综合在线视频| 激情综合五月婷婷| 99久久国产综合精品色伊| 欧美在线一二三四区| 欧美一级在线观看| 国产精品久久久久久久久免费丝袜| 一个色综合av| 国产一区二区三区香蕉| 91首页免费视频| 欧美日韩久久久| 国产欧美一区在线| 国产成人欧美日韩在线电影| 一本久久a久久免费精品不卡| 欧美一区二区视频在线观看2020| 337p日本欧洲亚洲大胆色噜噜| 最近日韩中文字幕| 免费观看日韩电影| 91美女在线视频| 精品国产乱码91久久久久久网站| 亚洲免费观看视频| 激情亚洲综合在线| 日本道在线观看一区二区| 久久综合色一综合色88| 一区二区三区91| 成人少妇影院yyyy| 日韩免费观看高清完整版| 亚洲人成小说网站色在线| 精品一区二区免费| 欧美日韩日日摸| 亚洲免费电影在线| 国产成人自拍网| 欧美一二三四在线| 亚洲国产精品影院| 99麻豆久久久国产精品免费| 精品国产91九色蝌蚪| 午夜激情一区二区三区| 99久久er热在这里只有精品15| 欧美本精品男人aⅴ天堂| 天堂精品中文字幕在线| 91浏览器打开| 中文字幕一区在线| 丁香啪啪综合成人亚洲小说 | 7777精品伊人久久久大香线蕉完整版 | 欧美视频一区在线观看| 国产精品沙发午睡系列990531| 日韩在线卡一卡二| 欧美日韩中字一区| 伊人色综合久久天天| 91小视频免费观看| 亚洲素人一区二区| 白白色 亚洲乱淫| 久久久精品黄色| 国产精品综合一区二区三区| 精品国产99国产精品| 看片的网站亚洲| 欧美精品一区二区三区一线天视频| 美女网站色91| 国产喂奶挤奶一区二区三区| 欧美三级日本三级少妇99| 中文字幕一区二区三区精华液|