From 81f4e0cadf0564a91bc0a31670d02dd78a3a3bd4 Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Thu, 11 Jul 2024 20:08:39 +0200 Subject: [PATCH] Fix handling if the zeroth rule Removing the zeroth rule before the translation makes all the items point one rule ahaed. So instead the rule number is decreased by one the zeroth rule reduce is converted to accept. --- ft_parse/ft_parsing_table_generate.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ft_parse/ft_parsing_table_generate.c b/ft_parse/ft_parsing_table_generate.c index f261508..f08af84 100644 --- a/ft_parse/ft_parsing_table_generate.c +++ b/ft_parse/ft_parsing_table_generate.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:16:53 by ljiriste #+# #+# */ -/* Updated: 2024/07/11 19:56:28 by ljiriste ### ########.fr */ +/* Updated: 2024/07/11 20:03:26 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -778,6 +778,7 @@ size_t get_rule_index(const t_grammar_rule *rule, const t_vec *rules) void add_reduce(t_vec *lookahead, const t_lr1_item *item, const t_vec *tokens, const t_vec *rules) { size_t i; + size_t rule_num; const t_token *token; t_parser_action *action; @@ -786,8 +787,14 @@ void add_reduce(t_vec *lookahead, const t_lr1_item *item, const t_vec *tokens, c { token = ft_vec_caccess(&item->lookahead, i); action = ft_vec_access(lookahead, get_token_position(token, tokens)); - action->type = parser_reduce; - action->number = get_rule_index(item->core.rule, rules); + rule_num = get_rule_index(item->core.rule, rules); + if (rule_num == 0) + action->type = parser_accept; + else + { + action->type = parser_reduce; + action->number = rule_num - 1; + } ++i; } return ; @@ -932,10 +939,10 @@ t_ft_stat ft_parsing_table_generate(t_parsing_table *table, const char *rules_fi 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); + remove_zeroth_rule(&table->rules); return (success); } -- 2.30.2