struct l2_parser_node * l2_accept(enum l2_token_type t, struct l2_parser_state * parser_state){ unsigned int num_tokens = struct_l2_lexer_token_ptr_list_size(&parser_state->l2_lexer_state->tokens); struct l2_lexer_token ** tokens = struct_l2_lexer_token_ptr_list_data(&parser_state->l2_lexer_state->tokens); while( (parser_state->tokens_position < num_tokens) && ( tokens[parser_state->tokens_position]->type == L2_SPACE ) ){ push_l2_operation(parser_state, L2_ADVANCE_TOKEN_POSITION, (void*)tokens[parser_state->tokens_position]); } if(parser_state->tokens_position < num_tokens){ if(tokens[parser_state->tokens_position]->type == L2_NEWLINE){ push_l2_operation(parser_state, L2_INCREMENT_NEWLINE_COUNT, (void*)0); }else if(tokens[parser_state->tokens_position]->type == L2_COMMENT){ unsigned int num_newlines = count_newlines_in_l2_comment(tokens[parser_state->tokens_position]); unsigned int i; for(i = 0; i < num_newlines; i++){ push_l2_operation(parser_state, L2_INCREMENT_NEWLINE_COUNT, (void*)0); } } if(tokens[parser_state->tokens_position]->type == t){ struct l2_lexer_token * lt; lt = tokens[parser_state->tokens_position]; push_l2_operation(parser_state, L2_ADVANCE_TOKEN_POSITION, (void*)tokens[parser_state->tokens_position]); return create_l2_parser_node(parser_state, (struct l2_parser_node *)0, (struct l2_parser_node *)0, lt, L2_TERMINAL); } } return (struct l2_parser_node *)0; }
void destroy_l2_lexer_state(struct l2_lexer_state * l2_lexer_state){ unsigned int num_tokens = struct_l2_lexer_token_ptr_list_size(&l2_lexer_state->tokens); struct l2_lexer_token ** tokens = struct_l2_lexer_token_ptr_list_data(&l2_lexer_state->tokens); unsigned int i; for(i = 0; i < num_tokens; i++){ struct_l2_lexer_token_memory_pool_free(l2_lexer_state->c.memory_pool_collection->struct_l2_lexer_token_pool, tokens[i]); } struct_l2_lexer_token_ptr_list_destroy(&l2_lexer_state->tokens); }