int ft_accept_separator_char(t_parser *parser, t_pile_tree *pile) { if (pile->value == LAST_ARG) { if (!pile->prev) return (ft_parse_error(parser, -13, pile->tree->token)); if (pile->prev->value == INST) return (0); if (pile->prev->value == VIRGULE) { pile->value = LAST_ARG; ft_add_leaf(pile->tree, pile->prev->tree); ft_free_elem_pile(pile->prev, parser); return (1); } else { if (pile->tree && pile->tree->fils) return (ft_parse_error(parser, LAST_ARG, pile->tree->fils[0]->token)); else return (ft_parse_error(parser, LAST_ARG, parser->focus)); } } return (0); }
int ft_accept_argument(t_parser *parser, t_pile_tree *pile) { if (pile->value == FIN_LINE) { if (!pile->prev) { ft_parse_error(parser, -12, pile->tree->token); return (-1); } if (pile->prev->value == POSITION || pile->prev->value == MINI_NAME || pile->prev->value == MINI_COMMENT) return (0); if (pile->prev->value == ARG) { pile->value = LAST_ARG; ft_add_leaf(pile->tree, pile->prev->tree); ft_free_elem_pile(pile->prev, parser); return (1); } if (pile->prev->tree && pile->prev->tree->fils) return (ft_parse_error(parser, LAST_ARG, pile->prev->tree->fils[0]->token)); else return (ft_parse_error(parser, LAST_ARG, parser->focus)); } return (0); }
static int ft_accept_instruction_error(t_parser *parser, t_pile_tree *pile) { if (pile->tree && pile->tree->fils) ft_parse_error(parser, LAST_ARG, pile->tree->fils[0]->token); else ft_parse_error(parser, LAST_ARG, parser->focus); return (-1); }
int ft_accept_label_inst(t_parser *parser, t_pile_tree *pile) { if (pile->value == CPL_INST || pile->value == FIN_LINE) { if (!pile->prev) return (ft_parse_error(parser, 0, parser->focus)); if (pile->prev->value != POSITION) return (0); if (pile->value == FIN_LINE) { ft_add_leaf(pile->tree, pile->prev->tree); pile->value = POSITION_INST; ft_free_elem_pile(pile->prev, parser); return (1); } ft_add_leaf(pile->prev->tree, pile->tree->fils[0]); free(pile->tree->fils); pile->tree->nbr_fils = 0; pile->tree->fils = 0; ft_add_leaf(pile->tree, pile->prev->tree); ft_free_elem_pile(pile->prev, parser); pile->value = POSITION_INST; return (1); } return (0); }
int ft_check_argument(t_parser *parser, t_pile_tree *pile) { if (pile->value == ARG) { if (pile->tree->nbr_fils) { ft_parse_error(parser, 0, parser->focus); return (-1); } return (1); } return (0); }
static int ft_check_separator_char(t_parser *parser, t_parse_tree *tree) { if (tree->token->token == SEPARATOR) { if (tree->nbr_fils) { ft_parse_error(parser, SEPARATOR, parser->focus); return (-1); } else return (1); } return (0); }
int ft_accept_instruction(t_parser *parser, t_pile_tree *pile) { if (pile->value == LAST_ARG) { if (!pile->prev) return (ft_parse_error(parser, -49, pile->tree->token)); if (pile->prev->value == VIRGULE) return (0); if (pile->prev->value == INST) { if (ft_verif_instruction(pile->prev, pile, parser->inst)) { ft_accept_instruction_cpl(parser, pile); return (1); } else return (ft_accept_instruction_error(parser, pile)); } else return (ft_parse_error(parser, -49, pile->tree->token)); } return (0); }
int ft_syntax_analysis(char **args) { int i; i = 0; if (args == NULL) return (1); while (args[i] != '\0') { if (ft_strchr(SEPARATORS, args[i][0]) != NULL) { if (ft_strlen(args[i]) > 2) return (ft_parse_error(args[i])); if (ft_strstr(args[i], "||") && ft_check_double_pipe(args, i)) return (ft_parse_error(args[i])); else if (ft_strchr(args[i], ';') && ft_check_semi_colon(args, i)) return (ft_parse_error(args[i])); else if (ft_strstr(args[i], "&&") && ft_check_double_and(args, i)) return (ft_parse_error(args[i])); } i++; } return (ft_pipes_analysis(args)); }
static int ft_pipes_analysis(char **args) { int i; i = 0; if (args == NULL) return (1); while (args[i] != '\0') { if (ft_strchr(PIPES, args[i][0]) != NULL) { if (ft_strlen(args[i]) > 4) return (ft_parse_error(args[i])); else if (args[i][0] == '<' && ft_check_redirect_left(args, i)) return (ft_parse_error(args[i])); else if (args[i][0] == '>' && ft_check_redirect_right(args, i)) return (ft_parse_error(args[i])); else if (args[i][0] == '|' && ft_check_redirect_pipe(args, i)) return (ft_parse_error(args[i])); } i++; } return (0); }
int ft_rule_argument(t_parser *parser, t_pile_tree *pile) { int ret; ret = ft_check_argument(parser, pile); if (ret == 1) { parser->focus_pile->value = ARG; parser->focus_pile = 0; return (SHIFT); } if (ret == -1) { ft_parse_error(parser, 0, pile->tree->token); return (-1); } return (0); }
int ft_accept_instruction_plus(t_parser *parser, t_pile_tree *pile) { if (pile->value == CPL_INST) { if (!pile->prev) return (ft_parse_error(parser, CPL_INST, pile->tree->token)); if (pile->prev->value != CPL_INST) return (0); pile->prev->tree = ft_fusion_fils(pile->prev->tree, pile->tree); pile->prev->value = CPL_INST; free(pile->tree->fils); pile->tree->fils = 0; pile->tree->nbr_fils = 0; ft_free_elem_pile(pile, parser); return (1); } return (0); }
int ft_rule_separator_char(t_parser *parser, t_pile_tree *pile) { int ret; ret = ft_check_separator_char(parser, pile->tree); if (ret) { if (!pile->prev || pile->prev->value != ARG) { ft_putendl("erreur reduce SEPARATOR char"); ft_parse_error(parser, SEPARATOR, parser->focus); return (-1); } ft_add_leaf(pile->tree, pile->prev->tree); ft_free_elem_pile(pile->prev, parser); pile->value = VIRGULE; parser->focus_pile = 0; return (SHIFT); } return (0); }