static void goalsand(T_PTR_tree entry) { T_PTR_tbsymbol_info infoid, infonb_left, infonb_right; char *info; if (entry) { if (tree_nbrsubtrees(entry)){ info = (char *) tree_getinfo(entry); infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0))); infonb_left = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 1))); if (strcmp(info,"=") == 0){ ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr], (integer32) infonb_left->info.nb.value, (integer32) infonb_left->info.nb.value); } else if (strcmp(info,">=") == 0){ ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr], (integer32) infonb_left->info.nb.value,INFINITY); } else if (strcmp(info,"in") == 0){ infonb_right = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 2))); ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr], (integer32) infonb_left->info.nb.value,(integer32) infonb_right->info.nb.value); } } } }
static void guard(T_PTR_tree entry) { T_PTR_tbsymbol_info infoid, infonb_left, infonb_right; char *info; if (entry) { /* If entry = TRUE, we haven't any subtrees and nothing to do OK */ if (tree_nbrsubtrees(entry)){ info = (char *) tree_getinfo(entry); infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0))); infonb_left = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 1))); if (strcmp(info,"=") == 0){ ist_assign_values_to_interval( &sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard, (integer32) infonb_left->info.nb.value, (integer32) infonb_left->info.nb.value); } else if (strcmp(info,">=") == 0){ ist_assign_values_to_interval( &sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard, (integer32) infonb_left->info.nb.value,INFINITY); } else if (strcmp(info,"in") == 0){ infonb_right = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 2))); ist_assign_values_to_interval( &sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard, (integer32) infonb_left->info.nb.value,(integer32) infonb_right->info.nb.value); } } } }
static void cmd(T_PTR_tree entry) { T_PTR_tbsymbol_info infoid; T_PTR_tree rhs; if (entry) { infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0))); rhs = tree_subtree(entry, 1); /* We assume that cmd is not a transfer */ istransfer = false; /* We assume the user does not know how to write specification */ messy_spec = true; /* For instance X' = c s.t. c > 0 is a messy_spec * we must check for it. If we meet a var in RHS or RHS = 0 * then messy_spec = false. */ cmdrhs(rhs, infoid); if (messy_spec == true) err_quit("\nCannot assign non null value to a variable in transition %2d\n",(nbrcmd+1)); if (istransfer == true) { /* We are ready for a new transfer, pay attention to the ++ */ sys->transition[nbrcmd].transfers[nbrtransfers].target = infoid->info.id.addr; sys->transition[nbrcmd].nbr_transfers = ++nbrtransfers; istransfer = false; } } }
static void cmdrhs(T_PTR_tree entry, T_PTR_tbsymbol_info infoid) { T_PTR_tree lhs, rhs; T_PTR_tbsymbol_info entry_info; char* entry_info_char; if (entry) { if (tree_nbrsubtrees(entry)) { entry_info_char = (char*) tree_getinfo(entry); lhs = tree_subtree(entry, 0); rhs = tree_subtree(entry, 1); if (strcmp(entry_info_char,"+") == 0) { cmdrhs(lhs, infoid); cmdrhs(rhs, infoid); } else if (strcmp(entry_info_char,"-") == 0) { cmdrhs(lhs, infoid); cmdrhs(rhs, infoid); /* By Grammar's definition, to the right we have a natural number */ sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].delta = - sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].delta; } } else { /* Leaf */ entry_info = (T_PTR_tbsymbol_info) tbsymbol_getinfo(tree_getinfo(entry)); if (entry_info->tag == tbsymbol_INFO_ID) { /* At least one variable occurs in the cmd RHS */ messy_spec = false; if (entry_info != infoid) { /* It is a transfer */ istransfer = true; if (nbrtransfers >= MAXNBTRANS) { err_quit("Too many transfers for a single transition, increase the\ MAXNBTRANS constant.\n"); } sys->transition[nbrcmd].transfers[nbrtransfers].origin[entry_info->info.id.addr] = 1; } } else if (entry_info->tag == tbsymbol_INFO_NB) {