-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparse.h
143 lines (120 loc) · 3.41 KB
/
parse.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifndef PARSE_H
# define PARSE_H
# include "lexer.h"
# define PARSE_BUFFER_SIZE 1024
struct s_parse_buffer;
typedef int t_lexer_getc(struct s_parse_buffer *buf);
typedef void t_lexer_ungetc(struct s_parse_buffer *buf);
typedef struct s_parse_buffer
{
char buffer[PARSE_BUFFER_SIZE * 100];
int size;
int cur_pos;
t_lexer_state lex_stat;
t_lexer_getc *getc;
t_lexer_ungetc *ungetc;
void *data;
} t_parse_buffer;
void init_buffer_with_string(t_parse_buffer *buf, char *str);
typedef enum e_parse_ast_type
{
ASTNODE_NONE = 0xc201,
ASTNODE_STRING,
ASTNODE_REDIRECTION,
ASTNODE_ARGUMENTS,
ASTNODE_COMMAND,
ASTNODE_PIPED_COMMANDS,
ASTNODE_DELIMITER,
ASTNODE_SEQ_COMMANDS,
ASTNODE_COMMAND_LINE,
ASTNODE_INVALID,
} t_parse_ast_type;
typedef struct s_parse_ast t_parse_ast;
typedef struct s_parse_node_string
{
char *text;
t_token_type type;
t_parse_ast *next;
} t_parse_node_string;
typedef struct s_parse_node_pipcmds
{
t_parse_ast *command_node;
t_parse_ast *next;
} t_parse_node_pipcmds;
typedef struct s_parse_node_command
{
t_parse_ast *arguments_node;
} t_parse_node_command;
typedef struct s_parse_node_arguments
{
t_parse_ast *string_node;
t_parse_ast *redirection_node;
t_parse_ast *rest_node;
} t_parse_node_arguments;
typedef struct s_parse_node_redirection
{
t_parse_ast *string_node;
t_token_type type;
int fd;
} t_parse_node_redirection;
typedef struct s_parse_node_delimiter
{
t_token_type type;
} t_parse_node_delimiter;
typedef struct s_parse_node_seqcmds
{
t_parse_ast *pipcmd_node;
t_parse_ast *delimiter_node;
t_parse_ast *rest_node;
} t_parse_node_seqcmds;
typedef struct s_parse_node_cmdline
{
t_parse_ast *seqcmd_node;
} t_parse_node_cmdline;
typedef struct s_parse_hdoc_list
{
t_parse_node_redirection *redirection;
struct s_parse_hdoc_list *next;
} t_parse_hdoc_list;
typedef struct s_parse_ast
{
t_parse_ast_type type;
int error;
t_parse_hdoc_list *heredocs;
union u_parse_ast_node_content
{
void *void_ptr;
t_parse_node_redirection *redirection;
t_parse_node_string *string;
t_parse_node_arguments *arguments;
t_parse_node_command *command;
t_parse_node_pipcmds *piped_commands;
t_parse_node_delimiter *delimiter;
t_parse_node_seqcmds *sequential_commands;
t_parse_node_cmdline *command_line;
} content;
} t_parse_ast;
t_parse_ast *parse_new_ast_node(t_parse_ast_type type, void *content);
t_parse_ast *parse_redirection(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_string(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_arguments(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_command(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_piped_commands(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_delimiter(t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_sequential_commands(
t_parse_buffer *buf, t_token *tok);
t_parse_ast *parse_command_line(t_parse_buffer *buf, t_token *tok);
void parse_die(void);
void parse_fatal_error(void);
void parse_skip_spaces(t_parse_buffer *buf, t_token *tok);
t_parse_hdoc_list *parse_concat_heredocs(
t_parse_ast *head, t_parse_ast *tail);
t_parse_hdoc_list *parse_new_heredocs(t_parse_node_redirection *redirection);
void parse_free_heredocs(t_parse_hdoc_list *list);
typedef struct s_parse_ast_list
{
t_parse_ast ast;
struct s_parse_ast_list *next;
} t_parse_ast_list;
void parse_free_all_ast(void);
#endif