refactor: parsing tokens is now less bulky
This commit is contained in:
parent
c368cf80ea
commit
adee957c2d
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user