/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/27 11:16:53 by ljiriste #+# #+# */
-/* Updated: 2024/07/04 10:21:29 by ljiriste ### ########.fr */
+/* Updated: 2024/07/04 12:29:18 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
void free_item(t_lr1_item *item)
{
+ if (!item)
+ return ;
ft_vec_free(&item->lookahead, ft_free_token);
return ;
}
void free_generator_state(t_generator_state *state)
{
+ if (!state)
+ return ;
ft_vec_free(&state->kernel, void_free_item);
ft_vec_free(&state->closure, void_free_item);
ft_vec_free(&state->goto_tokens, ft_free_token);
{
if (dest == NULL)
return (alloc_fail);
- *(t_token *)dest = ft_token_dup(*(t_token *)src);
+ *(t_token *)dest = ft_token_dup((t_token *)src);
return (success);
}
if (is_terminal_token(token, tokens))
{
- token_copy = ft_token_dup(*token);
+ token_copy = ft_token_dup(token);
res = ft_vec_setinsert(lookahead, token, void_cmp_token_type);
if (res != success)
ft_free_token(&token_copy);
i = 0;
while (i < lookahead->size)
{
- token = ft_token_dup(*(const t_token *)ft_vec_caccess(lookahead, i));
+ token = ft_token_dup(ft_vec_caccess(lookahead, i));
res = ft_vec_setinsert(new_lookahead, &token, void_cmp_token_type);
if (res != success)
ft_free_token(&token);
return (success);
}
-t_ft_stat construct_first_kernel(__attribute__((unused))t_vec *kernel, __attribute__((unused))const t_vec *rules, __attribute__((unused))const t_vec *tokens)
+t_ft_stat construct_first_kernel(__attribute__((unused))t_vec *kernel, __attribute__((unused))const t_vec *rules)
{
- ft_printf("construct_first_kernel is not yet implemented\n");
- return (success);
+ t_ft_stat res;
+ t_lr1_item item;
+ t_token token;
+
+ res = ft_vec_init(&item.lookahead, sizeof(t_token));
+ if (res != success)
+ return (res);
+ token = ft_token_dup(&eof_token);
+ if (!token.type)
+ return (alloc_fail);
+ res = ft_vec_append(&item.lookahead, &token);
+ if (res != success)
+ {
+ ft_free_token(&token);
+ return (res);
+ }
+ item.core.rule = ft_vec_caccess(rules, 0);
+ item.core.position = 0;
+ res = ft_vec_append(kernel, &item);
+ if (res != success)
+ ft_vec_free(&item.lookahead, ft_free_token);
+ return (res);
}
t_ft_stat categorize_tokens(__attribute__((unused))t_vec *tokens, __attribute__((unused))const t_vec *rules)
t_vec kernel;
t_ft_stat res;
- res = construct_first_kernel(&kernel, rules, tokens);
+ res = ft_vec_init(&kernel, sizeof(t_lr1_item));
+ if (res != success)
+ return (res);
+ res = construct_first_kernel(&kernel, rules);
if (res != success)
return (res);
res = construct_state(&kernel, states, rules, tokens);
return (success);
}
+t_ft_stat init_table(t_parsing_table *table)
+{
+ t_ft_stat res;
+
+ res = ft_vec_init(&table->rules, sizeof(t_grammar_rule));
+ if (res != success)
+ return (res);
+ res = ft_vec_init(&table->states, sizeof(t_parser_state));
+ if (res != success)
+ return (res);
+ res = ft_vec_init(&table->tokens, sizeof(t_token));
+ if (res != success)
+ return (res);
+ return (success);
+}
+
+t_ft_stat add_zeroth_rule(t_vec *rules)
+{
+ t_ft_stat res;
+ t_grammar_rule rule;
+ t_token first_token;
+
+ rule.result.type = NULL;
+ rule.result.str = NULL;
+ first_token = ft_token_dup(&((const t_grammar_rule *)ft_vec_caccess(rules, 0))->result);
+ if (!first_token.type)
+ return (alloc_fail);
+ res = ft_vec_init(&rule.constituents, sizeof(t_token));
+ if (res != success)
+ return (res);
+ res = ft_vec_append(&rule.constituents, &first_token);
+ if (res != success)
+ ft_free_token(&first_token);
+ res = ft_vec_insert(rules, &rule, 0);
+ if (res != success)
+ ft_free_rule(&rule);
+ return (success);
+}
+
+void remove_zeroth_rule(t_vec *rules)
+{
+ ft_vec_erase(rules, 0, ft_free_rule);
+ return ;
+}
+
+t_ft_stat prepare_table(t_parsing_table *table, const char *rules_filename)
+{
+ t_ft_stat res;
+
+ res = init_table(table);
+ if (res != success)
+ return (res);
+ res = load_rules(&table->rules, rules_filename);
+ if (res != success)
+ return (res);
+ res = add_zeroth_rule(&table->rules);
+ if (res != success)
+ {
+ ft_vec_free(&table->rules, ft_free_rule);
+ return (res);
+ }
+ res = categorize_tokens(&table->tokens, &table->rules);
+ if (res != success)
+ ft_vec_free(&table->rules, ft_free_rule);
+ return (res);
+}
+
t_ft_stat ft_parsing_table_generate(t_parsing_table *table, const char *rules_filename)
{
t_ft_stat res;
t_vec states;
- ft_vec_init(&states, sizeof(t_generator_state *));
- res = load_rules(&table->rules, rules_filename);
+ res = ft_vec_init(&states, sizeof(t_generator_state *));
+ if (res != success)
+ return (res);
+ res = prepare_table(table, rules_filename);
if (res != success)
return (res);
- categorize_tokens(&table->tokens, &table->rules);
res = construct_states(&states, &table->rules, &table->tokens);
+ if (res != success)
+ return (res);
+ remove_zeroth_rule(&table->rules);
res = translate_to_table(table, &states);
+ if (res != success)
+ return (res);
ft_vec_free(&states, void_free_generator_state);
return (success);
}