/** * 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; }
/** * 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; }
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; }
/** * 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; }