absyntax/absyntax.cc
changeset 69 41cb5b80416e
parent 15 0b472e25eb16
child 261 db2ad6541d92
--- a/absyntax/absyntax.cc	Tue Oct 23 10:33:09 2007 +0200
+++ b/absyntax/absyntax.cc	Tue Oct 23 10:35:58 2007 +0200
@@ -43,16 +43,23 @@
 
 /* The base class of all symbols */
 symbol_c::symbol_c(void) {
-  lineno = 0;
-}
-
-symbol_c::symbol_c(long lineno) {
-  this->lineno = lineno;
-}
-
-
-
-token_c::token_c(const char *value) {
+  this->first_line   = 0;
+  this->first_column = 0;
+  this->last_line    = 0;
+  this->last_column  = 0;
+}
+
+symbol_c::symbol_c(int first_line, int first_column, int last_line, int last_column) {
+  this->first_line   = first_line;
+  this->first_column = first_column;
+  this->last_line    = last_line;
+  this->last_column  = last_column;
+}
+
+
+
+token_c::token_c(const char *value, int fl, int fc, int ll, int lc)
+  :symbol_c(fl, fc, ll, lc) {
   this->value = value;
 //  printf("New token: %s\n", value);
 }
@@ -62,12 +69,14 @@
 
 
 
-list_c::list_c(void) {
+list_c::list_c(int fl, int fc, int ll, int lc)
+  :symbol_c(fl, fc, ll, lc) {
   n = 0;
   elements = NULL;
 }
 
-list_c::list_c(symbol_c *elem) {
+list_c::list_c(symbol_c *elem, int fl, int fc, int ll, int lc)
+  :symbol_c(fl, fc, ll, lc) {
   n = 0;
   elements = NULL;
   add_element(elem);
@@ -81,37 +90,95 @@
   if (elements == NULL)
     ABORT("Out of memory");
   elements[n - 1] = elem;
-}
-
+ 
+  if (elem == NULL)
+    return;
+
+  /* adjust the location parameters, taking into account the new element. */
+  if ((first_line == elem->first_line) &&
+      (first_column > elem->first_column)) {
+    first_column = elem->first_column;
+  }
+  if (first_line > elem->first_line) {
+    first_line = elem->first_line;
+    first_column = elem->first_column;
+  }
+  if ((last_line == elem->last_line) &&
+      (last_column < elem->last_column)) {
+    last_column = elem->last_column;
+  }
+  if (last_line < elem->last_line) {
+    last_line = elem->last_line;
+    last_column = elem->last_column;
+  }
+}
 
 
 
 
 #define SYM_LIST(class_name_c)							\
+class_name_c::class_name_c(int fl, int fc, int ll, int lc)			\
+			:list_c(fl, fc, ll, lc) {}				\
+class_name_c::class_name_c(symbol_c *elem, int fl, int fc, int ll, int lc)	\
+			:list_c(elem, fl, fc, ll, lc) {}			\
 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
 
 #define SYM_TOKEN(class_name_c)							\
-class_name_c::class_name_c(const char *value): token_c(value) {}			\
-void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
-
-#define SYM_REF0(class_name_c)			\
-void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
-
-
-#define SYM_REF2(class_name_c, ref1, ref2)	\
-class_name_c::class_name_c(symbol_c *ref1,	\
-			   symbol_c *ref2) {	\
-  this->ref1 = ref1;				\
-  this->ref2 = ref2;				\
-}						\
-void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
-
-
-#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4)	\
+class_name_c::class_name_c(const char *value, int fl, int fc, int ll, int lc)	\
+			:token_c(value, fl, fc, ll, lc) {}			\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+#define SYM_REF0(class_name_c)					\
+class_name_c::class_name_c(int fl, int fc,			\
+			   int ll, int lc			\
+			  ): symbol_c(fl, fc, ll, lc) {}	\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+
+#define SYM_REF1(class_name_c, ref1)			\
+class_name_c::class_name_c(symbol_c *ref1,		\
+			   int fl, int fc,		\
+			   int ll, int lc		\
+			  ): symbol_c(fl, fc, ll, lc) {	\
+  this->ref1 = ref1;					\
+}							\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+
+#define SYM_REF2(class_name_c, ref1, ref2)		\
+class_name_c::class_name_c(symbol_c *ref1,		\
+			   symbol_c *ref2,		\
+			   int fl, int fc,		\
+			   int ll, int lc		\
+			  ): symbol_c(fl, fc, ll, lc) {	\
+  this->ref1 = ref1;					\
+  this->ref2 = ref2;					\
+}							\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+
+#define SYM_REF3(class_name_c, ref1, ref2, ref3)	\
 class_name_c::class_name_c(symbol_c *ref1,		\
 			   symbol_c *ref2,		\
 			   symbol_c *ref3,		\
-			   symbol_c *ref4) {		\
+			   int fl, int fc,		\
+			   int ll, int lc		\
+			  ): symbol_c(fl, fc, ll, lc) {	\
+  this->ref1 = ref1;					\
+  this->ref2 = ref2;					\
+  this->ref3 = ref3;					\
+}							\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+
+#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4)	\
+class_name_c::class_name_c(symbol_c *ref1,		\
+			   symbol_c *ref2,		\
+			   symbol_c *ref3,		\
+			   symbol_c *ref4,		\
+			   int fl, int fc,		\
+			   int ll, int lc		\
+			  ): symbol_c(fl, fc, ll, lc) {	\
   this->ref1 = ref1;					\
   this->ref2 = ref2;					\
   this->ref3 = ref3;					\
@@ -120,20 +187,42 @@
 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
 
 
+#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5)		\
+class_name_c::class_name_c(symbol_c *ref1,				\
+			   symbol_c *ref2,				\
+			   symbol_c *ref3,				\
+			   symbol_c *ref4,				\
+			   symbol_c *ref5,				\
+			   int fl, int fc,				\
+			   int ll, int lc				\
+			  ): symbol_c(fl, fc, ll, lc) {			\
+  this->ref1 = ref1;							\
+  this->ref2 = ref2;							\
+  this->ref3 = ref3;							\
+  this->ref4 = ref4;							\
+  this->ref5 = ref5;							\
+}									\
+void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
+
+
+
 #define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6)	\
 class_name_c::class_name_c(symbol_c *ref1,				\
 			   symbol_c *ref2,				\
 			   symbol_c *ref3,				\
 			   symbol_c *ref4,				\
 			   symbol_c *ref5,				\
-			   symbol_c *ref6) {				\
-  this->ref1 = ref1;						\
-  this->ref2 = ref2;						\
-  this->ref3 = ref3;						\
-  this->ref4 = ref4;						\
-  this->ref5 = ref5;						\
-  this->ref6 = ref6;						\
-}								\
+			   symbol_c *ref6,				\
+			   int fl, int fc,				\
+			   int ll, int lc				\
+			  ): symbol_c(fl, fc, ll, lc) {			\
+  this->ref1 = ref1;							\
+  this->ref2 = ref2;							\
+  this->ref3 = ref3;							\
+  this->ref4 = ref4;							\
+  this->ref5 = ref5;							\
+  this->ref6 = ref6;							\
+}									\
 void *class_name_c::accept(visitor_c &visitor) {return visitor.visit(this);}
 
 
@@ -147,8 +236,11 @@
 #undef SYM_TOKEN
 #undef SYM_TOKEN
 #undef SYM_REF0
+#undef SYM_REF1
 #undef SYM_REF2
+#undef SYM_REF3
 #undef SYM_REF4
+#undef SYM_REF5
 #undef SYM_REF6