Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
int parse_l2(struct l2_parser_state * state){
	state->top_node = l2_file(state);
	if(state->tokens_position == struct_l2_lexer_token_ptr_list_size(&state->l2_lexer_state->tokens)){
	}else{
		printf("L2 Parser could not continue on line %d of file %s\n", state->line_number, state->l2_lexer_state->c.filename);
		assert(0 && "Parsing failed.");
	}
	return 0;
}
Ejemplo n.º 3
0
Archivo: lexer.c Proyecto: chyyuu/recc
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);
}