clean-up parsing a bit

This commit is contained in:
Quinten Mennen 2025-02-04 20:40:39 +01:00
parent fc71f3c9ca
commit b252b01268
4 changed files with 71 additions and 55 deletions

View File

@ -207,4 +207,5 @@ t_token *ft_token_next(t_lexer *lexer);
t_token *ft_token_new(TokenType type, char *c, int pos); t_token *ft_token_new(TokenType type, char *c, int pos);
void ft_token_free(t_token *token); void ft_token_free(t_token *token);
void ft_clear_tokenlist(void *content); void ft_clear_tokenlist(void *content);
t_token *ft_parse_token(t_lexer *lexer);
#endif #endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ /* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */
/* Updated: 2025/02/04 20:11:48 by qmennen ### ########.fr */ /* Updated: 2025/02/04 20:40:27 by qmennen ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -43,31 +43,38 @@ void ft_lexer_readchar(t_lexer *lexer)
lexer->n_pos++; lexer->n_pos++;
} }
static char *ft_parse_quotes(t_lexer *lexer)
{
int start;
int len;
char qc;
char *word;
qc = lexer->current_char;
word = NULL;
ft_lexer_readchar(lexer);
start = lexer->pos;
while (lexer->current_char != '\0' && lexer->current_char != qc)
ft_lexer_readchar(lexer);
len = lexer->pos - start;
word = malloc(sizeof(char) * len);
ft_strlcpy(word, lexer->input + start, len + 1);
if (lexer->current_char == qc)
ft_lexer_readchar(lexer);
return (word);
}
char *ft_lexer_readword(t_lexer *lexer) char *ft_lexer_readword(t_lexer *lexer)
{ {
int start; int start;
int len; int len;
char quote;
char *word; char *word;
start = lexer->pos; start = lexer->pos;
if (lexer->current_char == '"' || lexer->current_char == '\'') if (lexer->current_char == '"' || lexer->current_char == '\'')
{ {
quote = lexer->current_char; return (ft_parse_quotes(lexer));
ft_lexer_readchar(lexer);
start = lexer->pos;
while (lexer->current_char != '\0' && lexer->current_char != quote)
ft_lexer_readchar(lexer);
if (lexer->current_char == quote)
{
len = lexer->pos - start;
word = malloc(sizeof(char) * len);
ft_strlcpy(word, lexer->input + start, len + 1);
ft_lexer_readchar(lexer);
return (word);
} }
}
start = lexer->pos;
while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0') while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0')
ft_lexer_readchar(lexer); ft_lexer_readchar(lexer);
len = lexer->pos - start; len = lexer->pos - start;

View File

@ -6,11 +6,11 @@
/* 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/04 20:14:50 by qmennen ### ########.fr */ /* Updated: 2025/02/04 20:28:00 by qmennen ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
# include "minishell.h" #include "minishell.h"
t_token *ft_token_next(t_lexer *lexer) t_token *ft_token_next(t_lexer *lexer)
{ {
@ -22,37 +22,18 @@ t_token *ft_token_next(t_lexer *lexer)
while (ft_isspace(lexer->current_char)) while (ft_isspace(lexer->current_char))
ft_lexer_readchar(lexer); ft_lexer_readchar(lexer);
current_pos = lexer->pos; current_pos = lexer->pos;
switch(lexer->current_char) if (lexer->current_char == '\0')
{
case '\0':
token = ft_token_new(T_EOF, NULL, current_pos); token = ft_token_new(T_EOF, NULL, current_pos);
break; else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|')
case '|': token = ft_parse_token(lexer);
token = ft_token_new(T_PIPE, "|", current_pos); else if (ft_isprint(lexer->current_char))
ft_lexer_readchar(lexer);
break;
case '<':
token = ft_token_new(T_REDIRECT_IN, "<", current_pos);
ft_lexer_readchar(lexer);
break;
case '>':
ft_lexer_readchar(lexer);
if (lexer->current_char == '>')
{
token = ft_token_new(T_APPEND_OUT, ">>", current_pos);
ft_lexer_readchar(lexer);
}
else
token = ft_token_new(T_REDIRECT_OUT, ">", current_pos);
break;
default:
if (ft_isprint(lexer->current_char))
{ {
word = ft_lexer_readword(lexer); word = ft_lexer_readword(lexer);
token = ft_token_new(T_WORD, word, current_pos); token = ft_token_new(T_WORD, word, current_pos);
free(word); free(word);
} }
} else
token = ft_token_new(T_ERROR, NULL, current_pos);
return (token); return (token);
} }

View File

@ -6,12 +6,39 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */ /* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ /* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */
/* Updated: 2025/02/04 18:22:11 by qmennen ### ########.fr */ /* Updated: 2025/02/04 20:29:06 by qmennen ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
# include "minishell.h" # include "minishell.h"
t_token *ft_parse_token(t_lexer *lexer)
{
t_token *token;
token = NULL;
if (lexer->current_char == '|')
{
token = ft_token_new(T_PIPE, "|", lexer->pos);
}
else if (lexer->current_char == '<')
{
token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos);
}
else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>')
{
token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos);
ft_lexer_readchar(lexer);
}
else if (lexer->current_char == '>')
{
token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos);
}
ft_lexer_readchar(lexer);
return (token);
}
t_token *ft_token_new(TokenType type, char *c, int pos) t_token *ft_token_new(TokenType type, char *c, int pos)
{ {
t_token *token; t_token *token;