absyntax/absyntax.cc
changeset 350 2c3c4dc34979
parent 287 9df7fcb9bde5
child 417 d48f53715f77
equal deleted inserted replaced
341:ba80c3ceb6fb 350:2c3c4dc34979
    39 
    39 
    40 #include "absyntax.hh"
    40 #include "absyntax.hh"
    41 //#include "../stage1_2/iec.hh" /* required for BOGUS_TOKEN_ID, etc... */
    41 //#include "../stage1_2/iec.hh" /* required for BOGUS_TOKEN_ID, etc... */
    42 #include "visitor.hh"
    42 #include "visitor.hh"
    43 
    43 
    44 #define ABORT(str) {printf("ERROR: %s\n", str); exit(0);}
    44 #define ERROR error_exit(__FILE__,__LINE__)
    45 
    45 /* function defined in main.cc */
    46 
    46 extern void error_exit(const char *file_name, int line_no);
    47 
    47 
       
    48 #define ABORT(str) {printf("ERROR: %s\n", str); ERROR;}
    48 
    49 
    49 
    50 
    50 
    51 
    51 /* The base class of all symbols */
    52 /* The base class of all symbols */
    52 symbol_c::symbol_c(
    53 symbol_c::symbol_c(
    92   n = 0;
    93   n = 0;
    93   elements = NULL;
    94   elements = NULL;
    94   add_element(elem);
    95   add_element(elem);
    95 }
    96 }
    96 
    97 
    97 /* insert a new element */
    98 /* append a new element to the end of the list */
    98 void list_c::add_element(symbol_c *elem) {
    99 void list_c::add_element(symbol_c *elem) {
    99 //printf("list_c::add_element()\n");
   100 //printf("list_c::add_element()\n");
   100   n++;
   101   n++;
   101   elements = (symbol_c **)realloc(elements, n * sizeof(symbol_c *));
   102   elements = (symbol_c **)realloc(elements, n * sizeof(symbol_c *));
   102   if (elements == NULL)
   103   if (elements == NULL)
   123     last_line = elem->last_line;
   124     last_line = elem->last_line;
   124     last_column = elem->last_column;
   125     last_column = elem->last_column;
   125   }
   126   }
   126 }
   127 }
   127 
   128 
   128 
   129 /* insert a new element before position pos. */
   129 
   130 /* To insert into the begining of list, call with pos=0  */
   130 
   131 /* To insert into the end of list, call with pos=list->n */
   131 #define SYM_LIST(class_name_c)									\
   132 void list_c::insert_element(symbol_c *elem, int pos) {
       
   133   int i;
       
   134   if (pos > n) ERROR;
       
   135   
       
   136   /* add new element to end of list. Basically alocate required memory... */
       
   137   /* will also increment n by 1 ! */
       
   138   add_element(elem);
       
   139   /* if not inserting into end position, shift all elements up one position, to open up a slot in pos for new element */
       
   140   if (pos < (n-1)) for (i = n-2; i >= pos; i--) elements[i+1] = elements[i];
       
   141   elements[pos] = elem;
       
   142 }
       
   143 
       
   144 
       
   145 
       
   146 #define SYM_LIST(class_name_c, ...)								\
   132 class_name_c::class_name_c(									\
   147 class_name_c::class_name_c(									\
   133                            int fl, int fc, const char *ffile, long int forder,			\
   148                            int fl, int fc, const char *ffile, long int forder,			\
   134                            int ll, int lc, const char *lfile, long int lorder)			\
   149                            int ll, int lc, const char *lfile, long int lorder)			\
   135                         :list_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   150                         :list_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   136 class_name_c::class_name_c(symbol_c *elem, 							\
   151 class_name_c::class_name_c(symbol_c *elem, 							\
   137                            int fl, int fc, const char *ffile, long int forder,			\
   152                            int fl, int fc, const char *ffile, long int forder,			\
   138                            int ll, int lc, const char *lfile, long int lorder)			\
   153                            int ll, int lc, const char *lfile, long int lorder)			\
   139 			:list_c(elem, fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   154 			:list_c(elem, fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   140 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   155 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   141 
   156 
   142 #define SYM_TOKEN(class_name_c)									\
   157 #define SYM_TOKEN(class_name_c, ...)								\
   143 class_name_c::class_name_c(const char *value, 							\
   158 class_name_c::class_name_c(const char *value, 							\
   144                            int fl, int fc, const char *ffile, long int forder,			\
   159                            int fl, int fc, const char *ffile, long int forder,			\
   145                            int ll, int lc, const char *lfile, long int lorder)			\
   160                            int ll, int lc, const char *lfile, long int lorder)			\
   146 			:token_c(value, fl, fc, ffile, forder, ll, lc, lfile, lorder) {}	\
   161 			:token_c(value, fl, fc, ffile, forder, ll, lc, lfile, lorder) {}	\
   147 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   162 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   148 
   163 
   149 #define SYM_REF0(class_name_c)									\
   164 #define SYM_REF0(class_name_c, ...)								\
   150 class_name_c::class_name_c(									\
   165 class_name_c::class_name_c(									\
   151                            int fl, int fc, const char *ffile, long int forder,			\
   166                            int fl, int fc, const char *ffile, long int forder,			\
   152                            int ll, int lc, const char *lfile, long int lorder)			\
   167                            int ll, int lc, const char *lfile, long int lorder)			\
   153 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   168 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {}		\
   154 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   169 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   155 
   170 
   156 
   171 
   157 #define SYM_REF1(class_name_c, ref1)								\
   172 #define SYM_REF1(class_name_c, ref1, ...)							\
   158 class_name_c::class_name_c(symbol_c *ref1,							\
   173 class_name_c::class_name_c(symbol_c *ref1,							\
   159                            int fl, int fc, const char *ffile, long int forder,			\
   174                            int fl, int fc, const char *ffile, long int forder,			\
   160                            int ll, int lc, const char *lfile, long int lorder)			\
   175                            int ll, int lc, const char *lfile, long int lorder)			\
   161 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   176 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   162   this->ref1 = ref1;										\
   177   this->ref1 = ref1;										\
   163 }												\
   178 }												\
   164 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   179 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   165 
   180 
   166 
   181 
   167 #define SYM_REF2(class_name_c, ref1, ref2)							\
   182 #define SYM_REF2(class_name_c, ref1, ref2, ...)							\
   168 class_name_c::class_name_c(symbol_c *ref1,							\
   183 class_name_c::class_name_c(symbol_c *ref1,							\
   169 			   symbol_c *ref2,							\
   184 			   symbol_c *ref2,							\
   170                            int fl, int fc, const char *ffile, long int forder,			\
   185                            int fl, int fc, const char *ffile, long int forder,			\
   171                            int ll, int lc, const char *lfile, long int lorder)			\
   186                            int ll, int lc, const char *lfile, long int lorder)			\
   172 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   187 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   173   this->ref1 = ref1;										\
   188   this->ref1 = ref1;										\
   174   this->ref2 = ref2;										\
   189   this->ref2 = ref2;										\
   175 }												\
   190 }												\
   176 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   191 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   177 
   192 
   178 
   193 
   179 #define SYM_REF3(class_name_c, ref1, ref2, ref3)						\
   194 #define SYM_REF3(class_name_c, ref1, ref2, ref3, ...)						\
   180 class_name_c::class_name_c(symbol_c *ref1,							\
   195 class_name_c::class_name_c(symbol_c *ref1,							\
   181 			   symbol_c *ref2,							\
   196 			   symbol_c *ref2,							\
   182 			   symbol_c *ref3,							\
   197 			   symbol_c *ref3,							\
   183                            int fl, int fc, const char *ffile, long int forder,			\
   198                            int fl, int fc, const char *ffile, long int forder,			\
   184                            int ll, int lc, const char *lfile, long int lorder)			\
   199                            int ll, int lc, const char *lfile, long int lorder)			\
   185 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   200 			  :symbol_c(fl, fc, ffile, forder, ll, lc, lfile, lorder) {		\
   186   this->ref1 = ref1;										\
   201   this->ref1 = ref1;										\
   187   this->ref2 = ref2;										\
   202   this->ref2 = ref2;										\
   188   this->ref3 = ref3;										\
   203   this->ref3 = ref3;										\
   189 }												\
   204 }												\
   190 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   205 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   191 
   206 
   192 
   207 
   193 #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4)						\
   208 #define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4, ...)					\
   194 class_name_c::class_name_c(symbol_c *ref1,							\
   209 class_name_c::class_name_c(symbol_c *ref1,							\
   195 			   symbol_c *ref2,							\
   210 			   symbol_c *ref2,							\
   196 			   symbol_c *ref3,							\
   211 			   symbol_c *ref3,							\
   197 			   symbol_c *ref4,							\
   212 			   symbol_c *ref4,							\
   198                            int fl, int fc, const char *ffile, long int forder,			\
   213                            int fl, int fc, const char *ffile, long int forder,			\
   204   this->ref4 = ref4;										\
   219   this->ref4 = ref4;										\
   205 }												\
   220 }												\
   206 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   221 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   207 
   222 
   208 
   223 
   209 #define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5)					\
   224 #define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5, ...)				\
   210 class_name_c::class_name_c(symbol_c *ref1,							\
   225 class_name_c::class_name_c(symbol_c *ref1,							\
   211 			   symbol_c *ref2,							\
   226 			   symbol_c *ref2,							\
   212 			   symbol_c *ref3,							\
   227 			   symbol_c *ref3,							\
   213 			   symbol_c *ref4,							\
   228 			   symbol_c *ref4,							\
   214 			   symbol_c *ref5,							\
   229 			   symbol_c *ref5,							\
   223 }												\
   238 }												\
   224 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   239 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
   225 
   240 
   226 
   241 
   227 
   242 
   228 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6)				\
   243 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6, ...)				\
   229 class_name_c::class_name_c(symbol_c *ref1,							\
   244 class_name_c::class_name_c(symbol_c *ref1,							\
   230 			   symbol_c *ref2,							\
   245 			   symbol_c *ref2,							\
   231 			   symbol_c *ref3,							\
   246 			   symbol_c *ref3,							\
   232 			   symbol_c *ref4,							\
   247 			   symbol_c *ref4,							\
   233 			   symbol_c *ref5,							\
   248 			   symbol_c *ref5,							\