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);
void ft_token_free(t_token *token);
void ft_clear_tokenlist(void *content);
t_token *ft_parse_token(t_lexer *lexer);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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++;
}
char *ft_lexer_readword(t_lexer *lexer)
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)
{
int start;
int len;
char quote;
char *word;
start = lexer->pos;
if (lexer->current_char == '"' || lexer->current_char == '\'')
{
quote = lexer->current_char;
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);
}
return (ft_parse_quotes(lexer));
}
start = lexer->pos;
while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0')
ft_lexer_readchar(lexer);
len = lexer->pos - start;

View File

@ -6,59 +6,40 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
t_token *token;
char *word;
int current_pos;
t_token *token;
char *word;
int current_pos;
token = NULL;
while (ft_isspace(lexer->current_char))
ft_lexer_readchar(lexer);
current_pos = lexer->pos;
switch(lexer->current_char)
if (lexer->current_char == '\0')
token = ft_token_new(T_EOF, NULL, current_pos);
else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|')
token = ft_parse_token(lexer);
else if (ft_isprint(lexer->current_char))
{
case '\0':
token = ft_token_new(T_EOF, NULL, current_pos);
break;
case '|':
token = ft_token_new(T_PIPE, "|", current_pos);
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);
token = ft_token_new(T_WORD, word, current_pos);
free(word);
}
word = ft_lexer_readword(lexer);
token = ft_token_new(T_WORD, word, current_pos);
free(word);
}
else
token = ft_token_new(T_ERROR, NULL, current_pos);
return (token);
}
void ft_clear_tokenlist(void *content)
void ft_clear_tokenlist(void *content)
{
t_token *token;
t_token *token;
token = (t_token *)content;
ft_token_free(token);

View File

@ -6,12 +6,39 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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"
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 *token;