gachi-mandoo-shell / kimchi-mandoo-shell

a simple shell - minishell 42Seoul-@innovationacademy-kr (jaeskim, yjung)
0 stars 2 forks source link

cmd ast를 위한 구조체 정의! #6

Closed JaeSeoKim closed 3 years ago

JaeSeoKim commented 3 years ago

이때 각 type를 구분하기 위한 define 매크로 정의 필요!

JaeSeoKim commented 3 years ago

ast 데이터를 저장하기 위한 구조체

type를 통해서 간단하게 데이터를 구분하고 data를 해당 데이터로 casting해서 사용하는 형태는 어떤가요?

typedef struct s_AST
{
    int     type;
    void    *data;
}   t_AST;
JaeSeoKim commented 3 years ago

위예 대한 예시 입니다!

t_AST   *cmds = parse_cmd(?); 
if (cmds->type == CMD)
    excute_cmd(cmds->data);
JaeSeoKim commented 3 years ago

minishell 내부에서 사용되는 상수는 전부 앞에 FT_ 를 추가하여서 정의할 것!

JaeSeoKim commented 3 years ago

cmd와 arg에 대한 type과 각 type에 대한 define 입니다!

# define FT_ARG_NORMAL  1
# define FT_ARG_QUOTE   2
# define FT_ARG_QUOTES  3

typedef struct s_arg
{
    int     type;
    char    *data;
}   t_arg;

# define FT_CMD 1

typedef struct s_cmd
{
    char    *cmd;
    t_arg   *args;
}   t_cmd;
JaeSeoKim commented 3 years ago

pipe에 대한 구조체에 대한 임시 예제 입니다!

좋은 구조체 이름을 고민해봐요~!!

# define FT_PIPE 2

typedef struct s_pipe
{
    t_AST   *left;
    t_AST   *right;
}   t_pipe;
jyw2671 commented 3 years ago

redirection 구조체에 대한 임시 예제입니다!

# define FT_FD_IN       1
# define FT_FD_OUT      2
# define FT_FD_APPEND   3
# define FT_FD_HEREDOC  4

typedef struct s_redirect
{
    int     type;
    char    *cmd;
    char    *file;
}   t_redirect;
jyw2671 commented 3 years ago

condition 구조체에 대한 임시 예제입니다!

# define FT_OR  1
# define FT_AND 2

typedef struct s_cond
{
    int     type;
    t_AST   *left;
    t_AST   *right;
}   t_cond;
JaeSeoKim commented 3 years ago

구조체 일단 정의 완료!

JaeSeoKim commented 3 years ago

파싱 과정에서 env 및 *에 대해 대치가 필요하므로 다시 고민을 해봐야 함!

JaeSeoKim commented 3 years ago

문제점을 고려 하여 다시 만들어진 구조체

@jyw2671 확인 부탁드려요!

/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   minishell_type.h                                   :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: jaeskim <jaeskim@student.42seoul.kr>       +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2021/04/14 12:34:36 by jaeskim           #+#    #+#             */
/*   Updated: 2021/04/15 22:18:38 by jaeskim          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef MINISHELL_TYPE_H
# define MINISHELL_TYPE_H

/*
** t_AST type define
**
** FT_CMD -> t_cmd
** FT_PIPE -> t_pipe
** FT_REDIRECT -> t_redirect
** FT_CONDITION -> t_cond
*/

# define FT_CMD         1
# define FT_PIPE        2
# define FT_REDIRECT    3
# define FT_CONDITION   4

typedef struct s_AST
{
    int             type;
    void            *data;
    struct s_AST    *next;
}   t_AST;

typedef struct s_cmd
{
    char    *cmd;
    char    *args;
}   t_cmd;

typedef struct s_pipe
{
    t_AST   *left;
    t_AST   *right;
}   t_pipe;

/*
** t_redirect type define
**
** FT_FD_IN -> `<`
** FT_FD_OUT -> `>`
** FT_FD_APPEND -> `>>`
** FT_FD_HEREDOC -> `<<`
*/

# define FT_FD_IN       1
# define FT_FD_OUT      2
# define FT_FD_APPEND   3
# define FT_FD_HEREDOC  4

typedef struct s_redirect
{
    int     type;
    char    *cmd;
    char    *file;
}   t_redirect;

/*
** t_cond type define
**
** FT_OR -> `||`
** FT_AND -> `&&`
*/

# define FT_OR  1
# define FT_AND 2

typedef struct s_cond
{
    int     type;
    t_AST   *left;
    t_AST   *right;
}   t_cond;

#endif