--- 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