Ejemplo n.º 1
0
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);
			}
		}
	}
}
Ejemplo n.º 2
0
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);
			}
		}
	}
}
Ejemplo n.º 3
0
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;

	}

  }
}
Ejemplo n.º 4
0
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) {