#include "compiledefines.h"
#include "types.t"
#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)
{
switch (node_p->node_kind){
case IfNode:
{
int new_local_scope;
ArgP arg_p;
node_p->node_if_scope=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);
break;
}
case SwitchNode:
{
ArgP arg_p;
int old_scope;
old_scope=scope;
for_l (arg_p,node_p->node_arguments,arg_next){
NodeP node_p;
scope=old_scope;
node_p=arg_p->arg_node;
if (node_p->node_kind==CaseNode){
NodeP case_alt_node_p;
case_alt_node_p=node_p->node_arguments->arg_node;
/* Cedewarrior bug if (case_alt_node_p->node_kind==PushNode) */
if (node_p->node_arguments->arg_node->node_kind==PushNode)
set_root_scope_numbers (case_alt_node_p->node_arguments->arg_next->arg_node, local_scope);
else
set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope);
} else if (node_p->node_kind==DefaultNode){
set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope);
} else if (node_p->node_kind==OverloadedCaseNode){
node_p=node_p->node_node;
set_root_scope_numbers (node_p->node_arguments->arg_node, local_scope);
} else
ErrorInCompiler ("set_scope_numbers.c", "set_root_scope_numbers", "");
set_node_id_scope_numbers (node_p->node_node_defs,local_scope);
}
break;
}
case GuardNode:
{
int old_scope;
old_scope=scope;
set_root_scope_numbers (node_p->node_arguments->arg_node,local_scope);
scope=old_scope;
set_root_scope_numbers (node_p->node_arguments->arg_next->arg_node,local_scope);
set_node_id_scope_numbers (node_p->node_node_defs,local_scope);
break;
}
}
}
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);
}