/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/20 20:51:36 by ljiriste #+# #+# */
-/* Updated: 2024/06/20 17:45:45 by ljiriste ### ########.fr */
+/* Updated: 2024/06/21 09:39:33 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
t_parse_tree_node *node;
node = v_node;
+ if (!node)
+ return ;
ft_vec_free(&node->children, ft_parse_tree_free);
free_token(&node->token);
return ;
t_parser_stack_element *el;
el = v_el;
+ if (!el)
+ return ;
ft_parse_tree_free(el->node);
return ;
}
return (ft_stack_push(stack, &element) != success || element.state_num < 0);
}
-t_parse_tree_node *ft_parse(__attribute__((unused)) t_vec *tokens, __attribute__((unused)) t_parsing_table *table)
+void initialize_parser_stack(t_stack *stack)
+{
+ t_parser_stack_element zero;
+
+ zero.state_num = 0;
+ zero.node = NULL;
+ ft_stack_init(stack, sizeof(t_parser_stack_element));
+ ft_stack_push(stack, &zero);
+ return ;
+}
+
+t_parse_tree_node *ft_parse(t_vec *tokens, t_parsing_table *table)
{
t_stack stack;
size_t i;
ssize_t column;
t_parse_tree_node *root;
- ft_stack_init(&stack, sizeof(t_parser_stack_element));
+ initialize_parser_stack(&stack);
i = 0;
while (1)
{
if (i < tokens->size)
token = *(t_token *)ft_vec_access(tokens, i);
- if (i == tokens->size)
+ else if (i == tokens->size)
token = (t_token){.type = "$", .str = NULL};
else
{
state = ft_vec_access(&table->states,
((t_parser_stack_element *)ft_stack_top(&stack))->state_num);
column = find_token_index(token, &table->tokens);
- if (column < 0 || (size_t)column + 1 > table->terminal_tokens_num)
+ if (column < 0 || (size_t)column > table->terminal_tokens_num)
{
ft_stack_free(&stack, ft_stack_element_free);
return (NULL);