Also check external/global variable consistency in configurations and FBs.
authorMario de Sousa <msousa@fe.up.pt>
Fri, 21 Sep 2012 09:54:10 +0100
changeset 660 9565d7d944ce
parent 659 165aa7b87e0d
child 661 f537c3315f83
Also check external/global variable consistency in configurations and FBs.
stage3/declaration_check.cc
stage3/declaration_check.hh
--- a/stage3/declaration_check.cc	Fri Sep 21 09:53:20 2012 +0100
+++ b/stage3/declaration_check.cc	Fri Sep 21 09:54:10 2012 +0100
@@ -112,25 +112,62 @@
 
 }
 
+
+
+/*****************************/
+/* B 1.5.2 - Function Blocks */
+/*****************************/
+/*  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 *declaration_check_c::visit(function_block_declaration_c *symbol) {
+  current_pou_decl = symbol;
+  /* check if any FB declared as a VAR has any incompatible VAR_EXTERNAL declarations */
+  if (NULL != symbol->var_declarations)
+    symbol->var_declarations->accept(*this);
+  return NULL;
+}
+
 /******************************************/
 /* B 1.5.3 - Declaration & Initialisation */
 /******************************************/
+/*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
+// SYM_REF3(program_declaration_c, program_type_name, var_declarations, function_block_body)
 void *declaration_check_c::visit(program_declaration_c *symbol) {
   current_pou_decl = symbol;
+  /* check if any FB declared as a VAR has any incompatible VAR_EXTERNAL declarations */
+  if (NULL != symbol->var_declarations)
+    symbol->var_declarations->accept(*this);
   return NULL;
 }
 
 /********************************/
 /* B 1.7 Configuration elements */
 /********************************/
-void *declaration_check_c::visit(program_configuration_c *symbol) {
-	symbol_c *p_decl = program_type_symtable.find_value(symbol->program_type_name);
-	if (p_decl == program_type_symtable.end_value())
-	  p_decl = function_block_type_symtable.find_value(symbol->program_type_name);
-	/* stage1_2 guarantees that we are sure to find a declaration in FB or Program symtable. */
-	if (p_decl == function_block_type_symtable.end_value())
-      ERROR;
-	check_global_decl(p_decl);
-	return NULL;
+/*
+ * CONFIGURATION configuration_name
+ *    optional_global_var_declarations
+ *    (resource_declaration_list | single_resource_declaration)
+ *    optional_access_declarations
+ *    optional_instance_specific_initializations
+ * END_CONFIGURATION
+ */
+//SYM_REF5(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations)
+void *declaration_check_c::visit(configuration_declaration_c *symbol) {
+  current_pou_decl = symbol;
+  /* check if any FB declared as a VAR has any incompatible VAR_EXTERNAL declarations */
+  if (NULL != symbol->resource_declarations)
+    symbol->resource_declarations->accept(*this);
+  return NULL;
 }
 
+void *declaration_check_c::visit(program_configuration_c *symbol) {
+  symbol_c *p_decl = program_type_symtable.find_value(symbol->program_type_name);
+  if (p_decl == program_type_symtable.end_value())
+    p_decl = function_block_type_symtable.find_value(symbol->program_type_name);
+  /* stage1_2 guarantees that we are sure to find a declaration in FB or Program symtable. */
+  if (p_decl == function_block_type_symtable.end_value())
+    ERROR;
+  check_global_decl(p_decl);
+  return NULL;
+}
+
--- a/stage3/declaration_check.hh	Fri Sep 21 09:53:20 2012 +0100
+++ b/stage3/declaration_check.hh	Fri Sep 21 09:54:10 2012 +0100
@@ -47,12 +47,20 @@
     int get_error_count();
 
     void check_global_decl(symbol_c *p_decl);
+
+    /*****************************/
+    /* B 1.5.2 - Function Blocks */
+    /*****************************/
+    void *visit(function_block_declaration_c *symbol);
+
     /******************************************/
     /* B 1.5.3 - Declaration & Initialisation */
     /******************************************/
     void *visit(program_declaration_c *symbol);
+
     /********************************/
     /* B 1.7 Configuration elements */
     /********************************/
+    void *visit(configuration_declaration_c *symbol);
     void *visit(program_configuration_c *symbol);
 };