clean-up parsing a bit
This commit is contained in:
parent
fc71f3c9ca
commit
b252b01268
@ -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
|
||||||
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 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;
|
||||||
|
|||||||
@ -6,59 +6,40 @@
|
|||||||
/* 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)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
char *word;
|
char *word;
|
||||||
int current_pos;
|
int current_pos;
|
||||||
|
|
||||||
token = NULL;
|
token = NULL;
|
||||||
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')
|
||||||
|
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':
|
word = ft_lexer_readword(lexer);
|
||||||
token = ft_token_new(T_EOF, NULL, current_pos);
|
token = ft_token_new(T_WORD, word, current_pos);
|
||||||
break;
|
free(word);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
token = ft_token_new(T_ERROR, NULL, current_pos);
|
||||||
return (token);
|
return (token);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ft_clear_tokenlist(void *content)
|
void ft_clear_tokenlist(void *content)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
|
||||||
token = (t_token *)content;
|
token = (t_token *)content;
|
||||||
ft_token_free(token);
|
ft_token_free(token);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user