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