Il parsing della minishell è organizzato in due fasi principali:
Obiettivo: suddividere la stringa di input in token e associare ciascuno a un tipo.
WORD→ comandi, argomentiPIPE→|REDIR_IN→<REDIR_OUT→>APPEND→>>HEREDOC→<<
-
Quote:
- Singole
'...'→ letterali - Doppie
"..."→ permettono$VAR
- Singole
-
Errori gestiti: quote non chiuse, backslash isolati
int lexer(char *line, char ***tokens_out, t_token_type **types_out);Restituisce:
tokens_out→ array di stringhetypes_out→ array dit_token_type
Obiettivo: costruire strutture dati t_cmd e t_pipeline a partire da token e tipi.
typedef struct s_cmd {
char **args;
char *infile;
char *outfile;
int append;
int heredoc;
int redir_in;
int redir_out;
int fd_in;
int fd_out;
int pipe;
int quote_single;
int quote_double;
int dollar;
} t_cmd;build_pipeline()populate_comands()expand_pipeline_variables()find_quotes()
- Quote gestite con
quote_handling.c - Variabili gestite con
exp_var.c
readline()
↓
lexer() → tokens + types
↓
parser() → t_pipeline
↓
executor(t_pipeline, env)
typedef struct s_pipeline {
t_cmd **cmds;
int n_cmds;
char **tokens;
t_token_type *types;
char **my_env;
} t_pipeline;- Executor con
fork(),execve(),dup2() - Heredoc (
<<) con pipe temporanee - Redirezioni
>,>>,<conopen()+dup2()
echo,cd,pwd,export,unset,exit,env
- Lexer: ✅
- Parser: ✅
- Quote/variabili: ✅
- Redirezioni: in sviluppo
- Executor: da implementare