merge
authorMario de Sousa <msousa@fe.up.pt>
Thu, 10 Jan 2013 10:38:41 +0000
changeset 791 ab601bdea102
parent 786 c370918ca7fb (diff)
parent 790 a722594dcd64 (current diff)
child 792 78083edf93d5
merge
stage3/constant_folding.cc
--- a/absyntax/absyntax.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/absyntax/absyntax.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -111,14 +111,23 @@
   if (NULL == elem) return;
 
   /* adjust the location parameters, taking into account the new element. */
-  if ((first_line == elem->first_line) &&
-      (first_column > elem->first_column)) {
+  if (NULL == first_file) {
+    first_file = elem->first_file;
+    first_line = elem->first_line;
+    first_column = elem->first_column;
+  }
+  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 (NULL == last_file) {
+    last_file = elem->last_file;
+    last_line = elem->last_line;
+    last_column = elem->last_column;
+  }
   if ((last_line == elem->last_line) &&
       (last_column < elem->last_column)) {
     last_column = elem->last_column;
--- a/absyntax_utils/get_datatype_info.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/absyntax_utils/get_datatype_info.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -103,6 +103,113 @@
 
 
 
+/***********************************************************************/
+/***********************************************************************/
+
+
+/* A small helper class, to transform elementary data type to string.
+ * this allows us to generate more relevant error messages...
+ */
+
+class get_datatype_id_str_c: public null_visitor_c {
+  protected:
+     get_datatype_id_str_c(void)  {};
+    ~get_datatype_id_str_c(void) {};
+
+  private:
+    /* singleton class! */
+    static get_datatype_id_str_c *singleton;
+
+  public:
+    static const char *get_id_str(symbol_c *symbol) {
+      if (NULL == singleton)    singleton = new get_datatype_id_str_c;
+      if (NULL == singleton)    ERROR;
+      const char *res           = (const char *)symbol->accept(*singleton);
+      if (NULL == res)          ERROR;
+      return res;
+    }
+
+
+    /*************************/
+    /* B.1 - Common elements */
+    /*************************/
+    /*******************************************/
+    /* B 1.1 - Letters, digits and identifiers */
+    /*******************************************/
+    void *visit(identifier_c *symbol) {return (void *)symbol->value;};
+
+    /***********************************/
+    /* B 1.3.1 - Elementary Data Types */
+    /***********************************/
+    void *visit(time_type_name_c        *symbol) {return (void *)"TIME";        };
+    void *visit(bool_type_name_c        *symbol) {return (void *)"BOOL";        };
+    void *visit(sint_type_name_c        *symbol) {return (void *)"SINT";        };
+    void *visit(int_type_name_c         *symbol) {return (void *)"INT";         };
+    void *visit(dint_type_name_c        *symbol) {return (void *)"DINT";        };
+    void *visit(lint_type_name_c        *symbol) {return (void *)"LINT";        };
+    void *visit(usint_type_name_c       *symbol) {return (void *)"USINT";       };
+    void *visit(uint_type_name_c        *symbol) {return (void *)"UINT";        };
+    void *visit(udint_type_name_c       *symbol) {return (void *)"UDINT";       };
+    void *visit(ulint_type_name_c       *symbol) {return (void *)"ULINT";       };
+    void *visit(real_type_name_c        *symbol) {return (void *)"REAL";        };
+    void *visit(lreal_type_name_c       *symbol) {return (void *)"LREAL";       };
+    void *visit(date_type_name_c        *symbol) {return (void *)"DATE";        };
+    void *visit(tod_type_name_c         *symbol) {return (void *)"TOD";         };
+    void *visit(dt_type_name_c          *symbol) {return (void *)"DT";          };
+    void *visit(byte_type_name_c        *symbol) {return (void *)"BYTE";        };
+    void *visit(word_type_name_c        *symbol) {return (void *)"WORD";        };
+    void *visit(lword_type_name_c       *symbol) {return (void *)"LWORD";       };
+    void *visit(dword_type_name_c       *symbol) {return (void *)"DWORD";       };
+    void *visit(string_type_name_c      *symbol) {return (void *)"STRING";      };
+    void *visit(wstring_type_name_c     *symbol) {return (void *)"WSTRING";     };
+
+    void *visit(safetime_type_name_c    *symbol) {return (void *)"SAFETIME";    };
+    void *visit(safebool_type_name_c    *symbol) {return (void *)"SAFEBOOL";    };
+    void *visit(safesint_type_name_c    *symbol) {return (void *)"SAFESINT";    };
+    void *visit(safeint_type_name_c     *symbol) {return (void *)"SAFEINT";     };
+    void *visit(safedint_type_name_c    *symbol) {return (void *)"SAFEDINT";    };
+    void *visit(safelint_type_name_c    *symbol) {return (void *)"SAFELINT";    };
+    void *visit(safeusint_type_name_c   *symbol) {return (void *)"SAFEUSINT";   };
+    void *visit(safeuint_type_name_c    *symbol) {return (void *)"SAFEUINT";    };
+    void *visit(safeudint_type_name_c   *symbol) {return (void *)"SAFEUDINT";   };
+    void *visit(safeulint_type_name_c   *symbol) {return (void *)"SAFEULINT";   };
+    void *visit(safereal_type_name_c    *symbol) {return (void *)"SAFEREAL";    };
+    void *visit(safelreal_type_name_c   *symbol) {return (void *)"SAFELREAL";   };
+    void *visit(safedate_type_name_c    *symbol) {return (void *)"SAFEDATE";    };
+    void *visit(safetod_type_name_c     *symbol) {return (void *)"SAFETOD";     };
+    void *visit(safedt_type_name_c      *symbol) {return (void *)"SAFEDT";      };
+    void *visit(safebyte_type_name_c    *symbol) {return (void *)"SAFEBYTE";    };
+    void *visit(safeword_type_name_c    *symbol) {return (void *)"SAFEWORD";    };
+    void *visit(safelword_type_name_c   *symbol) {return (void *)"SAFELWORD";   };
+    void *visit(safedword_type_name_c   *symbol) {return (void *)"SAFEDWORD";   };
+    void *visit(safestring_type_name_c  *symbol) {return (void *)"SAFESTRING";  };
+    void *visit(safewstring_type_name_c *symbol) {return (void *)"SAFEWSTRING"; };
+
+    /********************************/
+    /* B 1.3.3 - Derived data types */
+    /********************************/
+    /*  simple_type_name ':' simple_spec_init */
+    void *visit(simple_type_declaration_c *symbol)      {return symbol->simple_type_name->accept(*this);}
+    /*  subrange_type_name ':' subrange_spec_init */
+    void *visit(subrange_type_declaration_c *symbol)    {return symbol->subrange_type_name->accept(*this);}
+    /*  enumerated_type_name ':' enumerated_spec_init */
+    void *visit(enumerated_type_declaration_c *symbol)  {return symbol->enumerated_type_name->accept(*this);}
+    /*  identifier ':' array_spec_init */
+    void *visit(array_type_declaration_c *symbol)       {return symbol->identifier->accept(*this);}
+    /*  structure_type_name ':' structure_specification */
+    void *visit(structure_type_declaration_c *symbol)   {return symbol->structure_type_name->accept(*this);}
+    /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
+    void *visit(string_type_declaration_c *symbol)      {return symbol->string_type_name->accept(*this);}
+    
+    /*****************************/
+    /* B 1.5.2 - Function Blocks */
+    /*****************************/
+    /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
+    void *visit(function_block_declaration_c *symbol)      {return symbol->fblock_name->accept(*this);}    
+};
+
+get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL;
+
 
 
 /**********************************************************/
@@ -117,9 +224,12 @@
 /**********************************************************/
 /**********************************************************/
 
-
-
-symbol_c *get_datatype_info_c::get_datatype_id(symbol_c *datatype) {
+const char *get_datatype_info_c::get_id_str(symbol_c *datatype) {
+  return get_datatype_id_str_c::get_id_str(datatype);
+}
+
+
+symbol_c *get_datatype_info_c::get_id(symbol_c *datatype) {
   return get_datatype_id_c::get_id(datatype);
 }
 
--- a/absyntax_utils/get_datatype_info.hh	Thu Jan 03 23:39:25 2013 +0100
+++ b/absyntax_utils/get_datatype_info.hh	Thu Jan 10 10:38:41 2013 +0000
@@ -57,7 +57,8 @@
 
   
   public:
-    static symbol_c *get_datatype_id(symbol_c *datatype); /* get the identifier (name) of the datatype); returns NULL if anonymous datatype! */
+    static symbol_c   *get_id    (symbol_c *datatype); /* get the identifier (name) of the datatype); returns NULL if anonymous datatype! Does not work for elementary datatypes!*/
+    static const char *get_id_str(symbol_c *datatype); /* get the identifier (name) of the datatype); returns NULL if anonymous datatype! */
       
     static bool is_type_equal(symbol_c *first_type, symbol_c *second_type);
     static bool is_type_valid(symbol_c *type);
--- a/stage3/constant_folding.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/stage3/constant_folding.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -450,6 +450,8 @@
 	if (!VALID_CVALUE(uint64, res))
 		return;
 	/* Test by pre-condition: If (UINT64_MAX / a) < b => overflow! */
+	if (0 == GET_CVALUE(uint64, a))
+		return; // multiplying by 0 will always result in 0, a valid result!	  
 	if ((UINT64_MAX / GET_CVALUE(uint64, a)) < GET_CVALUE(uint64, b))
 		SET_OVFLOW(uint64, res);
 }
--- a/stage3/datatype_functions.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/stage3/datatype_functions.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -31,19 +31,6 @@
 
 
 
-elementary_type_c *elementary_type_c::singleton = NULL;
-
-const char *elementary_type_c::to_string(symbol_c *symbol) {
-  if (NULL == singleton)    singleton = new elementary_type_c;
-  if (NULL == singleton)    ERROR;
-  const char *res           = (const char *)symbol->accept(*singleton);
-  if (NULL == res)          ERROR;
-  return res;
-}
-
-
-
-
 
 /* Macro that expand to subtypes */
 /* copied from matiec/lib/create_standard_functions_txt.sh */
--- a/stage3/datatype_functions.hh	Thu Jan 03 23:39:25 2013 +0100
+++ b/stage3/datatype_functions.hh	Thu Jan 10 10:38:41 2013 +0000
@@ -47,71 +47,6 @@
 
 
 
-/* A small helper class, to transform elementary data type to string.
- * this allows us to generate more relevant error messages...
- */
-
-class elementary_type_c: public null_visitor_c {
-  protected:
-    elementary_type_c(void)  {};
-    ~elementary_type_c(void) {};
-
-  private:
-    /* singleton class! */
-    static elementary_type_c *singleton;
-
-  public:
-    static const char * to_string(symbol_c *symbol);
-
-
-    /***********************************/
-    /* B 1.3.1 - Elementary Data Types */
-    /***********************************/
-    void *visit(time_type_name_c        *symbol) {return (void *)"TIME";        };
-    void *visit(bool_type_name_c        *symbol) {return (void *)"BOOL";        };
-    void *visit(sint_type_name_c        *symbol) {return (void *)"SINT";        };
-    void *visit(int_type_name_c         *symbol) {return (void *)"INT";         };
-    void *visit(dint_type_name_c        *symbol) {return (void *)"DINT";        };
-    void *visit(lint_type_name_c        *symbol) {return (void *)"LINT";        };
-    void *visit(usint_type_name_c       *symbol) {return (void *)"USINT";       };
-    void *visit(uint_type_name_c        *symbol) {return (void *)"UINT";        };
-    void *visit(udint_type_name_c       *symbol) {return (void *)"UDINT";       };
-    void *visit(ulint_type_name_c       *symbol) {return (void *)"ULINT";       };
-    void *visit(real_type_name_c        *symbol) {return (void *)"REAL";        };
-    void *visit(lreal_type_name_c       *symbol) {return (void *)"LREAL";       };
-    void *visit(date_type_name_c        *symbol) {return (void *)"DATE";        };
-    void *visit(tod_type_name_c         *symbol) {return (void *)"TOD";         };
-    void *visit(dt_type_name_c          *symbol) {return (void *)"DT";          };
-    void *visit(byte_type_name_c        *symbol) {return (void *)"BYTE";        };
-    void *visit(word_type_name_c        *symbol) {return (void *)"WORD";        };
-    void *visit(lword_type_name_c       *symbol) {return (void *)"LWORD";       };
-    void *visit(dword_type_name_c       *symbol) {return (void *)"DWORD";       };
-    void *visit(string_type_name_c      *symbol) {return (void *)"STRING";      };
-    void *visit(wstring_type_name_c     *symbol) {return (void *)"WSTRING";     };
-
-    void *visit(safetime_type_name_c    *symbol) {return (void *)"SAFETIME";    };
-    void *visit(safebool_type_name_c    *symbol) {return (void *)"SAFEBOOL";    };
-    void *visit(safesint_type_name_c    *symbol) {return (void *)"SAFESINT";    };
-    void *visit(safeint_type_name_c     *symbol) {return (void *)"SAFEINT";     };
-    void *visit(safedint_type_name_c    *symbol) {return (void *)"SAFEDINT";    };
-    void *visit(safelint_type_name_c    *symbol) {return (void *)"SAFELINT";    };
-    void *visit(safeusint_type_name_c   *symbol) {return (void *)"SAFEUSINT";   };
-    void *visit(safeuint_type_name_c    *symbol) {return (void *)"SAFEUINT";    };
-    void *visit(safeudint_type_name_c   *symbol) {return (void *)"SAFEUDINT";   };
-    void *visit(safeulint_type_name_c   *symbol) {return (void *)"SAFEULINT";   };
-    void *visit(safereal_type_name_c    *symbol) {return (void *)"SAFEREAL";    };
-    void *visit(safelreal_type_name_c   *symbol) {return (void *)"SAFELREAL";   };
-    void *visit(safedate_type_name_c    *symbol) {return (void *)"SAFEDATE";    };
-    void *visit(safetod_type_name_c     *symbol) {return (void *)"SAFETOD";     };
-    void *visit(safedt_type_name_c      *symbol) {return (void *)"SAFEDT";      };
-    void *visit(safebyte_type_name_c    *symbol) {return (void *)"SAFEBYTE";    };
-    void *visit(safeword_type_name_c    *symbol) {return (void *)"SAFEWORD";    };
-    void *visit(safelword_type_name_c   *symbol) {return (void *)"SAFELWORD";   };
-    void *visit(safedword_type_name_c   *symbol) {return (void *)"SAFEDWORD";   };
-    void *visit(safestring_type_name_c  *symbol) {return (void *)"SAFESTRING";  };
-    void *visit(safewstring_type_name_c *symbol) {return (void *)"SAFEWSTRING"; };
-};
-
 
 
 
--- a/stage3/print_datatypes_error.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/stage3/print_datatypes_error.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -398,7 +398,7 @@
 
 void *print_datatypes_error_c::visit(integer_literal_c *symbol) {
 	if (symbol->candidate_datatypes.size() == 0) {
-		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", elementary_type_c::to_string(symbol->type));
+		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", get_datatype_info_c::get_id_str(symbol->type));
 	} else if (NULL == symbol->datatype) {
 		STAGE3_ERROR(4, symbol, symbol, "ANY_INT data type not valid in this location.");
 	}
@@ -407,7 +407,7 @@
 
 void *print_datatypes_error_c::visit(real_literal_c *symbol) {
 	if (symbol->candidate_datatypes.size() == 0) {
-		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", elementary_type_c::to_string(symbol->type));
+		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", get_datatype_info_c::get_id_str(symbol->type));
 	} else if (NULL == symbol->datatype) {
 		STAGE3_ERROR(4, symbol, symbol, "ANY_REAL data type not valid in this location.");
 	}
@@ -416,7 +416,7 @@
 
 void *print_datatypes_error_c::visit(bit_string_literal_c *symbol) {
 	if (symbol->candidate_datatypes.size() == 0) {
-		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", elementary_type_c::to_string(symbol->type));
+		STAGE3_ERROR(0, symbol, symbol, "Numerical value exceeds range for %s data type.", get_datatype_info_c::get_id_str(symbol->type));
 	} else if (NULL == symbol->datatype) {
 		STAGE3_ERROR(4, symbol, symbol, "ANY_BIT data type not valid in this location.");
 	}
@@ -425,7 +425,7 @@
 
 void *print_datatypes_error_c::visit(boolean_literal_c *symbol) {
 	if (symbol->candidate_datatypes.size() == 0) {
-		STAGE3_ERROR(0, symbol, symbol, "Value is not valid for %s data type.", elementary_type_c::to_string(symbol->type));
+		STAGE3_ERROR(0, symbol, symbol, "Value is not valid for %s data type.", get_datatype_info_c::get_id_str(symbol->type));
 	} else if (NULL == symbol->datatype) {
 		STAGE3_ERROR(4, symbol, symbol, "ANY_BOOL data type not valid in this location.");
 	}
--- a/stage4/generate_c/generate_c_typedecl.cc	Thu Jan 03 23:39:25 2013 +0100
+++ b/stage4/generate_c/generate_c_typedecl.cc	Thu Jan 10 10:38:41 2013 +0000
@@ -321,7 +321,7 @@
       debug_c::print(symbol);
       ERROR;
     }
-    symbol_c *type_name = get_datatype_info_c::get_datatype_id(symbol->datatype);
+    symbol_c *type_name = get_datatype_info_c::get_id(symbol->datatype);
     if (NULL == type_name) {
 //       ERROR_MSG("generate_c does not support anonymous enumerated data types.");
     } else