Corewar-Final/srcs/srcs_asm/lexer/ft_automaton.c
Jeremy FLEURY dee6d95cc6 bug asm ok
2019-07-17 12:25:33 +02:00

66 lines
2.1 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_automaton.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jfleury <jfleury@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/06/06 14:48:26 by jfleury #+# #+# */
/* Updated: 2019/07/17 12:22:28 by jfleury ### ########.fr */
/* */
/* ************************************************************************** */
#include "asm.h"
static int ft_cal_i_string(int i_matrice, char *line, int *nb_char_token)
{
int i_string;
i_string = 0;
if (line[*nb_char_token] == 0
|| (i_matrice == 21 && line[*nb_char_token] != '\n'))
i_string = 16;
else
while (i_string < 16 && !(ft_line_strchr(g_string_automaton[i_string],
line[*nb_char_token])))
i_string++;
return (i_string);
}
static int ft_end_error(int *nb_char_token, char *line)
{
g_nb_char = g_nb_char + *nb_char_token;
ft_printf("error: syntax %d:%d char: %c\n",
g_nb_line, g_nb_char + 1, line[*nb_char_token]);
return (0);
}
int ft_automaton(char *line, t_token *token, t_label *label,
int *nb_char_token)
{
int i_matrice;
int i_string;
int type;
i_matrice = 0;
while (1)
{
type = i_matrice;
i_string = ft_cal_i_string(i_matrice, line, nb_char_token);
i_matrice = g_matrice_automaton[i_matrice][i_string];
if (i_matrice == -2 || i_matrice == -3)
{
if (i_matrice == -3)
*nb_char_token = *nb_char_token - 1;
g_nb_char = g_nb_char + *nb_char_token;
ft_create_token_label(ft_create_string(line, *nb_char_token),
type, token, label);
return (1);
}
else if (i_matrice == -1)
return (ft_end_error(nb_char_token, line));
else
*nb_char_token = *nb_char_token + 1;
}
}