aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources/set_scope_numbers.c
diff options
context:
space:
mode:
Diffstat (limited to 'backendC/CleanCompilerSources/set_scope_numbers.c')
-rw-r--r--backendC/CleanCompilerSources/set_scope_numbers.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/set_scope_numbers.c b/backendC/CleanCompilerSources/set_scope_numbers.c
new file mode 100644
index 0000000..f68417c
--- /dev/null
+++ b/backendC/CleanCompilerSources/set_scope_numbers.c
@@ -0,0 +1,64 @@
+
+#include "system.h"
+
+#include "settings.h"
+#include "syntaxtr.t"
+#include "comsupport.h"
+#include "buildtree.h"
+#include "codegen_types.h"
+#include "codegen1.h"
+#include "codegen2.h"
+#include "statesgen.h"
+#include "checker.h"
+#include "instructions.h"
+#include "optimisations.h"
+#include "sa.h"
+
+#include "set_scope_numbers.h"
+
+#define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n)
+
+static int scope;
+
+static void set_node_id_scope_numbers (NodeDefP node_defs,int local_scope)
+{
+ NodeDefP node_def_p;
+
+ for_l (node_def_p,node_defs,def_next)
+ node_def_p->def_id->nid_scope=local_scope;
+}
+
+static void set_root_scope_numbers (NodeP node_p,int local_scope)
+{
+ if (node_p->node_kind==IfNode){
+ int new_local_scope;
+ ArgP arg_p;
+
+ node_p->node_if_scope=local_scope;
+
+ new_local_scope=scope+2;
+ scope+=3;
+
+ arg_p=node_p->node_arguments;
+ set_root_scope_numbers (arg_p->arg_node,local_scope);
+
+ ++scope;
+ arg_p=arg_p->arg_next;
+ set_root_scope_numbers (arg_p->arg_node,new_local_scope);
+ set_node_id_scope_numbers (node_p->node_then_node_defs,new_local_scope);
+
+ ++scope;
+ arg_p=arg_p->arg_next;
+ set_root_scope_numbers (arg_p->arg_node,new_local_scope);
+ set_node_id_scope_numbers (node_p->node_else_node_defs,new_local_scope);
+ }
+}
+
+void set_scope_numbers (RuleAltS *rule_alt_p)
+{
+ scope=1;
+
+ set_root_scope_numbers (rule_alt_p->alt_rhs_root,0);
+ set_node_id_scope_numbers (rule_alt_p->alt_rhs_defs,0);
+}
+