pexpr.c.3
上传用户:upcnvip
上传日期:2007-01-06
资源大小:474k
文件大小:8k
源码类别:

编译器/解释器

开发平台:

C/C++

  1.             setprec2(10);
  2.     checkbreak(breakbeforerel);
  3.             wrexpr(ex->args[0], incompat(ex, 0, subprec));
  4.             outop(">");
  5.             wrexpr(ex->args[1], incompat(ex, 0, subprec));
  6.             break;
  7.         case EK_LE:
  8.             setprec2(10);
  9.     checkbreak(breakbeforerel);
  10.             wrexpr(ex->args[0], incompat(ex, 0, subprec));
  11.             outop("<=");
  12.             wrexpr(ex->args[1], incompat(ex, 0, subprec));
  13.             break;
  14.         case EK_GE:
  15.             setprec2(10);
  16.     checkbreak(breakbeforerel);
  17.             wrexpr(ex->args[0], incompat(ex, 0, subprec));
  18.             outop(">=");
  19.             wrexpr(ex->args[1], incompat(ex, 0, subprec));
  20.             break;
  21.         case EK_EQ:
  22.             setprec2(9);
  23.     checkbreak(breakbeforerel);
  24.             wrexpr(ex->args[0], incompat(ex, 0, subprec));
  25.             outop("==");
  26.             wrexpr(ex->args[1], incompat(ex, 0, subprec));
  27.             break;
  28.         case EK_NE:
  29.             setprec2(9);
  30.     checkbreak(breakbeforerel);
  31.             wrexpr(ex->args[0], incompat(ex, 0, subprec));
  32.             outop("!=");
  33.             wrexpr(ex->args[1], incompat(ex, 0, subprec));
  34.             break;
  35.         case EK_BAND:
  36.             setprec3(8);
  37.     if (ex->val.type == tp_boolean)
  38. checkbreak(breakbeforelog);
  39.     else
  40. checkbreak(breakbeforearith);
  41.             wrexpr(ex->args[0], incompat(ex, 0, subprec-1));
  42.     outop("&");
  43.             wrexpr(ex->args[1], incompat(ex, 1, subprec-1));
  44.             break;
  45.         case EK_BXOR:
  46.             setprec3(7);
  47.     checkbreak(breakbeforearith);
  48.             wrexpr(ex->args[0], incompat(ex, 0, subprec-1));
  49.             outop("^");
  50.             wrexpr(ex->args[1], incompat(ex, 1, subprec-1));
  51.             break;
  52.         case EK_BOR:
  53.             setprec3(6);
  54.     if (ex->val.type == tp_boolean)
  55. checkbreak(breakbeforelog);
  56.     else
  57. checkbreak(breakbeforearith);
  58.             wrexpr(ex->args[0], incompat(ex, 0, subprec-1));
  59.     outop("|");
  60.             wrexpr(ex->args[1], incompat(ex, 1, subprec-1));
  61.             break;
  62.         case EK_AND:
  63.             setprec3(5);
  64.     checkbreak(breakbeforelog);
  65.     wrexpr(ex->args[0], incompat(ex, 0, subprec-1));
  66.             outop("&&");
  67.     wrexpr(ex->args[1], incompat(ex, 1, subprec-1));
  68.             break;
  69.         case EK_OR:
  70.             setprec3(4);
  71.     checkbreak(breakbeforelog);
  72.     wrexpr(ex->args[0], incompat(ex, 0, subprec-1));
  73.             outop("||");
  74.     wrexpr(ex->args[1], incompat(ex, 1, subprec-1));
  75.             break;
  76.         case EK_COND:
  77.             setprec3(3);
  78.     i = 0;
  79.     for (;;) {
  80. i++;
  81. if (extraparens != 0)
  82.     wrexpr(ex->args[0], 15);
  83. else
  84.     wrexpr(ex->args[0], subprec);
  85. NICESPACE();
  86. output("02?");
  87. NICESPACE();
  88. out_expr(ex->args[1]);
  89. if (ex->args[2]->kind == EK_COND) {
  90.     NICESPACE();
  91.     output("02:");
  92.     NICESPACE();
  93.     ex = ex->args[2];
  94. } else {
  95.     NICESPACE();
  96.     output((i == 1) ? "17:" : "02:");
  97.     NICESPACE();
  98.     wrexpr(ex->args[2], subprec-1);
  99.     break;
  100. }
  101.     }
  102.             break;
  103.         case EK_ASSIGN:
  104.             if (ex->args[1]->kind == EK_PLUS &&
  105.                 exprsame(ex->args[1]->args[0], ex->args[0], 2) &&
  106.                 ex->args[1]->args[1]->kind == EK_CONST &&
  107.                 ex->args[1]->args[1]->val.type->kind == TK_INTEGER &&
  108.                 abs(ex->args[1]->args[1]->val.i) == 1) {
  109. if (prec == 0 && postincrement) {
  110.     setprec(15);
  111.     wrexpr(ex->args[0], subprec);
  112.     EXTRASPACE();
  113.     if (ex->args[1]->args[1]->val.i == 1)
  114. output("++");
  115.     else
  116. output("--");
  117. } else {
  118.     setprec(14);
  119.     if (ex->args[1]->args[1]->val.i == 1)
  120. output("++");
  121.     else
  122. output("--");
  123.     EXTRASPACE();
  124.     wrexpr(ex->args[0], subprec-1);
  125. }
  126.             } else {
  127.                 setprec2(2);
  128. checkbreak(breakbeforeassign);
  129.                 wrexpr(ex->args[0], subprec);
  130.                 ex2 = copyexpr(ex->args[1]);
  131.                 j = -1;
  132.                 switch (ex2->kind) {
  133.                     case EK_PLUS:
  134.                     case EK_TIMES:
  135.                     case EK_BAND:
  136.                     case EK_BOR:
  137.                     case EK_BXOR:
  138.                         for (i = 0; i < ex2->nargs; i++) {
  139.                             if (exprsame(ex->args[0], ex2->args[i], 2)) {
  140.                                 j = i;
  141.                                 break;
  142.                             }
  143.                             if (ex2->val.type->kind == TK_REAL)
  144.                                 break;   /* non-commutative */
  145.                         }
  146.                         break;
  147.                     case EK_DIVIDE:
  148.                     case EK_DIV:
  149.                     case EK_MOD:
  150.                     case EK_LSH:
  151.                     case EK_RSH:
  152.                         if (exprsame(ex->args[0], ex2->args[0], 2))
  153.                             j = 0;
  154.                         break;
  155.     default:
  156. break;
  157.                 }
  158.                 if (j >= 0) {
  159.                     if (ex2->nargs == 2)
  160.                         ex2 = grabarg(ex2, 1-j);
  161.                     else
  162.                         delfreearg(&ex2, j);
  163.                     switch (ex->args[1]->kind) {
  164.                         case EK_PLUS:
  165.                             if (expr_looks_neg(ex2)) {
  166.                                 outop("-=");
  167.                                 ex2 = makeexpr_neg(ex2);
  168.                             } else
  169.                                 outop("+=");
  170.                             break;
  171.                         case EK_TIMES:
  172.                             outop("*=");
  173.                             break;
  174.                         case EK_DIVIDE:
  175.                         case EK_DIV:
  176.                             outop("/=");
  177.                             break;
  178.                         case EK_MOD:
  179.                             outop("%=");
  180.                             break;
  181.                         case EK_LSH:
  182.                             outop("<<=");
  183.                             break;
  184.                         case EK_RSH:
  185.                             outop(">>=");
  186.                             break;
  187.                         case EK_BAND:
  188.                             outop("&=");
  189.                             break;
  190.                         case EK_BOR:
  191.                             outop("|=");
  192.                             break;
  193.                         case EK_BXOR:
  194.                             outop("^=");
  195.                             break;
  196. default:
  197.     break;
  198.                     }
  199.                 } else {
  200.     output(" ");
  201.     outop3(breakbeforeassign, "=");
  202.     output(" ");
  203.                 }
  204.                 if (extraparens != 0 &&
  205.                     (ex2->kind == EK_EQ || ex2->kind == EK_NE ||
  206.                      ex2->kind == EK_GT || ex2->kind == EK_LT ||
  207.                      ex2->kind == EK_GE || ex2->kind == EK_LE ||
  208.                      ex2->kind == EK_AND || ex2->kind == EK_OR))
  209.                     wrexpr(ex2, 16);
  210.                 else
  211.                     wrexpr(ex2, subprec-1);
  212.                 freeexpr(ex2);
  213.             }
  214.             break;
  215.         case EK_COMMA:
  216.             setprec3(1);
  217.             for (i = 0; i < ex->nargs-1; i++) {
  218.                 wrexpr(ex->args[i], subprec);
  219.                 output(",02");
  220.                 NICESPACE();
  221.             }
  222.             wrexpr(ex->args[ex->nargs-1], subprec);
  223.             break;
  224.         default:
  225.             intwarning("wrexpr", "bad ex->kind [311]");
  226.     }
  227.     switch (parens) {
  228.       case 1:
  229.         output(")");
  230. break;
  231.       case 2:
  232. output("04");
  233. break;
  234.     }
  235. }
  236. /* will parenthesize assignments and "," operators */
  237. void out_expr(ex)
  238. Expr *ex;
  239. {
  240.     wrexpr(ex, 2);
  241. }
  242. /* will not parenthesize anything at top level */
  243. void out_expr_top(ex)
  244. Expr *ex;
  245. {
  246.     wrexpr(ex, 0);
  247. }
  248. /* will parenthesize unless only writing a factor */
  249. void out_expr_factor(ex)
  250. Expr *ex;
  251. {
  252.     wrexpr(ex, 15);
  253. }
  254. /* will parenthesize always */
  255. void out_expr_parens(ex)
  256. Expr *ex;
  257. {
  258.     output("(");
  259.     wrexpr(ex, 1);
  260.     output(")");
  261. }
  262. /* evaluate expression for side effects only */
  263. /* no top-level parentheses */
  264. void out_expr_stmt(ex)
  265. Expr *ex;
  266. {
  267.     wrexpr(ex, 0);
  268. }
  269. /* evaluate expression for boolean (zero/non-zero) result only */
  270. /* parenthesizes like out_expr() */
  271. void out_expr_bool(ex)
  272. Expr *ex;
  273. {
  274.     wrexpr(ex, 2);
  275. }
  276. /* End. */