enforcement grammar part 1
This commit is contained in:
parent
30494f2df2
commit
516e1dade5
8 changed files with 238 additions and 15 deletions
|
|
@ -55,6 +55,12 @@ io_file - compound_command : VALID - AGGREGATION k = 0, new = io_redirect
|
||||||
|
|
||||||
io_redirect - redirect_list : VALID - NOTHING
|
io_redirect - redirect_list : VALID - NOTHING
|
||||||
io_redirect - compound_command : VALID - AGGREGATION k = 0, new = redirect_list
|
io_redirect - compound_command : VALID - AGGREGATION k = 0, new = redirect_list
|
||||||
|
io_redirect - cmd_suffix : VALID - NOTHING
|
||||||
|
io_redirect - cmd_prefix : VALID - NOTHING
|
||||||
|
io_redirect - cmd_word : VALID - NOTHING
|
||||||
|
io_redirect - cmd_name : VALID - NOTHING
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// si transparence continuer remontee,
|
// si transparence continuer remontee,
|
||||||
// si dernier membre aurait pu aussi constitue membre actuel, ne rien fiare, ainsi que transparence
|
// si dernier membre aurait pu aussi constitue membre actuel, ne rien fiare, ainsi que transparence
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
enum e_sym
|
enum e_sym
|
||||||
{
|
{
|
||||||
EMPTY = 1,
|
LINEBREAK = 1,
|
||||||
TK_LESS,
|
TK_LESS,
|
||||||
TK_GREAT,
|
TK_GREAT,
|
||||||
TK_DLESS,
|
TK_DLESS,
|
||||||
|
|
@ -51,6 +51,16 @@ enum e_sym
|
||||||
TK_N_WORD,
|
TK_N_WORD,
|
||||||
TK_Q_WORD,
|
TK_Q_WORD,
|
||||||
TK_DQ_WORD,
|
TK_DQ_WORD,
|
||||||
|
TK_ASSIGNEMENT_WORD = 50,
|
||||||
|
TK_BANG,
|
||||||
|
TK_NAME,
|
||||||
|
TK_FOR,
|
||||||
|
TK_IO_NUMBER,
|
||||||
|
TK_DLESSDASH,
|
||||||
|
TK_LESSGREAT,
|
||||||
|
TK_CASE,
|
||||||
|
TK_LBRACE,
|
||||||
|
TK_IN,
|
||||||
PROGRAM = 100,
|
PROGRAM = 100,
|
||||||
COMPLETE_COMMANDS,
|
COMPLETE_COMMANDS,
|
||||||
LIST,
|
LIST,
|
||||||
|
|
@ -91,7 +101,6 @@ enum e_sym
|
||||||
IO_HERE,
|
IO_HERE,
|
||||||
HERE_END,
|
HERE_END,
|
||||||
NEWLINE_LIST,
|
NEWLINE_LIST,
|
||||||
LINEBREAK,
|
|
||||||
SEPARATOR_OP,
|
SEPARATOR_OP,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
SEQUENTIAL_SEP,
|
SEQUENTIAL_SEP,
|
||||||
|
|
@ -106,7 +115,7 @@ enum e_sym
|
||||||
| WHILE_CLAUSE | UNTIL_CLAUSE | FUNCTION_DEFINITION | FUNCTION_BODY | FNAME\
|
| WHILE_CLAUSE | UNTIL_CLAUSE | FUNCTION_DEFINITION | FUNCTION_BODY | FNAME\
|
||||||
| BRACE_GROUP | DO_GROUP | SIMPLE_COMMAND | CMD_NAME | CMD_WORD | CMD_PREFIX\
|
| BRACE_GROUP | DO_GROUP | SIMPLE_COMMAND | CMD_NAME | CMD_WORD | CMD_PREFIX\
|
||||||
| CMD_SUFFIX | REDIRECT_LIST | IO_REDIRECT | IO_FILE | FILENAME | IO_HERE\
|
| CMD_SUFFIX | REDIRECT_LIST | IO_REDIRECT | IO_FILE | FILENAME | IO_HERE\
|
||||||
| HERE_END | NEWLINE_LIST | LINEBREAK | SEPARATOR_OP | SEPARATOR | SEQUENTIAL_SEP
|
| HERE_END | NEWLINE_LIST | SEPARATOR_OP | SEPARATOR | SEQUENTIAL_SEP
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef unsigned long long int t_sym;
|
typedef unsigned long long int t_sym;
|
||||||
|
|
@ -168,6 +177,17 @@ typedef unsigned long long int t_sym;
|
||||||
//#define ALL_SYM -1UL
|
//#define ALL_SYM -1UL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct s_aggrematch
|
||||||
|
{
|
||||||
|
t_sym under;
|
||||||
|
t_sym top;
|
||||||
|
t_sym new_sym;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct s_aggrematch t_aggrematch;
|
||||||
|
|
||||||
|
extern t_aggrematch g_aggrematch[];
|
||||||
|
|
||||||
struct s_prodmatch
|
struct s_prodmatch
|
||||||
{
|
{
|
||||||
t_type token;
|
t_type token;
|
||||||
|
|
@ -179,7 +199,6 @@ typedef struct s_prodmatch t_prodmatch;
|
||||||
|
|
||||||
extern t_prodmatch g_prodmatch[];
|
extern t_prodmatch g_prodmatch[];
|
||||||
|
|
||||||
|
|
||||||
struct s_stackmatch
|
struct s_stackmatch
|
||||||
{
|
{
|
||||||
t_sym under;
|
t_sym under;
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
ls > file1 > file2
|
ls
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,20 @@
|
||||||
|
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
//descente recursive pour multi aggregation
|
t_aggrematch g_aggrematch[] =
|
||||||
|
{
|
||||||
|
{CMD_SUFFIX, TK_WORD, CMD_SUFFIX},
|
||||||
|
{TK_PIPE, TK_WORD, PATTERN},
|
||||||
|
{WORDLIST, TK_WORD, WORDLIST},
|
||||||
|
|
||||||
|
{CMD_PREFIX, TK_ASSIGNEMENT_WORD, CMD_PREFIX},
|
||||||
|
|
||||||
|
{ELSE_PART, TK_FI, IF_CLAUSE},
|
||||||
|
{COMPOUND_LIST, TK_FI, IF_CLAUSE},
|
||||||
|
|
||||||
|
{TK_COMPOUND_LIST, TK_DONE, DO_GROUP},
|
||||||
|
{TK_COMPOUND_LIST, TK_RBRACE, BRACE_GROUP},
|
||||||
|
{0, 0, 0},
|
||||||
|
|
||||||
int aggregate_sym(t_sym **stack, t_sym *new_sym)
|
int aggregate_sym(t_sym **stack, t_sym *new_sym)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,163 @@
|
||||||
|
|
||||||
t_stackmatch g_stackmatch[] =
|
t_stackmatch g_stackmatch[] =
|
||||||
{
|
{
|
||||||
{EMPTY, CMD_NAME},
|
{CMD_SUFFIX, TK_WORD},
|
||||||
{TK_GREAT, CMD_NAME},
|
{TK_PIPE, TK_WORD},
|
||||||
{CMD_NAME, TK_GREAT},
|
{CASE, TK_WORD},
|
||||||
|
{WORDLIST, TK_WORD},
|
||||||
|
|
||||||
|
{CMD_PREFIX, TK_ASSIGNEMENT_WORD},
|
||||||
|
|
||||||
|
{REDIRECT_LIST, TK_IO_NUMBER},
|
||||||
|
{CMD_SUFFIX, TK_IO_NUMBER},
|
||||||
|
{CMD_PREFIX, TK_IO_NUMBER},
|
||||||
|
{CMD_NAME, TK_IO_NUMBER},
|
||||||
|
{CMD_WORD, TK_IO_NUMBER},
|
||||||
|
{LINEBREAK, TK_IO_NUMBER},
|
||||||
|
{TK_BANG, TK_IO_NUMBER},
|
||||||
|
{SEPARATOR_OP, TK_IO_NUMBER},
|
||||||
|
{NEWLINE_LIST, TK_IO_NUMBER},
|
||||||
|
|
||||||
|
{TK_AND_IF, AND_OR},
|
||||||
|
|
||||||
|
{TK_OR_IF, AND_OR},
|
||||||
|
|
||||||
|
{TK_DSEMI, LINEBREAK},
|
||||||
|
{TK_DSEMI, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_DLESS, TK_IO_NUMBER},
|
||||||
|
{TK_DLESS, REDIRECT_LIST},
|
||||||
|
{TK_DLESS, CMD_SUFFIX},
|
||||||
|
{TK_DLESS, CMD_PREFIX},
|
||||||
|
{TK_DLESS, CMD_WORD},
|
||||||
|
{TK_DLESS, CMD_NAME},
|
||||||
|
{TK_DLESS, LINEBREAK},
|
||||||
|
{TK_DLESS, TK_BANG},
|
||||||
|
{TK_DLESS, SEPARATOR_OP},
|
||||||
|
{TK_DLESS, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_DLESSDASH, TK_IO_NUMBER},
|
||||||
|
{TK_DLESSDASH, REDIRECT_LIST},
|
||||||
|
{TK_DLESSDASH, CMD_SUFFIX},
|
||||||
|
{TK_DLESSDASH, CMD_PREFIX},
|
||||||
|
{TK_DLESSDASH, CMD_WORD},
|
||||||
|
{TK_DLESSDASH, CMD_NAME},
|
||||||
|
{TK_DLESSDASH, LINEBREAK},
|
||||||
|
{TK_DLESSDASH, TK_BANG},
|
||||||
|
{TK_DLESSDASH, SEPARATOR_OP},
|
||||||
|
{TK_DLESSDASH, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_DGREAT, TK_IO_NUMBER},
|
||||||
|
{TK_DGREAT, REDIRECT_LIST},
|
||||||
|
{TK_DGREAT, CMD_SUFFIX},
|
||||||
|
{TK_DGREAT, CMD_PREFIX},
|
||||||
|
{TK_DGREAT, CMD_WORD},
|
||||||
|
{TK_DGREAT, CMD_NAME},
|
||||||
|
{TK_DGREAT, LINEBREAK},
|
||||||
|
{TK_DGREAT, TK_BANG},
|
||||||
|
{TK_DGREAT, SEPARATOR_OP},
|
||||||
|
{TK_DGREAT, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_LESSAND, TK_IO_NUMBER},
|
||||||
|
{TK_LESSAND, REDIRECT_LIST},
|
||||||
|
{TK_LESSAND, CMD_SUFFIX},
|
||||||
|
{TK_LESSAND, CMD_PREFIX},
|
||||||
|
{TK_LESSAND, CMD_WORD},
|
||||||
|
{TK_LESSAND, CMD_NAME},
|
||||||
|
{TK_LESSAND, LINEBREAK},
|
||||||
|
{TK_LESSAND, TK_BANG},
|
||||||
|
{TK_LESSAND, SEPARATOR_OP},
|
||||||
|
{TK_LESSAND, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_GREATAND, TK_IO_NUMBER},
|
||||||
|
{TK_GREATAND, REDIRECT_LIST},
|
||||||
|
{TK_GREATAND, CMD_SUFFIX},
|
||||||
|
{TK_GREATAND, CMD_PREFIX},
|
||||||
|
{TK_GREATAND, CMD_WORD},
|
||||||
|
{TK_GREATAND, CMD_NAME},
|
||||||
|
{TK_GREATAND, LINEBREAK},
|
||||||
|
{TK_GREATAND, TK_BANG},
|
||||||
|
{TK_GREATAND, SEPARATOR_OP},
|
||||||
|
{TK_GREATAND, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_LESSGREAT, TK_IO_NUMBER},
|
||||||
|
{TK_LESSGREAT, REDIRECT_LIST},
|
||||||
|
{TK_LESSGREAT, CMD_SUFFIX},
|
||||||
|
{TK_LESSGREAT, CMD_PREFIX},
|
||||||
|
{TK_LESSGREAT, CMD_WORD},
|
||||||
|
{TK_LESSGREAT, CMD_NAME},
|
||||||
|
{TK_LESSGREAT, LINEBREAK},
|
||||||
|
{TK_LESSGREAT, TK_BANG},
|
||||||
|
{TK_LESSGREAT, SEPARATOR_OP},
|
||||||
|
{TK_LESSGREAT, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_CLOBBER, TK_IO_NUMBER},
|
||||||
|
{TK_CLOBBER, REDIRECT_LIST},
|
||||||
|
{TK_CLOBBER, CMD_SUFFIX},
|
||||||
|
{TK_CLOBBER, CMD_PREFIX},
|
||||||
|
{TK_CLOBBER, CMD_WORD},
|
||||||
|
{TK_CLOBBER, CMD_NAME},
|
||||||
|
{TK_CLOBBER, LINEBREAK},
|
||||||
|
{TK_CLOBBER, TK_BANG},
|
||||||
|
{TK_CLOBBER, SEPARATOR_OP},
|
||||||
|
{TK_CLOBBER, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_IF, LINEBREAK},
|
||||||
|
{TK_IF, TK_BANG},
|
||||||
|
{TK_IF, SEPARATOR_OP},
|
||||||
|
{TK_IF, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_THEN, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_ELSE, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_ELIF, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_FI, ELSE_PART},
|
||||||
|
{TK_FI, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_DO, COMPOUND_LIST},
|
||||||
|
{TK_DO, NAME},
|
||||||
|
{TK_DO, SEQUENTIAL_SEP},
|
||||||
|
|
||||||
|
{TK_DONE, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_CASE, LINEBREAK},
|
||||||
|
{TK_CASE, TK_BANG},
|
||||||
|
{TK_CASE, NEWLINE_LIST},
|
||||||
|
{TK_CASE, SEPARATOR_OP},
|
||||||
|
|
||||||
|
{TK_ESAC, CASE_LIST},
|
||||||
|
{TK_ESAC, CASE_LIST_NS},
|
||||||
|
{TK_ESAC, LINEBREAK},
|
||||||
|
|
||||||
|
{TK_WHILE, LINEBREAK},
|
||||||
|
{TK_WHILE, TK_BANG},
|
||||||
|
{TK_WHILE, SEPARATOR_OP},
|
||||||
|
{TK_WHILE, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_UNTIL, LINEBREAK},
|
||||||
|
{TK_UNTIL, TK_BANG},
|
||||||
|
{TK_UNTIL, SEPARATOR_OP},
|
||||||
|
{TK_UNTIL, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_FOR, LINEBREAK},
|
||||||
|
{TK_FOR, TK_BANG},
|
||||||
|
{TK_FOR, SEPARATOR_OP},
|
||||||
|
{TK_FOR, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_LBRACE, LINEBREAK},
|
||||||
|
{TK_LBRACE, TK_BANG},
|
||||||
|
{TK_LBRACE, SEPARATOR_OP},
|
||||||
|
{TK_LBRACE, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_RBRACE, COMPOUND_LIST},
|
||||||
|
|
||||||
|
{TK_BANG, LINEBREAK},
|
||||||
|
{TK_BANG, SEPARATOR_OP},
|
||||||
|
{TK_BANG, NEWLINE_LIST},
|
||||||
|
|
||||||
|
{TK_IN, LINEBREAK},
|
||||||
{0, 0},
|
{0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ int ft_parse(t_btree **ast, t_list **token)
|
||||||
state = UNDEFINED;
|
state = UNDEFINED;
|
||||||
new_sym = ft_memalloc(sizeof(t_sym));
|
new_sym = ft_memalloc(sizeof(t_sym));
|
||||||
stack = ft_memalloc(sizeof(t_sym) * 1000);
|
stack = ft_memalloc(sizeof(t_sym) * 1000);
|
||||||
push_stack(stack, EMPTY);
|
push_stack(stack, LINEBREAK);
|
||||||
while (*token)
|
while (*token)
|
||||||
{
|
{
|
||||||
produce_sym(*stack, new_sym, token);
|
produce_sym(*stack, new_sym, token);
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,37 @@
|
||||||
|
|
||||||
t_prodmatch g_prodmatch[] =
|
t_prodmatch g_prodmatch[] =
|
||||||
{
|
{
|
||||||
{TK_N_WORD, EMPTY, CMD_NAME},
|
{TK_WORD, TK_DLESS, HERE_END},
|
||||||
{TK_GREAT, ALL, TK_GREAT},
|
{TK_WORD, TK_DLESSDASH, HERE_END},
|
||||||
{TK_N_WORD, ALL, CMD_NAME},
|
{TK_WORD, TK_LESS, FILENAME},
|
||||||
|
{TK_WORD, TK_LESSAND, FILENAME},
|
||||||
|
{TK_WORD, TK_GREAT, FILENAME},
|
||||||
|
{TK_WORD, TK_GREATAND, FILENAME},
|
||||||
|
{TK_WORD, TK_DGREAT, FILENAME},
|
||||||
|
{TK_WORD, TK_LESSGREAT, FILENAME},
|
||||||
|
{TK_WORD, TK_CLOBBER, FILENAME},
|
||||||
|
{TK_WORD, CMD_WORD, CMD_SUFFIX},
|
||||||
|
{TK_WORD, CMD_NAME, CMD_SUFFIX},
|
||||||
|
{TK_WORD, LINEBREAK, CMD_NAME},
|
||||||
|
{TK_WORD, NEWLINE_LIST, CMD_NAME},
|
||||||
|
{TK_WORD, IN, WORDLIST},
|
||||||
|
// {{TK_WORD, CASE_LIST, PATTERN}, rule 4 ?
|
||||||
|
{TK_WORD, TK_PAREN_OPEN, PATTERN},
|
||||||
|
|
||||||
|
{TK_ASSIGNEMENT_WORD, LINEBREAK, CMD_PREFIX},
|
||||||
|
{TK_ASSIGNEMENT_WORD, TK_BANG, CMD_PREFIX},
|
||||||
|
{TK_ASSIGNEMENT_WORD, SEPARATOR_OP, CMD_PREFIX},
|
||||||
|
{TK_ASSIGNEMENT_WORD, NEWLINE_LIST, CMD_PREFIX},
|
||||||
|
|
||||||
|
{TK_NAME, LINEBREAK, FNAME},
|
||||||
|
{TK_NAME, TK_BANG, FNAME},
|
||||||
|
{TK_NAME, SEPARATOR_OP, FNAME},
|
||||||
|
{TK_NAME, NEWLINE_LIST, FNAME},
|
||||||
|
{TK_NAME, TK_FOR, NAME},
|
||||||
|
|
||||||
|
{TK_NEWLINE, COMPLETE_COMMANDS, NEWLINE_LIST},
|
||||||
|
{TK_NEWLINE, LINEBREAK, NEWLINE_LIST},
|
||||||
|
|
||||||
{0, 0, 0},
|
{0, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -27,6 +55,7 @@ int produce_sym(t_sym stack, t_sym *new_sym, t_list **lst)
|
||||||
|
|
||||||
token = (*lst)->content;
|
token = (*lst)->content;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
*new_sym = NULL;
|
||||||
while (g_prodmatch[i].new_sym)
|
while (g_prodmatch[i].new_sym)
|
||||||
{
|
{
|
||||||
if (token->type == g_prodmatch[i].token
|
if (token->type == g_prodmatch[i].token
|
||||||
|
|
@ -34,5 +63,7 @@ int produce_sym(t_sym stack, t_sym *new_sym, t_list **lst)
|
||||||
*new_sym = g_prodmatch[i].new_sym;
|
*new_sym = g_prodmatch[i].new_sym;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
if (!*new_sym)
|
||||||
|
*new_sym = token->type;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,8 @@ char *read_state(t_sym current)
|
||||||
return ("SIMPLE_COMMAND");
|
return ("SIMPLE_COMMAND");
|
||||||
if (current == PROGRAM)
|
if (current == PROGRAM)
|
||||||
return ("PROGRAM");
|
return ("PROGRAM");
|
||||||
*/ if (current == EMPTY)
|
*/ if (current == LINEBREAK)
|
||||||
return ("EMPTY");
|
return ("LINEBREAK");
|
||||||
if (current != 0)
|
if (current != 0)
|
||||||
return ("NON-DEFINED");
|
return ("NON-DEFINED");
|
||||||
if (current == 0)
|
if (current == 0)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue