EXPR.H
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21. /*      expression tree descriptions    */
  22. enum e_node {
  23.         en_void,        /* used for parameter lists */
  24. en_cb, en_cub, en_cw, en_cuw, en_cl, en_cul, en_cf, en_cd, en_cp, en_cld,
  25.         en_icon, en_lcon,en_iucon, en_lucon, en_rcon, en_fcon, en_lrcon,
  26. en_ccon, en_labcon, en_nacon, en_autocon, en_absacon, en_nalabcon,
  27.         en_napccon, en_b_ref, en_w_ref, en_l_ref, en_ub_ref, en_uw_ref,
  28. en_floatref, en_doubleref, en_longdoubleref, en_autoreg, en_trapcall,
  29.         en_ul_ref, en_fcall, en_fcallb, en_intcall, en_tempref, en_regref,
  30. en_pfcallb, en_pfcall, en_pcallblock,
  31. en_add, en_sub, en_mul, en_mod,
  32.         en_div, en_lsh, en_rsh, en_cond, en_assign, en_refassign, en_eq, en_ne,
  33.         en_asadd, en_assub, en_asmul, en_asdiv, en_asmod, en_asrsh,
  34. en_asumul, en_asudiv, en_asumod, en_pmul,
  35.         en_aslsh, en_asand, en_asor, en_asxor, en_uminus, en_not, en_compl,
  36.         en_lt, en_le, en_gt, en_ge, en_and, en_or, en_land, en_lor,
  37.         en_xor, en_ainc, en_adec, en_umul, en_udiv, en_umod, en_ugt,
  38.         en_uge, en_ule, en_ult, en_moveblock, en_stackblock, en_callblock,
  39. en_pdiv, en_alsh, en_arsh, en_asarsh,en_asalsh, en_bits};
  40. /*      statement node descriptions     */
  41. enum e_stmt {
  42.         st_line, st_expr, st_while, st_for, st_do, st_if, st_switch,
  43.         st_case, st_goto, st_break, st_continue, st_label, st_asm,
  44.         st_return, st_block, st__genword };
  45. struct enode {
  46.         enum e_node nodetype;
  47. char bits;
  48. char startbit;
  49. char cflags;
  50. long size; /* For block moves */
  51.         union {
  52.                 long            i;
  53.                 double          f;
  54.                 char            *sp;
  55.                 struct enode    *p[2];
  56.                 } v;
  57.         };
  58. struct snode {
  59.         enum e_stmt     stype;
  60.         struct snode    *next;          /* next statement */
  61.         struct enode    *exp;           /* condition or expression */
  62.         struct snode    *s1, *s2,*lst;       /* internal statements &lineno*/
  63. /* changed */
  64. struct snode          *label;         /* label number for goto */
  65.         };
  66. struct cse {
  67.         struct cse      *next;
  68.         struct enode    *exp;           /* optimizable expression */
  69.         short           uses;           /* number of uses */
  70.         short            duses;          /* number of dereferenced uses */
  71. char size; /* Size of the expresion */
  72.         char             voidf;          /* cannot optimize flag */
  73.         char             reg;            /* allocated register */
  74.         };
  75. #define ENODE struct enode
  76. #define SNODE struct snode
  77. #define CSE struct cse