/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/20 20:51:36 by ljiriste #+# #+# */
-/* Updated: 2024/06/21 11:21:24 by ljiriste ### ########.fr */
+/* Updated: 2024/06/21 11:46:04 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
return (0);
}
-ssize_t find_token_index(t_token token, t_vec *tokens)
+ssize_t find_token_index(t_token token, const t_vec *tokens)
{
size_t i;
i = 0;
while (i < tokens->size)
{
- if (!ft_strcmp(token.type, ((t_token *)ft_vec_access(tokens, i))->type))
+ if (!ft_strcmp(token.type, ((t_token *)ft_vec_caccess(tokens, i))->type))
return (i);
++i;
}
return (-1);
}
-ssize_t goto_state(size_t state_num, t_parsing_table *table, t_token token)
+ssize_t goto_state(size_t state_num, const t_parsing_table *table, t_token token)
{
- t_parser_state *state;
- ssize_t column;
+ const t_parser_state *state;
+ ssize_t column;
- state = ft_vec_access(&table->states, state_num);
+ state = ft_vec_caccess(&table->states, state_num);
column = find_token_index(token, &table->tokens);
- return (*(ssize_t *)ft_vec_access(&state->gotos, column - (table->terminal_tokens_num + 1)));
+ return (*(ssize_t *)ft_vec_caccess(&state->gotos, column - (table->terminal_tokens_num + 1)));
}
-int follow_rule(t_stack *stack, size_t rule_num, t_parsing_table *table)
+int follow_rule(t_stack *stack, size_t rule_num, const t_parsing_table *table)
{
- t_grammar_rule *rule;
+ const t_grammar_rule *rule;
t_parser_stack_element element;
t_parse_tree_node *node;
size_t i;
if (!element.node)
return (1);
ft_vec_init(&element.node->children, sizeof(t_parse_tree_node));
- rule = ft_vec_access(&table->rules, rule_num);
+ rule = ft_vec_caccess(&table->rules, rule_num);
element.node->token = dup_token(rule->result);
i = rule->constituents.size;
while (i > 0)
--i;
node = ((t_parser_stack_element *)ft_stack_pop(stack, NULL))->node;
if (ft_strcmp(node->token.type,
- ((t_token *)ft_vec_access(&rule->constituents, i))->type) ||
+ ((t_token *)ft_vec_caccess(&rule->constituents, i))->type) ||
ft_vec_insert(&element.node->children, node, 0) != success)
{
ft_parse_tree_free(element.node);
return ;
}
-t_parse_tree_node *ft_parse(t_vec *tokens, t_parsing_table *table)
+t_parse_tree_node *ft_parse(const t_vec *tokens, const t_parsing_table *table)
{
- t_stack stack;
- size_t i;
- t_token token;
- t_parser_state *state;
- t_parser_action *action;
- ssize_t column;
- t_parse_tree_node *root;
+ t_stack stack;
+ size_t i;
+ t_token token;
+ const t_parser_state *state;
+ const t_parser_action *action;
+ ssize_t column;
+ t_parse_tree_node *root;
initialize_parser_stack(&stack);
i = 0;
while (1)
{
if (i < tokens->size)
- token = *(t_token *)ft_vec_access(tokens, i);
+ token = *(t_token *)ft_vec_caccess(tokens, i);
else if (i == tokens->size)
token = (t_token){.type = "$", .str = NULL};
else
ft_stack_free(&stack, ft_stack_element_free);
return (NULL);
}
- state = ft_vec_access(&table->states,
+ state = ft_vec_caccess(&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 > table->terminal_tokens_num)
ft_stack_free(&stack, ft_stack_element_free);
return (NULL);
}
- action = ft_vec_access(&state->lookahead, column);
+ action = ft_vec_caccess(&state->lookahead, column);
if (action->type == parser_reduce)
{
if (follow_rule(&stack, action->number, table))
/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/05/27 21:21:54 by ljiriste #+# #+# */
-/* Updated: 2024/06/21 09:57:12 by ljiriste ### ########.fr */
+/* Updated: 2024/06/21 11:47:12 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
t_ft_stat ft_parsing_table_load(t_parsing_table *table,
const char *filename,
const char *rules_filename);
-t_parse_tree_node *ft_parse(t_vec *tokens, t_parsing_table *table);
+t_parse_tree_node *ft_parse(const t_vec *tokens, const t_parsing_table *table);
void ft_parsing_table_print(t_parsing_table *table,
unsigned int column_width);
void ft_parse_tree_print(t_parse_tree_node *root);
-void free_token(void *v_token);
void ft_parse_tree_free(void *v_node);
void ft_parsing_table_free(t_parsing_table *table);