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);
}
Пример #8
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));
}
Пример #9
0
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);
}