absyntax_utils/search_base_type.cc
changeset 625 c0bda77b37a0
parent 412 aad38592bdde
parent 619 f8c9ac5c529a
child 667 bd1360f29f15
child 706 31553c22f318
--- a/absyntax_utils/search_base_type.cc	Tue Aug 14 19:40:01 2012 +0200
+++ b/absyntax_utils/search_base_type.cc	Wed Aug 22 16:46:17 2012 +0200
@@ -1,7 +1,7 @@
 /*
  *  matiec - a compiler for the programming languages defined in IEC 61131-3
  *
- *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
+ *  Copyright (C) 2003-2012  Mario de Sousa (msousa@fe.up.pt)
  *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
  *
  *  This program is free software: you can redistribute it and/or modify
@@ -46,25 +46,35 @@
  * we may have FB instances declared of a specific FB type.
  */
 #include "absyntax_utils.hh"
-
-#define ERROR error_exit(__FILE__,__LINE__)
-/* function defined in main.cc */
-extern void error_exit(const char *file_name, int line_no);
+#include "../main.hh" // required for ERROR() and ERROR_MSG() macros.
 
 
 
 search_base_type_c::search_base_type_c(void) {current_type_name = NULL;}
 
-void *search_base_type_c::visit(identifier_c *type_name) {
-  this->current_type_name = type_name;
-  /* look up the type declaration... */
-  symbol_c *type_decl = type_symtable.find_value(type_name);
-  if (type_decl == type_symtable.end_value())
-    /* Type declaration not found!! */
-    ERROR;
-
-  return type_decl->accept(*this);
-}
+
+
+
+symbol_c *search_base_type_c::get_basetype_decl(symbol_c *symbol) {
+  if (NULL == symbol)
+    return NULL;
+  
+  return (symbol_c *)symbol->accept(*this);
+}
+
+symbol_c *search_base_type_c::get_basetype_id  (symbol_c *symbol) {
+  if (NULL == symbol)
+    return NULL;
+  
+  current_type_name = NULL; /* just to be on the safe side... */
+  symbol->accept(*this);
+  return (symbol_c *)current_type_name;
+}
+
+
+/* Note by MJS: The following two functions definately do not belong in this class!! Maybe create a new utility class?
+ * I will need to clean this up when the opportunity arises!
+ */
 
 bool search_base_type_c::type_is_subrange(symbol_c* type_decl) {
   this->is_subrange = false;
@@ -78,6 +88,35 @@
   return this->is_enumerated;
 }
 
+
+/*************************/
+/* B.1 - Common elements */
+/*************************/
+
+/*******************************************/
+/* B 1.1 - Letters, digits and identifiers */
+/*******************************************/
+void *search_base_type_c::visit(identifier_c *type_name) {
+  symbol_c *type_decl;
+
+  this->current_type_name = type_name;
+  
+  /* look up the type declaration... */
+  type_decl = type_symtable.find_value(type_name);
+  if (type_decl != type_symtable.end_value())
+    return type_decl->accept(*this);
+    
+  type_decl = function_block_type_symtable.find_value(type_name);
+  if (type_decl != function_block_type_symtable.end_value())
+    return type_decl->accept(*this);
+  
+  /* Type declaration not found!! */
+    ERROR;
+    
+  return NULL;
+}
+
+
 /*********************/
 /* B 1.2 - Constants */
 /*********************/
@@ -92,41 +131,41 @@
   * with all inputs of the same data type.
   * If 'x' were a SINT, then the '30' would have to be a SINT too!
   */
-void *search_base_type_c::visit(real_c *symbol)          	{return (void *)symbol;}
-void *search_base_type_c::visit(neg_real_c *symbol)          	{return (void *)symbol;}
-void *search_base_type_c::visit(integer_c *symbol)       	{return (void *)symbol;}
-void *search_base_type_c::visit(neg_integer_c *symbol)       	{return (void *)symbol;}
-void *search_base_type_c::visit(binary_integer_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(octal_integer_c *symbol) 	{return (void *)symbol;}
-void *search_base_type_c::visit(hex_integer_c *symbol)   	{return (void *)symbol;}
-void *search_base_type_c::visit(boolean_true_c *symbol)   	{return (void *)symbol;}
-void *search_base_type_c::visit(boolean_false_c *symbol)   	{return (void *)symbol;}
+void *search_base_type_c::visit(real_c *symbol)                   {return (void *)symbol;}
+void *search_base_type_c::visit(neg_real_c *symbol)               {return (void *)symbol;}
+void *search_base_type_c::visit(integer_c *symbol)                {return (void *)symbol;}
+void *search_base_type_c::visit(neg_integer_c *symbol)            {return (void *)symbol;}
+void *search_base_type_c::visit(binary_integer_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(octal_integer_c *symbol)          {return (void *)symbol;}
+void *search_base_type_c::visit(hex_integer_c *symbol)            {return (void *)symbol;}
+void *search_base_type_c::visit(boolean_true_c *symbol)           {return (void *)symbol;}
+void *search_base_type_c::visit(boolean_false_c *symbol)          {return (void *)symbol;}
 
 
 /***********************************/
 /* B 1.3.1 - Elementary Data Types */
 /***********************************/
-void *search_base_type_c::visit(time_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(bool_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(sint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(int_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(dint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(lint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(usint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(uint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(udint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(ulint_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(real_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(lreal_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(date_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(tod_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(dt_type_name_c *symbol)		{return (void *)symbol;}
-void *search_base_type_c::visit(byte_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(word_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(dword_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(lword_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(string_type_name_c *symbol)	{return (void *)symbol;}
-void *search_base_type_c::visit(wstring_type_name_c *symbol)	{return (void *)symbol;}
+void *search_base_type_c::visit(time_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(bool_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(sint_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(int_type_name_c *symbol)          {return (void *)symbol;}
+void *search_base_type_c::visit(dint_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(lint_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(usint_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(uint_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(udint_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(ulint_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(real_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(lreal_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(date_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(tod_type_name_c *symbol)          {return (void *)symbol;}
+void *search_base_type_c::visit(dt_type_name_c *symbol)           {return (void *)symbol;}
+void *search_base_type_c::visit(byte_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(word_type_name_c *symbol)         {return (void *)symbol;}
+void *search_base_type_c::visit(dword_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(lword_type_name_c *symbol)        {return (void *)symbol;}
+void *search_base_type_c::visit(string_type_name_c *symbol)       {return (void *)symbol;}
+void *search_base_type_c::visit(wstring_type_name_c *symbol)      {return (void *)symbol;}
 
 
 /******************************************************/
@@ -188,7 +227,7 @@
 }
 
 /*  signed_integer DOTDOT signed_integer */
-void *search_base_type_c::visit(subrange_c *symbol) {ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(subrange_c *symbol)                                     {ERROR; return NULL;} /* should never get called... */
 
 /*  enumerated_type_name ':' enumerated_spec_init */
 void *search_base_type_c::visit(enumerated_type_declaration_c *symbol) {
@@ -204,14 +243,11 @@
 
 /* helper symbol for enumerated_specification->enumerated_spec_init */
 /* enumerated_value_list ',' enumerated_value */
-void *search_base_type_c::visit(enumerated_value_list_c *symbol) {
-  if (NULL == this->current_type_name) ERROR;
-  return (void *)this->current_type_name;
-}
+void *search_base_type_c::visit(enumerated_value_list_c *symbol)                        {return (void *)symbol;}
 
 /* enumerated_type_name '#' identifier */
 // SYM_REF2(enumerated_value_c, type, value)
-void *search_base_type_c::visit(enumerated_value_c *symbol) {ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(enumerated_value_c *symbol)                             {ERROR; return NULL;} /* should never get called... */
 
 /*  identifier ':' array_spec_init */
 void *search_base_type_c::visit(array_type_declaration_c *symbol) {
@@ -222,28 +258,28 @@
 /* array_specification [ASSIGN array_initialization} */
 /* array_initialization may be NULL ! */
 void *search_base_type_c::visit(array_spec_init_c *symbol) {
+  /* Note that the 'array_specification' may be either an identifier of a previsously defined array type, 
+   * or an array_specification_c, so we can not stop here and simply return a array_spec_init_c, 
+   * especially if we are looking for the base class!
+   */  
   return symbol->array_specification->accept(*this);
 }
 
 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
-void *search_base_type_c::visit(array_specification_c *symbol)	{
-  if (NULL == this->current_type_name)
-	this->current_type_name = symbol->non_generic_type_name;
-  return symbol->non_generic_type_name->accept(*this);
-}
+void *search_base_type_c::visit(array_specification_c *symbol)                          {return (void *)symbol;}
 
 /* helper symbol for array_specification */
 /* array_subrange_list ',' subrange */
-void *search_base_type_c::visit(array_subrange_list_c *symbol)	{ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(array_subrange_list_c *symbol)                          {ERROR; return NULL;} /* should never get called... */
 
 /* array_initialization:  '[' array_initial_elements_list ']' */
 /* helper symbol for array_initialization */
 /* array_initial_elements_list ',' array_initial_elements */
-void *search_base_type_c::visit(array_initial_elements_list_c *symbol)	{ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(array_initial_elements_list_c *symbol)                  {ERROR; return NULL;} /* should never get called... */
 
 /* integer '(' [array_initial_element] ')' */
 /* array_initial_element may be NULL ! */
-void *search_base_type_c::visit(array_initial_elements_c *symbol)	{ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(array_initial_elements_c *symbol)                       {ERROR; return NULL;} /* should never get called... */
 
 /*  structure_type_name ':' structure_specification */
 /* NOTE: structure_specification will point to either a
@@ -258,7 +294,7 @@
 
 /*  var1_list ':' structure_type_name */
 void *search_base_type_c::visit(structured_var_declaration_c *symbol) {
-	return symbol->structure_type_name->accept(*this);
+	return symbol;
 }
 
 /* structure_type_name ASSIGN structure_initialization */
@@ -270,20 +306,18 @@
 /* helper symbol for structure_declaration */
 /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
 /* structure_element_declaration_list structure_element_declaration ';' */
-void *search_base_type_c::visit(structure_element_declaration_list_c *symbol)	{
-  return (void *)symbol;
-}
+void *search_base_type_c::visit(structure_element_declaration_list_c *symbol)           {return (void *)symbol;}
 
 /*  structure_element_name ':' *_spec_init */
-void *search_base_type_c::visit(structure_element_declaration_c *symbol) {ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(structure_element_declaration_c *symbol)                {ERROR; return NULL;} /* should never get called... */
 
 /* helper symbol for structure_initialization */
 /* structure_initialization: '(' structure_element_initialization_list ')' */
 /* structure_element_initialization_list ',' structure_element_initialization */
-void *search_base_type_c::visit(structure_element_initialization_list_c *symbol) {ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(structure_element_initialization_list_c *symbol)        {ERROR; return NULL;} /* should never get called... */
 
 /*  structure_element_name ASSIGN value */
-void *search_base_type_c::visit(structure_element_initialization_c *symbol) {ERROR; return NULL;} /* should never get called... */
+void *search_base_type_c::visit(structure_element_initialization_c *symbol)             {ERROR; return NULL;} /* should never get called... */
 
 /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
 /*
@@ -292,7 +326,7 @@
 					string_type_declaration_size,
 					string_type_declaration_init) // may be == NULL!
 */
-void *search_base_type_c::visit(string_type_declaration_c *symbol)	{return symbol;}
+void *search_base_type_c::visit(string_type_declaration_c *symbol)	                {return (void *)symbol;}
 
   
 
@@ -301,7 +335,24 @@
 /*****************************/
 /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
 // SYM_REF3(function_block_declaration_c, fblock_name, var_declarations, fblock_body)
-void *search_base_type_c::visit(function_block_declaration_c *symbol) {
-  return symbol;
-}
-
+void *search_base_type_c::visit(function_block_declaration_c *symbol)                   {return (void *)symbol;}
+
+
+
+/*********************************************/
+/* B.1.6  Sequential function chart elements */
+/*********************************************/
+/* INITIAL_STEP step_name ':' action_association_list END_STEP */
+// SYM_REF2(initial_step_c, step_name, action_association_list)
+void *search_base_type_c::visit(initial_step_c *symbol) {
+  this->current_type_name = NULL; /* this pseudo data type does not have a type name! */
+  return (void *)symbol;
+}
+
+/* STEP step_name ':' action_association_list END_STEP */
+// SYM_REF2(step_c, step_name, action_association_list)
+void *search_base_type_c::visit(step_c *symbol) {
+  this->current_type_name = NULL; /* this pseudo data type does not have a type name! */
+  return (void *)symbol;
+}
+