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

编译器/解释器

开发平台:

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. /*      compiler header file    */
  22. #define TRUE 1
  23. #define FALSE 0
  24. /* declaration flags */
  25. #define DF_INT 1
  26. #define DF_ABS 2
  27. #define DF_CONST 4
  28. #define DF_VOL 8
  29. #define DF_FUNCPARMS 16
  30. #define DF_GLOBAL 32
  31. #define DF_AUTOREG 64
  32. #define UF_DEFINED 1
  33. #define UF_USED 2
  34. #define UF_ASSIGNED 4
  35. #define UF_CANASSIGN 8
  36. #define GF_ASSIGN 1
  37. #define GF_CONTINUABLE 2
  38. #define GF_CONTINUE 4
  39. #define GF_GOTO 8
  40. #define GF_DEF 16
  41. #define GF_BREAK 32
  42. #define GF_RETURN 64
  43. #define GF_UNREACH 128
  44. #define GF_NOPROTO 256
  45. #define GF_AND 512
  46. #define GF_SUPERAND 1024
  47. #define GF_INLOOP 2048
  48. #define GF_INFUNCPARMS 4096
  49. #define PF_PRIVATE 0
  50. #define PF_PROTECTED 1
  51. #define PF_PUBLIC 2
  52. #define PF_VIRTUAL 4
  53. #define PF_PURE 8
  54. #define PF_INLINE 16
  55. #define PF_STATIC 32
  56. #define PF_CLASSDEF 64
  57. #define PF_CLASSFUNC 128
  58. #define PF_CLASSHEAD 256
  59. /* keywords and symbols */
  60. enum e_sym {
  61.         id, cconst, iconst, lconst, iuconst, luconst, sconst, lsconst,
  62. fconst, lrconst, rconst, plus, minus,
  63.         star, divide, lshift, rshift, modop, eq, neq, lt, leq, gt,
  64.         geq, assign, asplus, asminus, astimes, asdivide, asmodop,
  65.         aslshift, asrshift, asand, asor, asxor, autoinc, autodec, hook, compl,
  66.         comma, colon, semicolon, uparrow, openbr, closebr, begin, end,
  67.         openpa, closepa, pointsto, dot, lor, land, not, or, and, ellipse, 
  68. classsel, pointstar, dotstar, kw_int,
  69.         kw_void, kw_char, kw_float, kw_double, kw_struct, kw_union,
  70.         kw_long, kw_short, kw_unsigned, kw_signed, kw_auto, kw_extern,
  71.         kw_register, kw_typedef, kw_static, kw_goto, kw_return,
  72.         kw_sizeof, kw_break, kw_continue, kw_if, kw_else, kw_for,
  73.         kw_do, kw_while, kw_switch, kw_case, kw_default, kw_enum, kw_volatile,
  74. kw_const, kw_phitext, kw__trap, kw__interrupt, kw__abs, kw__genword,
  75. kw_public, kw_private, kw_protected, kw_class, kw_friend, kw_new,
  76. kw_delete, kw_this, kw_operator, kw_inline,
  77. kw_try,kw_throw,kw_catch, kw_template, kw__pascal, kw_asm,
  78. kw_asmreg,kw_asminst,
  79. /* These next are generic register names */
  80. kw_D0,kw_D1,kw_D2,kw_D3,kw_D4,kw_D5,kw_D6,kw_D7,
  81. kw_D8,kw_D9,kw_DA,kw_DB,kw_DC,kw_DD,kw_DE,kw_DF,
  82. kw_A0,kw_A1,kw_A2,kw_A3,kw_A4,kw_A5,kw_A6,kw_A7,
  83. kw_A8,kw_A9,kw_AA,kw_AB,kw_AC,kw_AD,kw_AE,kw_AF,
  84. kw_F0,kw_F1,kw_F2,kw_F3,kw_F4,kw_F5,kw_F6,kw_F7,
  85. kw_F8,kw_F9,kw_FA,kw_FB,kw_FC,kw_FD,kw_FE,kw_FF,
  86. eol, eof };
  87. /* storage classes */
  88. enum e_sc {
  89.         sc_static, sc_auto, sc_global, sc_external, sc_type, sc_defunc, sc_const,
  90.         sc_member, sc_label, sc_ulabel, sc_argument, sc_memberreg, sc_autoreg,
  91. sc_externalfunc,sc_abs };
  92. /* basic types */
  93. enum e_bt {
  94. /* This first two lines MUST be ordered for the 
  95.  * lostconv stuff to work
  96.  */
  97.         bt_char, bt_unsignedchar, bt_enum,bt_short, bt_unsignedshort, 
  98. bt_long, bt_unsigned, bt_float, bt_double, bt_longdouble, bt_untyped,
  99. bt_pointer,bt_ref,bt_void,bt_struct, bt_union, bt_func, bt_class, bt_iclass,
  100. bt_ifunc, bt_ptrfunc,bt_matchall, bt_ellipse, bt_bitfield };
  101. struct slit {
  102.         struct slit     *next;
  103.         int             label; /* label to use */
  104.         char            *str; /* string to dump */
  105. char type; /* ascii/phitext or wide */
  106.         };
  107. /* symbols */
  108. struct sym {
  109.         struct sym      *next; /* next symbol (local tabs only) */
  110.         char            *name; /* symbol name */
  111.         enum e_sc storage_class; /* storage class */
  112. int extflag:1; /* if external, was it used */
  113. int absflag:1; /* the _abs keyword was used */
  114. int intflag:1; /* the _interrupt keyword was used */
  115. int indecltable:1; /* global already in dump table */
  116. int pascaldefn:1; /* function: pascal type */
  117. int inreg:1;   /* function var is in reg, no stack space needed */
  118. int funcparm:1; /* function var is a param and has space allocated */
  119. int  staticlabel:1; /* Var is a static declared in a function */
  120. /* char pflags;       
  121. struct sym  *parent;      */          /* Parent class */
  122. int linkid; /* ID to use for linkage purposes (binary output) */
  123. ENODE * defalt; /* Default for function params */
  124. /* Also name for CPP overload lists */
  125. /* these fields depend on storage_class */
  126.         union   {
  127.                 long            i; /* int val */
  128.                 unsigned long   u; /* nsigned val */
  129.                 double          f; /* float val */
  130. struct stab {
  131. struct sym *head, *tail; /* Overload table*/
  132. } overlist;
  133.                 char            *s; /* string val */
  134.                 }
  135.                         value;
  136. /* Type declarations */
  137.         struct typ {
  138.                 enum e_bt        type; /* the type */
  139.                 char            val_flag;       /* set if is an array */
  140.         char uflags; /* Track usage */
  141. char cflags; /* const & vol flags */
  142. char  classflags; /* Public, protected, private */
  143. char bits; /* -1 for not a bit val, else bit field len */
  144. char startbit; /* start of bit field */
  145.                 long            size; /* total size of type */
  146. /* local symbol tables */
  147. struct stab lst;   /* Symbol table for structs & functions */
  148.                 struct typ      *btp; /* pointer to next type (pointers & arrays */
  149.                 char            *sname; /* structure name ? */
  150. struct sym *tdef; /* Pointer to a typedef entry */
  151.                 }
  152.                         *tp;
  153. struct decldata {
  154. struct decldata *link;
  155. enum { dd_byte,dd_word,dd_long,dd_float,dd_double,
  156.        dd_ldouble, dd_pcname, dd_dataname, dd_storage,
  157.        dd_label
  158.      } mode;
  159. union {
  160. long i;
  161. double f;
  162. struct sym *sp;
  163. } val;
  164. long offset;
  165. } *init;
  166. };
  167. #define SYM     struct sym
  168. #define TYP     struct typ
  169. #define TABLE   struct stab
  170. #define MAX_STRLEN      120
  171. #define MAX_STLP1       121
  172. /* struct for preprocessor if tracking */
  173. typedef struct ifstruct {
  174. struct ifstruct *link; /* link */
  175. short iflevel;
  176. short elsetaken;
  177. } IFSTRUCT;
  178. /* #define tracking */
  179. typedef struct {
  180. char *string;
  181. short argcount;
  182. char **args;
  183. } DEFSTRUCT;
  184. /* error list */
  185. struct errl {
  186. struct errl *link;
  187. short errornumber;
  188. void *data;
  189. };
  190. /* used for error skimming */
  191. #define BALANCE struct balance
  192. #define BAL_PAREN   0
  193. #define BAL_BRACKET 0
  194. #define ERRORS struct errl
  195. struct balance {
  196. struct balance *back;
  197. short type;
  198. short count;
  199. };
  200. /* Global symbol table is a hash table */
  201. #define HASHTABLESIZE 1023
  202. typedef struct _hashrec_ {
  203.    struct _hashrec_ *link; /* Link to next element in list */
  204.    char *key; /* Full key */
  205. } HASHREC;
  206. typedef struct {
  207. char *word;
  208. short atype;
  209. short amode;
  210. } ASMNAME;
  211. typedef struct kwblk {
  212. struct kwblk *next;
  213.         char            *word;
  214.         short stype;
  215. enum { KW_CPLUSPLUS=1,KW_INLINEASM=2 } flags;
  216. ASMNAME *data;
  217.         } KEYWORDS;
  218. typedef struct {
  219. char *word;
  220. char regtype;
  221. char regnum;
  222. char size;
  223. } ASMREG;
  224. #include "cc.p"