Rule *parse_file(FILE *fp) {
    Rule *head = malloc(sizeof(Rule));
    Rule *curr_rule = head;

    char *line[MAXLINE + 1]; // the +1 accounts for a null terminator from fgets

    while (fgets(*line, MAXLINE + 1, fp) != NULL) {
        // if the line is not a comment or empty:
        if (is_comment_or_empty((const char *) line) == 0) {
            // if the line is an action:
            if (strcmp(line[0], " ") == 0) {
                // CREATE THE ACTIONS
                // 1. Initialize the args array
                int size_of_args_arr = size_of_arr(*line + sizeof('\t'));

                // char *const argv[size_of_args_arr + 1]; // +1 accounts for NULL pointer at end

                Action *curr_action;
                // 2. Fill the args array
                if (head->actions == NULL) {
                    head->actions = malloc(sizeof(Action));
                    head->actions->args = malloc(sizeof(char *const) * (size_of_args_arr + 1));

                    fill_args_arr(size_of_args_arr, *line, head->actions->args);

                    curr_action = head->actions;

                } else {
                    Action *new_action = malloc(sizeof(Action));
                    new_action->args = malloc(sizeof(char *const) * (size_of_args_arr + 1));

                    fill_args_arr(size_of_args_arr, *line, new_action->args);

                    curr_action->next_act = new_action;
                    curr_action = new_action;
                }

            }

            // else the line consists of the target
            // CREATE THE TARGET
            char *target = find_target(*line);

            if (head == NULL) {
                head->target = target;

            } else {
                Rule *new_rule = malloc(sizeof(Rule));
                new_rule->target = target;

                curr_rule->next_rule = new_rule;
                curr_rule = new_rule;
            }
        }
    }
}
create linked list