Beispiel #1
0
/**
 * CTRParserStatement
 *
 * Generates a set of nodes representing a statement.
 */
ctr_tlistitem *
ctr_cparse_statement ()
{
  ctr_tlistitem *li = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
  int t = ctr_clex_tok ();
  ctr_clex_putback ();
  if (t == CTR_TOKEN_FIN)
    {
      li->node = ctr_cparse_fin ();
      return li;
    }
  else if (t == CTR_TOKEN_RET)
    {
      li->node = ctr_cparse_ret ();
    }
  else
    {
      li->node = ctr_cparse_expr (0);
    }
  t = ctr_clex_tok ();
  if (t != CTR_TOKEN_DOT)
    {
      ctr_cparse_emit_error_unexpected (t, "Expected a dot (.).\n");
      li->node = ctr_cparse_fin ();
    }
  return li;
}
Beispiel #2
0
/**
 * CTRParserStatement
 *
 * Generates a set of nodes representing a statement.
 */
ctr_tlistitem* ctr_cparse_statement() {
	ctr_tlistitem* li = CTR_PARSER_CREATE_LISTITEM();
	int t = ctr_clex_tok();
	if (ctr_mode_debug) printf("Parsing next statement of program, token = %d (%s).\n", t, ctr_clex_tok_value());
	ctr_clex_putback();
	if (t == CTR_TOKEN_FIN) {
		li->node = ctr_cparse_fin();
		return li;
	} else if (t == CTR_TOKEN_RET) {
		li->node = ctr_cparse_ret();
	} else {
		li->node = ctr_cparse_expr(0);
	}
	t = ctr_clex_tok();
	if (t != CTR_TOKEN_DOT) {
		printf("Expected . but got: %d.\n", t);
		exit(1);
	}
	return li;
}
Beispiel #3
0
ctr_tnode *
ctr_cparse_block_ (int autocap)
{
  ctr_tnode *r;
  ctr_tlistitem *codeBlockPart1;
  ctr_tlistitem *codeBlockPart2;
  ctr_tnode *paramList;
  ctr_tnode *codeList;
  ctr_tlistitem *previousListItem;
  ctr_tlistitem *previousCodeListItem;
  int t;
  int first;
  ctr_clex_tok ();
  r = ctr_cparse_create_node (CTR_AST_NODE);
  r->type = CTR_AST_NODE_CODEBLOCK;
  codeBlockPart1 = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
  r->nodes = codeBlockPart1;
  codeBlockPart2 = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
  r->nodes->next = codeBlockPart2;
  paramList = ctr_cparse_create_node (CTR_AST_NODE);
  codeList = ctr_cparse_create_node (CTR_AST_NODE);
  codeBlockPart1->node = paramList;
  codeBlockPart2->node = codeList;
  paramList->type = CTR_AST_NODE_PARAMLIST;
  codeList->type = CTR_AST_NODE_INSTRLIST;
  t = ctr_clex_tok ();
  first = 1;
  while (t == CTR_TOKEN_COLON)
    {
      /* okay we have new parameter, load it */
      t = ctr_clex_tok ();
      ctr_tlistitem *paramListItem = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
      ctr_tnode *paramItem = ctr_cparse_create_node (CTR_AST_NODE);
      long l = ctr_clex_tok_value_length ();
      paramItem->value = ctr_heap_allocate_tracked (sizeof (char) * l);
      memcpy (paramItem->value, ctr_clex_tok_value (), l);
      paramItem->vlen = l;
      paramListItem->node = paramItem;
      if (first)
	{
	  paramList->nodes = paramListItem;
	  previousListItem = paramListItem;
	  first = 0;
	}
      else
	{
	  previousListItem->next = paramListItem;
	  previousListItem = paramListItem;
	}
      t = ctr_clex_tok ();
    }
  first = 1;
  int oldallpl = all_plains_private;
  int olddcl = do_compare_locals;
  do_compare_locals = autocap;
  int oldcalltime = ctr_cparse_calltime_name_id;
  ctr_cparse_calltime_names[++ctr_cparse_calltime_name_id] = paramList;
  all_plains_private = autocap;
  if (ctr_transform_lambda_shorthand)
    {
      ctr_transform_lambda_shorthand = 0;
      ctr_tlistitem *codeListItem;
      ctr_tnode *codeNode;
      ctr_clex_putback ();
      codeListItem = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
      codeNode = ctr_cparse_create_node (CTR_AST_NODE);
      codeNode = ctr_cparse_expr (0);	//parse a single expression
      codeListItem->node = codeNode;
      codeList->nodes = codeListItem;
      previousCodeListItem = codeListItem;
    }
  else
    {
      while ((first || t == CTR_TOKEN_DOT))
	{
	  ctr_tlistitem *codeListItem;
	  ctr_tnode *codeNode;
	  if (first)
	    {
	      ctr_clex_putback ();
	    }
	  t = ctr_clex_tok ();
	  if (t == CTR_TOKEN_BLOCKCLOSE)
	    break;
	  ctr_clex_putback ();
	  codeListItem = (ctr_tlistitem *) ctr_heap_allocate_tracked (sizeof (ctr_tlistitem));
	  codeNode = ctr_cparse_create_node (CTR_AST_NODE);
	  if (t == CTR_TOKEN_RET)
	    {
	      codeNode = ctr_cparse_ret ();
	    }
	  else
	    {
	      codeNode = ctr_cparse_expr (0);
	    }
	  codeListItem->node = codeNode;
	  if (first)
	    {
	      codeList->nodes = codeListItem;
	      previousCodeListItem = codeListItem;
	      first = 0;
	    }
	  else
	    {
	      previousCodeListItem->next = codeListItem;
	      previousCodeListItem = codeListItem;
	    }
	  t = ctr_clex_tok ();
	  if (t != CTR_TOKEN_DOT && !autocap)
	    {
	      ctr_cparse_emit_error_unexpected (t, "Expected a dot (.).\n");
	    }
	}
    }
  all_plains_private = oldallpl;
  do_compare_locals = olddcl;
  ctr_cparse_calltime_name_id = oldcalltime;
  r->modifier = /*CTR_MODIFIER_AUTOCAPTURE */ autocap == 1;
  return r;
}
Beispiel #4
0
/**
 * CTRParserBlock
 *
 * Generates a set of AST nodes to represent a block of code.
 */
ctr_tnode* ctr_cparse_block() {
	ctr_tnode* r;
	ctr_tlistitem* codeBlockPart1;
	ctr_tlistitem* codeBlockPart2;
	ctr_tnode* paramList;
	ctr_tnode* codeList;
	ctr_tlistitem* previousListItem;
	ctr_tlistitem* previousCodeListItem;
	int t;
	int first;
	if (ctr_mode_debug) printf("Parsing code block.\n");
	ctr_clex_tok();
	r = CTR_PARSER_CREATE_NODE();
	r->type = CTR_AST_NODE_CODEBLOCK;
	codeBlockPart1 = CTR_PARSER_CREATE_LISTITEM();
	r->nodes = codeBlockPart1;
	codeBlockPart2 = CTR_PARSER_CREATE_LISTITEM();
	r->nodes->next = codeBlockPart2;
	paramList = CTR_PARSER_CREATE_NODE();
	codeList  = CTR_PARSER_CREATE_NODE();	
	codeBlockPart1->node = paramList;
	codeBlockPart2->node = codeList;
	paramList->type = CTR_AST_NODE_PARAMLIST;
	codeList->type = CTR_AST_NODE_INSTRLIST;
	t = ctr_clex_tok();
	first = 1;
	while(t == CTR_TOKEN_REF) {
		ctr_tlistitem* paramListItem = CTR_PARSER_CREATE_LISTITEM();
		ctr_tnode* paramItem = CTR_PARSER_CREATE_NODE();
		long l = ctr_clex_tok_value_length();
		paramItem->value = ctr_malloc(sizeof(char) * l, 0);
		memcpy(paramItem->value, ctr_clex_tok_value(), l);
		paramItem->vlen = l;
		paramListItem->node = paramItem;
		if (first) {
			paramList->nodes = paramListItem;
			previousListItem = paramListItem;
			first = 0;
		} else {
			previousListItem->next = paramListItem;
			previousListItem = paramListItem;
		}
		t = ctr_clex_tok();
	}
	if (t != CTR_TOKEN_BLOCKPIPE) {
		printf("Error expected blockpipe.");
		exit(1);
	}
	t = ctr_clex_tok();
	first = 1;
	while((first || t == CTR_TOKEN_DOT)) {
		ctr_tlistitem* codeListItem;
		ctr_tnode* codeNode;
		if (first) {
			if (ctr_mode_debug) printf("First, so put back\n");
			ctr_clex_putback();
		}
		t = ctr_clex_tok();
		if (t == CTR_TOKEN_BLOCKCLOSE) break;
		ctr_clex_putback();
		codeListItem = CTR_PARSER_CREATE_LISTITEM();
		codeNode = CTR_PARSER_CREATE_NODE();
		if (ctr_mode_debug) printf("--------> %d %s \n", t, ctr_clex_tok_value());
		if (t == CTR_TOKEN_RET) {
			codeNode = ctr_cparse_ret();
		} else {
			codeNode = ctr_cparse_expr(0);
		}
		codeListItem->node = codeNode;
		if (first) {
			codeList->nodes = codeListItem;
			previousCodeListItem = codeListItem;
			first = 0;
		} else {
			previousCodeListItem->next = codeListItem;
			previousCodeListItem = codeListItem;
		}
		t = ctr_clex_tok();
		if (t != CTR_TOKEN_DOT) {
			printf("Expected . but got: %d.\n", t);
			exit(1);
		}
	}
	return r;
}