/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/27 11:16:53 by ljiriste #+# #+# */
-/* Updated: 2024/07/11 20:15:42 by ljiriste ### ########.fr */
+/* Updated: 2024/07/18 11:47:10 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
t_marked_grammar_rule rule;
t_token token_copy;
- if (is_terminal_token(token, tokens))
+ if (is_terminal_token(token, tokens) || !cmp_token_type(token, &empty_token))
{
token_copy = ft_token_dup(token);
res = ft_vec_setinsert(lookahead, &token_copy, void_cmp_token_type);
if (res != success)
ft_free_token(&token_copy);
+ if (res == already_inside)
+ return (success);
return (res);
}
rule.position = 0;
t_ft_stat res;
const t_token *token;
- i = rule->position + 1;
- if (lookahead->size == 0)
- {
- res = append_token(lookahead, &empty_token);
- if (res != success)
- return (res);
- }
+ res = append_token(lookahead, &empty_token);
+ if (res != success)
+ return (res);
+ i = rule->position;
while (ft_vec_contains(lookahead, &empty_token, void_cmp_token_type) && i < rule->rule->constituents.size)
{
remove_empty_token(lookahead);
return (success);
}
-t_ft_stat add_lookahead(t_lr1_item *new, const t_lr1_item *item, const t_vec *rules, const t_vec *tokens)
+t_ft_stat add_lookahead(t_lr1_item *new, t_lr1_item *item, const t_vec *rules, const t_vec *tokens)
{
t_ft_stat res;
res = ft_vec_init(&new->lookahead, sizeof(t_token));
if (res != success)
return (res);
+ ++item->core.position;
res = expand_lookahead(&new->lookahead, &item->core, rules, tokens);
+ --item->core.position;
if (res != success)
+ {
+ ft_vec_free(&new->lookahead, ft_free_token);
return (res);
+ }
if (ft_vec_contains(&new->lookahead, &empty_token, void_cmp_token_type))
{
remove_empty_token(&new->lookahead);
return (res);
}
-t_ft_stat add_predictions(t_vec *closure, const t_lr1_item *item, const t_vec *rules, const t_vec *tokens)
+t_ft_stat add_predictions(t_vec *closure, t_lr1_item *item, const t_vec *rules, const t_vec *tokens)
{
size_t i;
t_lr1_item new_item;
return (success);
}
-t_ft_stat fill_closure(t_vec *closure, const t_vec *kernel, const t_vec *rules, const t_vec *tokens)
+t_ft_stat fill_closure(t_vec *closure, t_vec *kernel, const t_vec *rules, const t_vec *tokens)
{
size_t i;
- const t_lr1_item *item;
+ t_lr1_item *item;
t_ft_stat res;
i = 0;
while (i < kernel->size)
{
- item = ft_vec_caccess(kernel, i);
+ item = ft_vec_access(kernel, i);
res = add_predictions(closure, item, rules, tokens);
if (res != success)
return (res);