+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* pt_constructor.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: ljiriste <ljiriste@student.42prague.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/11/26 16:57:15 by ljiriste #+# #+# */
+/* Updated: 2025/07/28 12:15:17 by ljiriste ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef PT_CONSTRUCTOR_H
+# define PT_CONSTRUCTOR_H
+
+# ifdef __cplusplus
+extern "C" {
+# endif // __cplusplus
+
+# include "libft.h"
+
+typedef struct s_marked_grammar_rule
+{
+ const t_grammar_rule *rule;
+ size_t position;
+} t_marked_grammar_rule;
+
+typedef struct s_lr1_item
+{
+ t_marked_grammar_rule core;
+ t_vec lookahead; // t_vec of (terminal) t_token
+} t_lr1_item;
+
+typedef struct s_generator_state
+{
+ t_vec kernel; // t_vec of t_lr1_item
+ t_vec closure; // t_vec of t_lr1_item
+ t_vec goto_tokens; // t_vec of t_token
+ t_vec goto_states; // t_vec of size_t
+ size_t state_number;
+} t_generator_state;
+
+int cmp_token_type(const t_token *token1, const t_token *token2);
+int void_cmp_token_type(const void *v_token1, const void *v_token2);
+int cmp_rules(
+ const t_grammar_rule *rule1, const t_grammar_rule *rule2);
+int void_cmp_rules(const void *v_rule1, const void *v_rule2);
+int cmp_items(const t_lr1_item *item1, const t_lr1_item *item2);
+int void_cmp_items(const void *v_item1, const void *v_item2);
+
+void free_item(t_lr1_item *item);
+void void_free_item(void *v_item);
+void free_generator_state(t_generator_state *state);
+void void_free_generator_state(void *v_state);
+
+t_ft_stat prepend_token(t_vec *tokens, const t_token *token);
+t_ft_stat append_token(t_vec *tokens, const t_token *token);
+
+const t_token *get_next_token(const t_marked_grammar_rule *rule);
+int is_viable_item(const t_lr1_item *item, const t_token *token);
+t_ft_stat v_token_dup(void *dest, const void *src);
+t_lr1_item *duplicate_item(const t_lr1_item *item);
+
+t_ft_stat init_new_row(t_parsing_table *table);
+void convert_reduces(
+ t_vec *lookahead, const t_generator_state *state,
+ const t_vec *tokens, const t_vec *rules);
+void convert_gotos(t_vec *gotos,
+ const t_generator_state *state, const t_vec *tokens);
+void convert_shifts(t_vec *lookahead,
+ const t_generator_state *state, const t_vec *tokens);
+
+int is_terminal_token(const t_token *token, const t_vec *tokens);
+size_t get_token_position(const t_token *token, const t_vec *tokens);
+size_t get_rule_index(const t_grammar_rule *rule, const t_vec *rules);
+
+t_ft_stat add_lookahead(t_lr1_item *new_item, t_lr1_item *item,
+ const t_vec *rules, const t_vec *tokens);
+t_ft_stat expand_lookahead(
+ t_vec *lookahead, const t_marked_grammar_rule *rule,
+ const t_vec *rules, const t_vec *tokens);
+void remove_token(t_vec *lookahead, const t_token *removed_token);
+
+t_ft_stat categorize_tokens(t_vec *tokens, const t_vec *rules);
+
+t_ft_stat construct_state(t_vec *kernel, t_vec *states,
+ const t_vec *rules, const t_vec *tokens);
+
+t_ft_stat solve_gotos(t_generator_state *state, t_vec *states,
+ 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);
+
+t_ft_stat prepare_table(
+ t_parsing_table *table, const char *rules_filename);
+
+t_ft_stat convert_to_table(t_parsing_table *table, const t_vec *states);
+
+void remove_zeroth_rule(t_vec *rules);
+
+t_ft_stat ft_parsing_table_generate(t_parsing_table *table,
+ const char *rules_filename);
+
+# ifdef __cplusplus
+}
+# endif // __cplusplus
+
+#endif // PT_CONSTRUCTOR_H