diff -r b0a43002dcac -r 41cb5b80416e absyntax/absyntax.cc --- 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