# HG changeset patch # User Mario de Sousa # Date 1302798925 -3600 # Node ID a4f4990d5c6621d604f8babb8288e81fb6400848 # Parent 64a4504633d42dd5e8da76fc7b7345492dbb5329 Adding tracking of filename in which token is located. diff -r 64a4504633d4 -r a4f4990d5c66 absyntax/absyntax.cc --- a/absyntax/absyntax.cc Tue Apr 05 19:42:33 2011 +0100 +++ b/absyntax/absyntax.cc Thu Apr 14 17:35:25 2011 +0100 @@ -49,24 +49,23 @@ /* The base class of all symbols */ -symbol_c::symbol_c(void) { - 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) { +symbol_c::symbol_c( + int first_line, int first_column, const char *ffile, + int last_line, int last_column, const char *lfile) { + this->first_file = ffile, this->first_line = first_line; this->first_column = first_column; + this->last_file = lfile, 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) { +token_c::token_c(const char *value, + int fl, int fc, const char *ffile, + int ll, int lc, const char *lfile) + :symbol_c(fl, fc, ffile, ll, lc, lfile) { this->value = value; // printf("New token: %s\n", value); } @@ -76,14 +75,18 @@ -list_c::list_c(int fl, int fc, int ll, int lc) - :symbol_c(fl, fc, ll, lc) { +list_c::list_c( + int fl, int fc, const char *ffile, + int ll, int lc, const char *lfile) + :symbol_c(fl, fc, ffile, ll, lc, lfile) { n = 0; elements = NULL; } -list_c::list_c(symbol_c *elem, int fl, int fc, int ll, int lc) - :symbol_c(fl, fc, ll, lc) { +list_c::list_c(symbol_c *elem, + int fl, int fc, const char *ffile, + int ll, int lc, const char *lfile) + :symbol_c(fl, fc, ffile, ll, lc, lfile) { n = 0; elements = NULL; add_element(elem); @@ -123,113 +126,120 @@ -#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, 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, \ - 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; \ - this->ref4 = ref4; \ -} \ -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, \ - 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; \ -} \ +#define SYM_LIST(class_name_c) \ +class_name_c::class_name_c( \ + int fl, int fc, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :list_c(fl, fc, ffile, ll, lc, lfile) {} \ +class_name_c::class_name_c(symbol_c *elem, \ + int fl, int fc, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :list_c(elem, fl, fc, ffile, ll, lc, lfile) {} \ +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, \ + int fl, int fc, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :token_c(value, fl, fc, ffile, ll, lc, lfile) {} \ +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, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) {} \ +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, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + 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, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + 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, \ + int fl, int fc, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + 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, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + this->ref1 = ref1; \ + this->ref2 = ref2; \ + this->ref3 = ref3; \ + this->ref4 = ref4; \ +} \ +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, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + 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, \ + int fl, int fc, const char *ffile, \ + int ll, int lc, const char *lfile) \ + :symbol_c(fl, fc, ffile, ll, lc, lfile) { \ + 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);} diff -r 64a4504633d4 -r a4f4990d5c66 absyntax/absyntax.hh --- a/absyntax/absyntax.hh Tue Apr 05 19:42:33 2011 +0100 +++ b/absyntax/absyntax.hh Thu Apr 14 17:35:25 2011 +0100 @@ -70,16 +70,15 @@ */ int first_line; int first_column; + const char *first_file; /* filename referenced by first line/column */ int last_line; int last_column; + const char *last_file; /* filename referenced by last line/column */ public: /* default constructor */ - symbol_c(void); - symbol_c(int fl /* first_line */, - int fc /* first_column */, - int ll = 0 /* last_line */, - int lc = 0 /* last_column */ + symbol_c(int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */ ); /* default destructor */ @@ -96,7 +95,10 @@ const char *value; public: - token_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); + token_c(const char *value, + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */ + ); }; @@ -107,8 +109,14 @@ symbol_c **elements; public: - list_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); - list_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); + list_c(int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */ + ); + + list_c(symbol_c *elem, + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */ + ); /* insert a new element */ virtual void add_element(symbol_c *elem); }; @@ -116,131 +124,138 @@ -#define SYM_LIST(class_name_c) \ -class class_name_c: public list_c { \ - public: \ - class_name_c(int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ - class_name_c(symbol_c *elem, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_TOKEN(class_name_c) \ -class class_name_c: public token_c { \ - public: \ - class_name_c(const char *value, int fl = 0, int fc = 0, int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF0(class_name_c) \ -class class_name_c: public symbol_c { \ - public: \ - class_name_c(int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF1(class_name_c, ref1) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - public: \ - class_name_c(symbol_c *ref1, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF2(class_name_c, ref1, ref2) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - symbol_c *ref2; \ - public: \ - class_name_c(symbol_c *ref1, \ - symbol_c *ref2 = NULL, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF3(class_name_c, ref1, ref2, ref3) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - symbol_c *ref2; \ - symbol_c *ref3; \ - public: \ - class_name_c(symbol_c *ref1, \ - symbol_c *ref2, \ - symbol_c *ref3, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - symbol_c *ref2; \ - symbol_c *ref3; \ - symbol_c *ref4; \ - public: \ - class_name_c(symbol_c *ref1, \ - symbol_c *ref2, \ - symbol_c *ref3, \ - symbol_c *ref4 = NULL, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - symbol_c *ref2; \ - symbol_c *ref3; \ - symbol_c *ref4; \ - symbol_c *ref5; \ - public: \ - class_name_c(symbol_c *ref1, \ - symbol_c *ref2, \ - symbol_c *ref3, \ - symbol_c *ref4, \ - symbol_c *ref5, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ -}; - - -#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6) \ -class class_name_c: public symbol_c { \ - public: \ - symbol_c *ref1; \ - symbol_c *ref2; \ - symbol_c *ref3; \ - symbol_c *ref4; \ - symbol_c *ref5; \ - symbol_c *ref6; \ - public: \ - class_name_c(symbol_c *ref1, \ - symbol_c *ref2, \ - symbol_c *ref3, \ - symbol_c *ref4, \ - symbol_c *ref5, \ - symbol_c *ref6 = NULL, \ - int fl = 0, int fc = 0, \ - int ll = 0, int lc = 0); \ - virtual void *accept(visitor_c &visitor); \ +#define SYM_LIST(class_name_c) \ +class class_name_c: public list_c { \ + public: \ + class_name_c( \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + class_name_c(symbol_c *elem, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_TOKEN(class_name_c) \ +class class_name_c: public token_c { \ + public: \ + class_name_c(const char *value, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF0(class_name_c) \ +class class_name_c: public symbol_c { \ + public: \ + class_name_c( \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF1(class_name_c, ref1) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + public: \ + class_name_c(symbol_c *ref1, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF2(class_name_c, ref1, ref2) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + symbol_c *ref2; \ + public: \ + class_name_c(symbol_c *ref1, \ + symbol_c *ref2 = NULL, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF3(class_name_c, ref1, ref2, ref3) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + symbol_c *ref2; \ + symbol_c *ref3; \ + public: \ + class_name_c(symbol_c *ref1, \ + symbol_c *ref2, \ + symbol_c *ref3, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF4(class_name_c, ref1, ref2, ref3, ref4) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + symbol_c *ref2; \ + symbol_c *ref3; \ + symbol_c *ref4; \ + public: \ + class_name_c(symbol_c *ref1, \ + symbol_c *ref2, \ + symbol_c *ref3, \ + symbol_c *ref4 = NULL, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF5(class_name_c, ref1, ref2, ref3, ref4, ref5) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + symbol_c *ref2; \ + symbol_c *ref3; \ + symbol_c *ref4; \ + symbol_c *ref5; \ + public: \ + class_name_c(symbol_c *ref1, \ + symbol_c *ref2, \ + symbol_c *ref3, \ + symbol_c *ref4, \ + symbol_c *ref5, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ +}; + + +#define SYM_REF6(class_name_c, ref1, ref2, ref3, ref4, ref5, ref6) \ +class class_name_c: public symbol_c { \ + public: \ + symbol_c *ref1; \ + symbol_c *ref2; \ + symbol_c *ref3; \ + symbol_c *ref4; \ + symbol_c *ref5; \ + symbol_c *ref6; \ + public: \ + class_name_c(symbol_c *ref1, \ + symbol_c *ref2, \ + symbol_c *ref3, \ + symbol_c *ref4, \ + symbol_c *ref5, \ + symbol_c *ref6 = NULL, \ + int fl = 0, int fc = 0, const char *ffile = NULL /* filename */, \ + int ll = 0, int lc = 0, const char *lfile = NULL /* filename */); \ + virtual void *accept(visitor_c &visitor); \ }; diff -r 64a4504633d4 -r a4f4990d5c66 stage1_2/iec.flex --- a/stage1_2/iec.flex Tue Apr 05 19:42:33 2011 +0100 +++ b/stage1_2/iec.flex Thu Apr 14 17:35:25 2011 +0100 @@ -184,11 +184,13 @@ * back to the bison parser... */ #define YY_USER_ACTION {\ - yylloc.first_line = current_tracking->lineNumber;\ - yylloc.first_column = current_tracking->currentTokenStart;\ - yylloc.last_line = current_tracking->lineNumber;\ - yylloc.last_column = current_tracking->currentChar - 1;\ - current_tracking->currentTokenStart = current_tracking->currentChar;\ + yylloc.first_line = current_tracking->lineNumber;\ + yylloc.first_column = current_tracking->currentTokenStart;\ + yylloc.first_file = current_filename;\ + yylloc.last_line = current_tracking->lineNumber;\ + yylloc.last_column = current_tracking->currentChar - 1;\ + yylloc.last_file = current_filename;\ + current_tracking->currentTokenStart = current_tracking->currentChar;\ } @@ -858,7 +860,13 @@ * the first one (i.e. the one that gets stored in include_stack[0], * which is never free'd! */ - free((char *)current_filename); + /* NOTE: We do __NOT__ free the malloc()'d memory since + * pointers to this filename will be kept by many objects + * in the abstract syntax tree. + * This will later be used to provide correct error + * messages during semantic analysis (stage 3) + */ + /* free((char *)current_filename); */ current_filename = include_stack[include_stack_ptr].filename; yy_push_state(include_end); } diff -r 64a4504633d4 -r a4f4990d5c66 stage1_2/iec.y --- a/stage1_2/iec.y Tue Apr 05 19:42:33 2011 +0100 +++ b/stage1_2/iec.y Thu Apr 14 17:35:25 2011 +0100 @@ -116,10 +116,32 @@ /* Macros used to pass the line and column locations when * creating a new object for the abstract syntax tree. */ -#define locloc(foo) foo.first_line, foo.first_column, foo.last_line, foo.last_column -#define locf(foo) foo.first_line, foo.first_column -#define locl(foo) foo.last_line, foo.last_column - +#define locloc(foo) foo.first_line, foo.first_column, foo.first_file, foo.last_line, foo.last_column, foo.last_file +#define locf(foo) foo.first_line, foo.first_column, foo.first_file +#define locl(foo) foo.last_line, foo.last_column, foo.last_file + +/* Redefine the default action to take for each rule, so that the filenames are correctly processed... */ +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ + (Current).first_file = YYRHSLOC(Rhs, 1).first_file; \ + (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ + (Current).last_file = YYRHSLOC(Rhs, 1).last_file; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC(Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC(Rhs, 0).last_column; \ + (Current).first_file = (Current).last_file = \ + YYRHSLOC(Rhs, 0).last_file; \ + } \ + while (0) /* A macro for printing out internal parser errors... */ @@ -182,8 +204,10 @@ /* print an error message */ void print_err_msg(int first_line, int first_column, + const char *first_filename, int last_line, int last_column, + const char *last_filename, const char *additional_error_msg); %} @@ -194,6 +218,44 @@ // %expect-rr 1 +/* The following definitions need to be inside a '%code requires' + * so that they are also included in the header files. If this were not the case, + * YYLTYPE would be delcared as something in the iec.cc file, and another thing + * (actually the default value of YYLTYPE) in the iec.y.hh heder file. + */ +%code requires { +/* define a new data type to store the locations, so we can also store + * the filename in which the token is expressed. + */ +/* NOTE: since this code will be placed in the iec.y.hh header file, + * as well as the iec.cc file that also includes the iec.y.hh header file, + * declaring the typedef struct yyltype__local here would result in a + * compilation error when compiling iec.cc, as this struct would be + * declared twice. + * We therefore use the #if !defined YYLTYPE ... + * to make sure only the first declaration is parsed by the C++ compiler. + * + * At first glance it seems that what we really should do is delcare the + * YYLTYPE directly as an anonymous struct, thus: + * #define YYLTYPE struct{ ...} + * however, this also results in compilation errors. + * + * I (Mario) think this is kind of a hack. If you know how to + * do this re-declaration of YYLTYPE properly, please let me know! + */ +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED + typedef struct { + int first_line; + int first_column; + const char *first_file; + int last_line; + int last_column; + const char *last_file; + } yyltype__local; + #define YYLTYPE yyltype__local +#endif +} + %union { @@ -7829,13 +7891,24 @@ void print_err_msg(int first_line, int first_column, + const char *first_filename, int last_line, int last_column, + const char *last_filename, const char *additional_error_msg) { - if (full_token_loc) - fprintf(stderr, "%s:%d-%d..%d-%d: error : %s\n", current_filename, first_line, first_column, last_line, last_column, additional_error_msg); - else - fprintf(stderr, "%s:%d: error : %s\n", current_filename, first_line, additional_error_msg); + + const char *unknown_file = ""; + if (first_filename == NULL) first_filename = unknown_file; + if ( last_filename == NULL) last_filename = unknown_file; + + if (full_token_loc) { + if (first_filename == last_filename) + fprintf(stderr, "%s:%d-%d..%d-%d: error : %s\n", first_filename, first_line, first_column, last_line, last_column, additional_error_msg); + else + fprintf(stderr, "%s:%d-%d..%s:%d-%d: error : %s\n", first_filename, first_line, first_column, last_filename, last_line, last_column, additional_error_msg); + } else { + fprintf(stderr, "%s:%d: error : %s\n", first_filename, first_line, additional_error_msg); + } //fprintf(stderr, "error %d: %s\n", yynerrs /* a global variable */, additional_error_msg); print_include_stack(); //fprintf(stderr, "%s(%d-%d): %s\n", current_filename, first_line, last_line, current_error_msg); @@ -7926,8 +7999,10 @@ res = new identifier_c(strdup(name), il_operator->first_line, il_operator->first_column, + il_operator->first_file, il_operator->last_line, - il_operator->last_column + il_operator->last_column, + il_operator->last_file ); free(il_operator); return res; diff -r 64a4504633d4 -r a4f4990d5c66 stage3/visit_expression_type.cc --- a/stage3/visit_expression_type.cc Tue Apr 05 19:42:33 2011 +0100 +++ b/stage3/visit_expression_type.cc Thu Apr 14 17:35:25 2011 +0100 @@ -43,8 +43,25 @@ #include #include - - +/* +static inline symbol_c * FIRST_(symbol_c *symbol1, symbol_c *symbol2) { + if (symbol1->first_file == symbol2->first_file) return symbol1; + + if (symbol1->first_line < symbol2->first_line) return symbol1; + if (symbol1->first_line > symbol2->first_line) return symbol2; + if (symbol1->first_column < symbol2->first_column) return symbol1; + if (symbol1->first_column > symbol2->first_column) return symbol2; + return symbol1; +} + +#define FIRST_(symbol1, symbol2) (((symbol1)->last_file == (symbol2)->first_file) ? (symbol1) : \ + ((symbol1)->first_file == (symbol2)->last_file) ? (symbol2) : \ + ((symbol1)->first_line < (symbol2)->first_line) ? (symbol1) : \ + ((symbol1)->first_line > (symbol2)->first_line) ? (symbol2) : \ + ((symbol1)->first_column < (symbol2)->first_column) ? (symbol1) : \ + ((symbol1)->first_column > (symbol2)->first_column) ? (symbol2) : \ + (symbol1)) +*/ #define FIRST_(symbol1, symbol2) (((symbol1)->first_line < (symbol2)->first_line) ? (symbol1) : \ ((symbol1)->first_line > (symbol2)->first_line) ? (symbol2) : \ ((symbol1)->first_column < (symbol2)->first_column) ? (symbol1) : \ @@ -58,9 +75,9 @@ (symbol1)) #define STAGE3_ERROR(symbol1, symbol2, msg) { \ - fprintf(stderr, "semantic error between (%d:%d) and (%d:%d): %s\n", \ - FIRST_(symbol1,symbol2)->first_line, FIRST_(symbol1,symbol2)->first_column, \ - LAST_(symbol1,symbol2) ->last_line, LAST_(symbol1,symbol2) ->last_column, \ + fprintf(stderr, "%s:(%d:%d) .. %s(%d:%d): %s\n", \ + FIRST_(symbol1,symbol2)->first_file, FIRST_(symbol1,symbol2)->first_line, FIRST_(symbol1,symbol2)->first_column, \ + LAST_(symbol1,symbol2) ->last_file, LAST_(symbol1,symbol2) ->last_line, LAST_(symbol1,symbol2) ->last_column, \ msg); \ il_error = true; \ error_found = true; \