Exemple #1
0
/**
 * CTRParserMessages
 *
 * Manages the creation of nodes to send a message, uses CTRParserMessage
 * to create the actual nodes.
 */
ctr_tlistitem *
ctr_cparse_messages (ctr_tnode * r, int mode)
{
  int t = ctr_clex_tok ();
  ctr_tlistitem *pli = NULL;
  ctr_tlistitem *li = NULL;
  ctr_tlistitem *fli = NULL;
  int first = 1;
  ctr_tnode *node = NULL;
  /* explicit chaining (,) only allowed for keyword message: Console write: 3 factorial, write: 3 factorial is not possible otherwise. */
  while ((t == CTR_TOKEN_REF || (t == CTR_TOKEN_CHAIN && node && node->type == CTR_AST_NODE_KWMESSAGE)))
    {
      if (t == CTR_TOKEN_CHAIN)
	{
	  t = ctr_clex_tok ();
	  if (t != CTR_TOKEN_REF)
	    {
	      ctr_cparse_emit_error_unexpected (t, "Expected message.\n");
	    }
	}
      li = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
      ctr_clex_putback ();
      node = ctr_cparse_message (mode);
      if (node->type == -1)
	{
	  if (first)
	    {
	      return NULL;
	    }
	  ctr_clex_tok ();
	  break;
	}
      li->node = node;
      if (first)
	{
	  first = 0;
	  pli = li;
	  fli = li;
	}
      else
	{
	  pli->next = li;
	  pli = li;
	}
      t = ctr_clex_tok ();
    }
  ctr_clex_putback ();
  return fli;
}
Exemple #2
0
/**
 * CTRParserMessages
 * 
 * Manages the creation of nodes to send a message, uses CTRParserMessage
 * to create the actual nodes.
 */
ctr_tlistitem* ctr_cparse_messages(ctr_tnode* r, int mode) {
	int t = ctr_clex_tok();
	ctr_tlistitem* pli;
	ctr_tlistitem* li;
	ctr_tlistitem* fli;
	int first = 1;
	ctr_tnode* node;
	if (ctr_mode_debug) printf("Parsing messages.\n");
	/* explicit chaining (,) only allowed for keyword message: Console write: 3 factorial, write: 3 factorial is not possible otherwise. */
	while ((t == CTR_TOKEN_REF || (t == CTR_TOKEN_CHAIN && node && node->type == CTR_AST_NODE_KWMESSAGE))) {
		if (t == CTR_TOKEN_CHAIN) {
			t = ctr_clex_tok();
			if (t != CTR_TOKEN_REF) {
				printf("Expected message.\n");
				exit(1);
			}
		}
		li = CTR_PARSER_CREATE_LISTITEM();
		if (ctr_mode_debug) printf("Next message...\n");
		ctr_clex_putback();
		node = ctr_cparse_message(mode);
		if (node->type == -1) {
			if (ctr_mode_debug) printf("Ending message sequence.\n");
			if (first) {
				if (ctr_mode_debug) printf("First so return NULL.\n");
				return NULL;
			}
			ctr_clex_tok();
			break;
		}
		li->node = node;
		if (first) {
			first = 0;
			pli = li;
			fli = li;
		} else {
			pli->next = li;
			pli = li;
		}
		t = ctr_clex_tok();
		if (ctr_mode_debug) printf("Next token in message line is: %d \n",t);
	}
	if (ctr_mode_debug) printf("Putting back token... \n");
	ctr_clex_putback();
	return fli;
}