refactor: parsing tokens is now less bulky

This commit is contained in:
Quinten Mennen 2025-02-18 17:03:11 +01:00
parent c368cf80ea
commit adee957c2d
2 changed files with 65 additions and 35 deletions

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */
/* Updated: 2025/02/05 19:25:35 by qmennen ### ########.fr */ /* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -39,22 +39,22 @@ t_token *ft_token_next(t_lexer *lexer)
token = NULL; token = NULL;
while (ft_isspace(lexer->current_char)) while (ft_isspace(lexer->current_char))
ft_lexer_readchar(lexer); lexer_readchar(lexer);
current_pos = lexer->pos; current_pos = lexer->pos;
if (lexer->current_char == '\0') if (lexer->current_char == '\0')
token = ft_token_new(T_EOF, NULL, current_pos); token = token_new(T_EOF, NULL, current_pos);
else if (lexer->current_char == '<' || lexer->current_char == '>' else if (lexer->current_char == '<' || lexer->current_char == '>'
|| lexer->current_char == '|') || lexer->current_char == '|')
token = ft_parse_token(lexer); token = token_parse(lexer);
else if (ft_isprint(lexer->current_char)) else if (ft_isprint(lexer->current_char))
{ {
word = ft_lexer_readword(lexer); word = lexer_readword(lexer);
if (!word) if (!word)
return (ft_token_new(T_ERROR, &lexer->current_char, current_pos)); return (token_new(T_ERROR, &lexer->current_char, current_pos));
token = ft_token_new(T_WORD, word, current_pos); token = token_new(T_WORD, word, current_pos);
free(word); free(word);
} }
else else
token = ft_token_new(T_ERROR, NULL, current_pos); token = token_new(T_ERROR, NULL, current_pos);
return (token); return (token);
} }

View File

@ -6,39 +6,69 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */ /* Created: 2025/02/05 19:10:17 by qmennen #+# #+# */
/* Updated: 2025/02/11 17:38:51 by qmennen ### ########.fr */ /* Updated: 2025/02/18 17:02:17 by qmennen ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "minishell.h" #include "minishell.h"
t_token *ft_parse_token(t_lexer *lexer) static t_token_type token_from_char(char c, int is_double)
{ {
t_token *token; if (c == '<')
{
if (is_double)
return (T_HEREDOC);
return (T_REDIRECT_IN);
}
else if (c == '>')
{
if (is_double)
return (T_APPEND_OUT);
return (T_REDIRECT_OUT);
}
else if (c == '&' && is_double)
return (T_AND);
else if (c == '|')
{
if (is_double)
return (T_OR);
return (T_PIPE);
}
return (T_ERROR);
}
token = NULL; static char *char_from_type(t_token_type type)
if (lexer->current_char == '|') {
{ if (type == T_HEREDOC)
token = ft_token_new(T_PIPE, "|", lexer->pos); return ("<<");
} else if (type == T_REDIRECT_IN)
else if (lexer->current_char == '<' && lexer->input[lexer->pos + 1] == '<') return ("<");
{ else if (type == T_APPEND_OUT)
token = ft_token_new(T_HEREDOC, "<<", lexer->pos); return (">>");
ft_lexer_readchar(lexer); else if (type == T_REDIRECT_OUT)
} return (">");
else if (lexer->current_char == '<') else if (type == T_AND)
{ return ("&&");
token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos); else if (type == T_OR)
} return ("||");
else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>') else if (type == T_PIPE)
{ return ("|");
token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); return (NULL);
ft_lexer_readchar(lexer); }
}
else if (lexer->current_char == '>') t_token *token_parse(t_lexer *lexer)
{ {
token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); int is_double;
} char c;
ft_lexer_readchar(lexer); t_token *token;
t_token_type type;
c = lexer->current_char;
is_double = lexer->input[lexer->pos + 1] == c;
type = token_from_char(c, is_double);
token = token_new(type, char_from_type(type), lexer->pos);
if (is_double)
lexer_readchar(lexer);
lexer_readchar(lexer);
return (token); return (token);
} }