syntax error + coordination parser etat

This commit is contained in:
AntoHesse 2017-02-22 18:36:32 +01:00
parent 5976d0d281
commit 268c5fb46e
7 changed files with 132 additions and 9 deletions

View file

@ -48,7 +48,7 @@ int handle_instruction(int fd)
if (get_lexer_stack(lexer))
continue ;
lexer.state = DEFAULT;
token_print(token);
// token_print(token);
if (get_reserved_words(&token))
return (1);
if (insert_newline(&token))
@ -57,8 +57,9 @@ int handle_instruction(int fd)
continue ;
if (parser.state == SUCCESS)
break ;
else if (parser.state == ERROR)
return (error_syntax(&token));
else if (parser.state == ERROR)
error_syntax(&token);
token = NULL;
}
DG("succesful parsing:");
// btree_print(STDBUG, ast, &ft_putast);

View file

@ -55,6 +55,7 @@ t_aggrematch g_aggrematch[] =
{LINEBREAK, CMD_SUPERIOR, SEPARATOR_OP, 0},
{LINEBREAK, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE},
{LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK},
{NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME},
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
{NEWLINE_LIST, TK_IN, TK_IN, TK_IN},
@ -72,6 +73,8 @@ t_aggrematch g_aggrematch[] =
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
//to check
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER},
@ -96,6 +99,7 @@ t_aggrematch g_aggrematch[] =
{IO_REDIRECT, CMD_WORD, CMD_SUFFIX, 0},
{IO_REDIRECT, CMD_PREFIX, CMD_PREFIX, CMD_PREFIX},
{IO_REDIRECT, LINEBREAK, CMD_PREFIX, 0},
{IO_REDIRECT, COMPLETE_COMMANDS, CMD_PREFIX, 0},
{IO_REDIRECT, TK_BANG, CMD_PREFIX, 0},
{IO_REDIRECT, SEPARATOR_OP, CMD_PREFIX, 0},
{IO_REDIRECT, NEWLINE_LIST, CMD_PREFIX, 0},
@ -105,6 +109,7 @@ t_aggrematch g_aggrematch[] =
{CMD_SUFFIX, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
//to abstract
{CMD_PREFIX, LINEBREAK, SIMPLE_COMMAND, 0},
{CMD_PREFIX, COMPLETE_COMMANDS, SIMPLE_COMMAND, 0},
{CMD_PREFIX, TK_BANG, SIMPLE_COMMAND, 0},
{CMD_PREFIX, SEPARATOR_OP, SIMPLE_COMMAND, 0},
{CMD_PREFIX, NEWLINE_LIST, SIMPLE_COMMAND, 0},
@ -112,6 +117,7 @@ t_aggrematch g_aggrematch[] =
{CMD_WORD, CMD_PREFIX, SIMPLE_COMMAND, CMD_PREFIX},
//to check
{CMD_NAME, LINEBREAK, CMD_SUPERIOR, 0},
{CMD_NAME, COMPLETE_COMMANDS, CMD_SUPERIOR, 0},
{CMD_NAME, TK_BANG, CMD_SUPERIOR, 0},
{CMD_NAME, SEPARATOR_OP, CMD_SUPERIOR, 0},
{CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0},
@ -161,6 +167,7 @@ t_aggrematch g_aggrematch[] =
{COMPOUND_COMMAND, ALL, COMMAND, 0},
{AND_OR_MINOR, PIPE_SEMI_SEQUENCE, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE},
{AND_OR_MINOR, LINEBREAK, AND_OR_MAJOR, 0},
{AND_OR_MINOR, COMPLETE_COMMANDS, AND_OR_MAJOR, 0},
{AND_OR_MINOR, AND_OR_MAJOR, AND_OR_MAJOR, 0},
{COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE},
{COMMAND, COMPOUND_LIST, PIPE_SEMI_SEQUENCE, 0},
@ -175,12 +182,18 @@ t_aggrematch g_aggrematch[] =
{COMMAND, SEPARATOR_OP, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, LINEBREAK, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, COMPLETE_COMMANDS, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, COMPLETE_CONDITION, PIPE_SEMI_SEQUENCE, 0},
{END_COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE},
{END_COMMAND, AND_OR_MAJOR, LIST, AND_OR_MAJOR},
{END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_UNTIL, PIPE_SEQUENCE, 0},
{END_COMMAND, LINEBREAK, PIPE_SEQUENCE, 0},
{END_COMMAND, COMPLETE_COMMANDS, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_DO, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_DO, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_IF, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0},
@ -194,6 +207,7 @@ t_aggrematch g_aggrematch[] =
{PIPE_SEQUENCE, SEPARATOR_OP, PIPELINE, 0},
{PIPE_SEQUENCE, NEWLINE_LIST, PIPELINE, 0},
{PIPE_SEQUENCE, LINEBREAK, PIPELINE, 0},
{PIPE_SEQUENCE, COMPLETE_COMMANDS, PIPELINE, 0},
{PIPE_SEQUENCE, AND_OR_MAJOR, PIPELINE, 0},
{PIPE_SEQUENCE, TK_DO, PIPELINE, 0},
{PIPE_SEQUENCE, TK_IF, PIPELINE, 0},
@ -211,6 +225,7 @@ t_aggrematch g_aggrematch[] =
{PIPELINE, TK_ELSE, AND_OR, 0},
{PIPELINE, COMPOUND_LIST, AND_OR, 0},
{PIPELINE, LINEBREAK, AND_OR, 0},
{PIPELINE, COMPLETE_COMMANDS, AND_OR, 0},
// {PIPELINE, LINEBREAK, AND_OR, AND_OR},
{PIPELINE, SEPARATOR_OP, AND_OR, 0},
{PIPELINE, COMPLETE_CONDITION, AND_OR, 0},
@ -228,11 +243,14 @@ t_aggrematch g_aggrematch[] =
{AND_OR, SEPARATOR_OP, LIST, LIST},
{AND_OR, NEWLINE_LIST, LIST, 0},
{AND_OR, LINEBREAK, LIST, 0},
{AND_OR, COMPLETE_COMMANDS, LIST, 0},
{LIST, NEWLINE_LIST, COMPLETE_COMMAND, 0},
{LIST, LINEBREAK, COMPLETE_COMMAND, 0},
{LIST, COMPLETE_COMMANDS, COMPLETE_COMMAND, 0},
{COMPLETE_COMMAND, NEWLINE_LIST, COMPLETE_COMMANDS, COMPLETE_COMMANDS},
{COMPLETE_COMMAND, LINEBREAK, COMPLETE_COMMANDS, 0},
{COMPLETE_COMMANDS, LINEBREAK, PROGRAM, LINEBREAK},
{COMPLETE_COMMAND, COMPLETE_COMMANDS, COMPLETE_COMMANDS, 0},
{COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS},
{0, 0, 0, 0},
};

View file

@ -60,9 +60,9 @@ int error_syntax(t_list **lst)
{
if (g_errormatch[i].token == token->type)
{
ft_putstr_fd("syntax error near unexpetcted token `", 2);
ft_putstr_fd("syntax error near unexpected token `", 2);
ft_putstr_fd(g_errormatch[i].error, 2);
ft_putstr_fd("'", 2);
ft_putstr_fd("'\n", 2);
return (1);
}
i++;

View file

@ -18,6 +18,7 @@ t_stackmatch g_stackmatch[] =
{TK_WORD, TK_CASE},
{TK_WORD, WORDLIST},
{TK_WORD, LINEBREAK},
{TK_WORD, COMPLETE_COMMANDS},
{TK_ASSIGNEMENT_WORD, CMD_PREFIX},
{TK_IO_NUMBER, REDIRECT_LIST},
{TK_IO_NUMBER, CMD_SUFFIX},
@ -25,6 +26,7 @@ t_stackmatch g_stackmatch[] =
{TK_IO_NUMBER, CMD_NAME},
{TK_IO_NUMBER, CMD_WORD},
{TK_IO_NUMBER, LINEBREAK},
{TK_IO_NUMBER, COMPLETE_COMMANDS},
{TK_IO_NUMBER, TK_BANG},
{TK_IO_NUMBER, SEPARATOR_OP},
{TK_IO_NUMBER, NEWLINE_LIST},
@ -37,6 +39,7 @@ t_stackmatch g_stackmatch[] =
{TK_OR_IF, CMD_SUPERIOR},
{TK_OR_IF, AND_OR},
{TK_DSEMI, LINEBREAK},
{TK_DSEMI, COMPLETE_COMMANDS},
{TK_DSEMI, COMPOUND_LIST},
{TK_LESS, TK_IO_NUMBER},
{TK_LESS, REDIRECT_LIST},
@ -45,6 +48,7 @@ t_stackmatch g_stackmatch[] =
{TK_LESS, CMD_WORD},
{TK_LESS, CMD_NAME},
{TK_LESS, LINEBREAK},
{TK_LESS, COMPLETE_COMMANDS},
{TK_LESS, TK_BANG},
{TK_LESS, SEPARATOR_OP},
{TK_LESS, NEWLINE_LIST},
@ -58,6 +62,7 @@ t_stackmatch g_stackmatch[] =
{TK_GREAT, CMD_WORD},
{TK_GREAT, CMD_NAME},
{TK_GREAT, LINEBREAK},
{TK_GREAT, COMPLETE_COMMANDS},
{TK_GREAT, TK_BANG},
{TK_GREAT, SEPARATOR_OP},
{TK_GREAT, NEWLINE_LIST},
@ -73,6 +78,7 @@ t_stackmatch g_stackmatch[] =
{TK_DLESS, CMD_WORD},
{TK_DLESS, CMD_NAME},
{TK_DLESS, LINEBREAK},
{TK_DLESS, COMPLETE_COMMANDS},
{TK_DLESS, TK_BANG},
{TK_DLESS, SEPARATOR_OP},
{TK_DLESS, NEWLINE_LIST},
@ -87,6 +93,8 @@ t_stackmatch g_stackmatch[] =
{TK_DLESSDASH, CMD_WORD},
{TK_DLESSDASH, CMD_NAME},
{TK_DLESSDASH, LINEBREAK},
{TK_DLESSDASH, COMPLETE_COMMANDS},
{TK_DLESSDASH, TK_BANG},
{TK_DLESSDASH, TK_BANG},
{TK_DLESSDASH, SEPARATOR_OP},
{TK_DLESSDASH, NEWLINE_LIST},
@ -101,6 +109,8 @@ t_stackmatch g_stackmatch[] =
{TK_DGREAT, CMD_WORD},
{TK_DGREAT, CMD_NAME},
{TK_DGREAT, LINEBREAK},
{TK_DGREAT, COMPLETE_COMMANDS},
{TK_DGREAT, TK_BANG},
{TK_DGREAT, TK_BANG},
{TK_DGREAT, SEPARATOR_OP},
{TK_DGREAT, NEWLINE_LIST},
@ -115,6 +125,8 @@ t_stackmatch g_stackmatch[] =
{TK_LESSAND, CMD_WORD},
{TK_LESSAND, CMD_NAME},
{TK_LESSAND, LINEBREAK},
{TK_LESSAND, COMPLETE_COMMANDS},
{TK_LESSAND, TK_BANG},
{TK_LESSAND, TK_BANG},
{TK_LESSAND, SEPARATOR_OP},
{TK_LESSAND, NEWLINE_LIST},
@ -129,6 +141,8 @@ t_stackmatch g_stackmatch[] =
{TK_GREATAND, CMD_WORD},
{TK_GREATAND, CMD_NAME},
{TK_GREATAND, LINEBREAK},
{TK_GREATAND, COMPLETE_COMMANDS},
{TK_LESSAND, TK_BANG},
{TK_GREATAND, TK_BANG},
{TK_GREATAND, SEPARATOR_OP},
{TK_GREATAND, NEWLINE_LIST},
@ -143,6 +157,8 @@ t_stackmatch g_stackmatch[] =
{TK_LESSGREAT, CMD_WORD},
{TK_LESSGREAT, CMD_NAME},
{TK_LESSGREAT, LINEBREAK},
{TK_LESSGREAT, COMPLETE_COMMANDS},
{TK_LESSGREAT, TK_BANG},
{TK_LESSGREAT, TK_BANG},
{TK_LESSGREAT, SEPARATOR_OP},
{TK_LESSGREAT, NEWLINE_LIST},
@ -157,6 +173,8 @@ t_stackmatch g_stackmatch[] =
{TK_CLOBBER, CMD_WORD},
{TK_CLOBBER, CMD_NAME},
{TK_CLOBBER, LINEBREAK},
{TK_CLOBBER, COMPLETE_COMMANDS},
{TK_CLOBBER, TK_BANG},
{TK_CLOBBER, TK_BANG},
{TK_CLOBBER, SEPARATOR_OP},
{TK_CLOBBER, NEWLINE_LIST},
@ -165,6 +183,8 @@ t_stackmatch g_stackmatch[] =
{TK_CLOBBER, AND_OR_MAJOR},
{TK_IF, LINEBREAK},
{TK_IF, COMPLETE_COMMANDS},
{TK_IF, TK_BANG},
{TK_IF, TK_BANG},
{TK_IF, SEPARATOR_OP},
{TK_IF, NEWLINE_LIST},
@ -199,6 +219,8 @@ t_stackmatch g_stackmatch[] =
{TK_DONE, COMPOUND_LIST},
{TK_DONE, END_COMMAND},
{TK_CASE, LINEBREAK},
{TK_CASE, COMPLETE_COMMANDS},
{TK_CASE, TK_BANG},
{TK_CASE, TK_BANG},
{TK_CASE, NEWLINE_LIST},
{TK_CASE, SEPARATOR_OP},
@ -208,6 +230,8 @@ t_stackmatch g_stackmatch[] =
{TK_ESAC, CASE_LIST_NS},
{TK_ESAC, LINEBREAK},
{TK_WHILE, LINEBREAK},
{TK_WHILE, COMPLETE_COMMANDS},
{TK_WHILE, TK_BANG},
{TK_WHILE, TK_BANG},
{TK_WHILE, SEPARATOR_OP},
{TK_WHILE, NEWLINE_LIST},
@ -220,6 +244,8 @@ t_stackmatch g_stackmatch[] =
{TK_WHILE, TK_THEN},
{TK_WHILE, COMPLETE_CONDITION},
{TK_UNTIL, LINEBREAK},
{TK_UNTIL, COMPLETE_COMMANDS},
{TK_UNTIL, TK_BANG},
{TK_UNTIL, TK_BANG},
{TK_UNTIL, SEPARATOR_OP},
{TK_UNTIL, NEWLINE_LIST},
@ -232,17 +258,23 @@ t_stackmatch g_stackmatch[] =
{TK_UNTIL, TK_THEN},
{TK_UNTIL, COMPLETE_CONDITION},
{TK_FOR, LINEBREAK},
{TK_FOR, COMPLETE_COMMANDS},
{TK_FOR, TK_BANG},
{TK_FOR, TK_BANG},
{TK_FOR, SEPARATOR_OP},
{TK_FOR, NEWLINE_LIST},
{TK_FOR, PIPE_SEMI_SEQUENCE},
{TK_LBRACE, LINEBREAK},
{TK_LBRACE, COMPLETE_COMMANDS},
{TK_LBRACE, TK_BANG},
{TK_LBRACE, TK_BANG},
{TK_LBRACE, SEPARATOR_OP},
{TK_LBRACE, NEWLINE_LIST},
{TK_LBRACE, PIPE_SEMI_SEQUENCE},
{TK_RBRACE, COMPOUND_LIST},
{TK_BANG, LINEBREAK},
{TK_BANG, COMPLETE_COMMANDS},
{TK_BANG, SEPARATOR_OP},
{TK_BANG, SEPARATOR_OP},
{TK_BANG, NEWLINE_LIST},
{TK_IN, LINEBREAK},
@ -260,6 +292,8 @@ t_stackmatch g_stackmatch[] =
{TK_PAREN_OPEN, FNAME},
{TK_PAREN_OPEN, CASE_LIST},
{TK_PAREN_OPEN, LINEBREAK},
{TK_PAREN_OPEN, COMPLETE_COMMANDS},
{TK_PAREN_OPEN, TK_BANG},
{TK_PAREN_OPEN, TK_BANG},
{TK_PAREN_OPEN, SEPARATOR_OP},
{TK_PAREN_OPEN, NEWLINE_LIST},
@ -271,6 +305,8 @@ t_stackmatch g_stackmatch[] =
{SEQUENTIAL_SEP, IN},
{SEQUENTIAL_SEP, WORDLIST},
{END_COMMAND, PIPE_SEMI_SEQUENCE},
{END_COMMAND, AND_OR_MAJOR},
{END_COMMAND, TK_WHILE},
{END_COMMAND, TK_WHILE},
{END_COMMAND, TK_UNTIL},
{END_COMMAND, TK_DO},
@ -279,6 +315,8 @@ t_stackmatch g_stackmatch[] =
{END_COMMAND, TK_ELIF},
{END_COMMAND, TK_ELSE},
{END_COMMAND, LINEBREAK},
{END_COMMAND, COMPLETE_COMMANDS},
{END_COMMAND, COMPOUND_LIST},
{END_COMMAND, COMPOUND_LIST},
{END_COMMAND, COMPLETE_CONDITION},
{SEPARATOR, CMD_SUPERIOR},
@ -291,6 +329,8 @@ t_stackmatch g_stackmatch[] =
{SEPARATOR_OP, COMPOUND_LIST},
{SEPARATOR_OP, PIPE_SEMI_SEQUENCE},
{LINEBREAK, TK_SEMI},
{LINEBREAK, END_COMMAND},
{LINEBREAK, SEPARATOR_OP},
{LINEBREAK, SEPARATOR_OP},
{LINEBREAK, TK_PAREN_CLOSE},
{LINEBREAK, WORD},
@ -322,6 +362,8 @@ t_stackmatch g_stackmatch[] =
{NEWLINE_LIST, COMPLETE_COMMANDS},
{NEWLINE_LIST, COMPLETE_CONDITION},
{NEWLINE_LIST, CONDITION},
{NEWLINE_LIST, LINEBREAK},
{HERE_END, TK_DLESS},
{HERE_END, TK_DLESS},
{HERE_END, TK_DLESSDASH},
{IO_HERE, TK_IO_NUMBER},
@ -332,6 +374,8 @@ t_stackmatch g_stackmatch[] =
{IO_HERE, CMD_WORD},
{IO_HERE, CMD_NAME},
{IO_HERE, LINEBREAK},
{IO_HERE, COMPLETE_COMMANDS},
{IO_HERE, TK_BANG},
{IO_HERE, TK_BANG},
{IO_HERE, SEPARATOR_OP},
{IO_HERE, NEWLINE_LIST},
@ -351,6 +395,8 @@ t_stackmatch g_stackmatch[] =
{IO_FILE, CMD_WORD},
{IO_FILE, CMD_NAME},
{IO_FILE, LINEBREAK},
{IO_FILE, COMPLETE_COMMANDS},
{IO_FILE, TK_BANG},
{IO_FILE, TK_BANG},
{IO_FILE, SEPARATOR_OP},
{IO_FILE, NEWLINE_LIST},
@ -362,6 +408,8 @@ t_stackmatch g_stackmatch[] =
{IO_REDIRECT, CMD_WORD},
{IO_REDIRECT, CMD_NAME},
{IO_REDIRECT, LINEBREAK},
{IO_REDIRECT, COMPLETE_COMMANDS},
{IO_REDIRECT, TK_BANG},
{IO_REDIRECT, TK_BANG},
{IO_REDIRECT, SEPARATOR_OP},
{IO_REDIRECT, NEWLINE_LIST},
@ -371,13 +419,17 @@ t_stackmatch g_stackmatch[] =
{CMD_SUFFIX, CMD_NAME},
{CMD_SUFFIX, CMD_SUPERIOR},
{CMD_PREFIX, LINEBREAK},
{CMD_PREFIX, COMPLETE_COMMANDS},
{CMD_PREFIX, TK_BANG},
{CMD_PREFIX, TK_BANG},
{CMD_PREFIX, SEPARATOR_OP},
{CMD_PREFIX, NEWLINE_LIST},
{CMD_PREFIX, PIPE_SEMI_SEQUENCE},
{CMD_WORD, CMD_PREFIX},
{CMD_NAME, COMPLETE_COMMANDS},
{CMD_NAME, LINEBREAK},
{CMD_NAME, TK_BANG},
{CMD_NAME, TK_BANG},
{CMD_NAME, SEPARATOR_OP},
{CMD_NAME, NEWLINE_LIST},
{CMD_NAME, PIPE_SEMI_SEQUENCE},
@ -401,7 +453,9 @@ t_stackmatch g_stackmatch[] =
{CMD_SUPERIOR, TK_ELSE},
{CMD_SUPERIOR, COMPOUND_LIST},
{CMD_SUPERIOR, COMPLETE_CONDITION},
{CMD_SUPERIOR, LINEBREAK,},
{CMD_SUPERIOR, LINEBREAK},
{CMD_SUPERIOR, COMPLETE_COMMANDS},
{CMD_SUPERIOR, TK_BANG},
{CMD_SUPERIOR, TK_BANG},
{CMD_SUPERIOR, SEPARATOR_OP},
{CMD_SUPERIOR, NEWLINE_LIST},
@ -419,6 +473,8 @@ t_stackmatch g_stackmatch[] =
{SIMPLE_COMMAND, COMPOUND_LIST},
{SIMPLE_COMMAND, COMPLETE_CONDITION},
{SIMPLE_COMMAND, LINEBREAK},
{SIMPLE_COMMAND, COMPLETE_COMMANDS},
{SIMPLE_COMMAND, TK_BANG},
{SIMPLE_COMMAND, TK_BANG},
{SIMPLE_COMMAND, SEPARATOR_OP},
{SIMPLE_COMMAND, NEWLINE_LIST},
@ -431,27 +487,39 @@ t_stackmatch g_stackmatch[] =
{LOOP, TK_WHILE},
{LOOP, TK_UNTIL},
{CONDITION, LINEBREAK},
{CONDITION, COMPLETE_COMMANDS},
{CONDITION, COMPOUND_LIST},
{CONDITION, COMPOUND_LIST},
{CONDITION, COMPLETE_CONDITION},
{COMPLETE_CONDITION, LINEBREAK},
{COMPLETE_CONDITION, COMPLETE_COMMANDS},
{COMPLETE_CONDITION, COMPLETE_CONDITION},
{COMPLETE_CONDITION, COMPLETE_CONDITION},
{BRACE_GROUP, LINEBREAK},
{BRACE_GROUP, COMPLETE_COMMANDS},
{BRACE_GROUP, TK_BANG},
{BRACE_GROUP, TK_BANG},
{BRACE_GROUP, SEPARATOR_OP},
{BRACE_GROUP, NEWLINE_LIST},
{BRACE_GROUP, PIPE_SEMI_SEQUENCE},
{FNAME, LINEBREAK},
{FNAME, COMPLETE_COMMANDS},
{FNAME, TK_BANG},
{FNAME, TK_BANG},
{FNAME, SEPARATOR_OP},
{FNAME, NEWLINE_LIST},
{FNAME, PIPE_SEMI_SEQUENCE},
{FUNCTION_BODY, FUNC},
{FUNCTION_DEFINITION, LINEBREAK},
{FUNCTION_DEFINITION, COMPLETE_COMMANDS},
{FUNCTION_DEFINITION, TK_BANG},
{FUNCTION_DEFINITION, TK_BANG},
{FUNCTION_DEFINITION, SEPARATOR_OP},
{FUNCTION_DEFINITION, NEWLINE_LIST},
{FUNCTION_DEFINITION, PIPE_SEMI_SEQUENCE},
{UNTIL_CLAUSE, LINEBREAK},
{UNTIL_CLAUSE, COMPLETE_COMMANDS},
{UNTIL_CLAUSE, TK_BANG},
{UNTIL_CLAUSE, TK_BANG},
{UNTIL_CLAUSE, SEPARATOR_OP},
{UNTIL_CLAUSE, NEWLINE_LIST},
@ -466,6 +534,8 @@ t_stackmatch g_stackmatch[] =
{UNTIL_CLAUSE, COMPOUND_LIST},
{UNTIL_CLAUSE, COMPLETE_CONDITION},
{WHILE_CLAUSE, LINEBREAK},
{WHILE_CLAUSE, COMPLETE_COMMANDS},
{WHILE_CLAUSE, TK_BANG},
{WHILE_CLAUSE, TK_BANG},
{WHILE_CLAUSE, SEPARATOR_OP},
{WHILE_CLAUSE, NEWLINE_LIST},
@ -482,6 +552,8 @@ t_stackmatch g_stackmatch[] =
// {ELSE_PART, COMPOUND_LIST},
// {ELSE_PART, COMPLETE_CONDITION},
{IF_CLAUSE, LINEBREAK},
{IF_CLAUSE, COMPLETE_COMMANDS},
{IF_CLAUSE, TK_BANG},
{IF_CLAUSE, TK_BANG},
{IF_CLAUSE, SEPARATOR_OP},
{IF_CLAUSE, NEWLINE_LIST},
@ -508,6 +580,8 @@ t_stackmatch g_stackmatch[] =
{CASE_LIST, LINEBREAK},
{CASE_LIST_NS, LINEBREAK},
{CASE_CLAUSE, LINEBREAK},
{CASE_CLAUSE, COMPLETE_COMMANDS},
{CASE_CLAUSE, TK_BANG},
{CASE_CLAUSE, TK_BANG},
{CASE_CLAUSE, SEPARATOR_OP},
{CASE_CLAUSE, NEWLINE_LIST},
@ -516,11 +590,15 @@ t_stackmatch g_stackmatch[] =
{IN, LINEBREAK},
{NAME, TK_FOR},
{FOR_CLAUSE, LINEBREAK},
{FOR_CLAUSE, COMPLETE_COMMANDS},
{FOR_CLAUSE, TK_BANG},
{FOR_CLAUSE, TK_BANG},
{FOR_CLAUSE, SEPARATOR_OP},
{FOR_CLAUSE, NEWLINE_LIST},
{FOR_CLAUSE, PIPE_SEMI_SEQUENCE},
{TERM, LINEBREAK},
{TERM, COMPLETE_COMMANDS},
{COMPOUND_LIST, TK_DO},
{COMPOUND_LIST, TK_DO},
{COMPOUND_LIST, TK_LBRACE},
{COMPOUND_LIST, TK_WHILE},
@ -533,11 +611,15 @@ t_stackmatch g_stackmatch[] =
{COMPOUND_LIST, COMPOUND_LIST},
{COMPOUND_LIST, COMPLETE_CONDITION},
{SUBSHELL, LINEBREAK},
{SUBSHELL, COMPLETE_COMMANDS},
{SUBSHELL, TK_BANG},
{SUBSHELL, TK_BANG},
{SUBSHELL, SEPARATOR_OP},
{SUBSHELL, NEWLINE_LIST},
{SUBSHELL, PIPE_SEMI_SEQUENCE},
{COMPOUND_COMMAND, LINEBREAK},
{COMPOUND_COMMAND, COMPLETE_COMMANDS},
{COMPOUND_COMMAND, TK_BANG},
{COMPOUND_COMMAND, TK_BANG},
{COMPOUND_COMMAND, SEPARATOR_OP},
{COMPOUND_COMMAND, NEWLINE_LIST},
@ -555,6 +637,8 @@ t_stackmatch g_stackmatch[] =
{COMMAND, TK_WHILE},
{COMMAND, TK_UNTIL},
{COMMAND, LINEBREAK},
{COMMAND, COMPLETE_COMMANDS},
{COMMAND, TK_DO},
{COMMAND, TK_DO},
{COMMAND, TK_IF},
{COMMAND, TK_ELIF},
@ -569,6 +653,8 @@ t_stackmatch g_stackmatch[] =
{COMMAND, AND_OR_MAJOR},
{AND_OR_MINOR, PIPE_SEMI_SEQUENCE},
{AND_OR_MINOR, LINEBREAK},
{AND_OR_MINOR, COMPLETE_COMMANDS},
{AND_OR_MINOR, AND_OR_MAJOR},
{AND_OR_MINOR, AND_OR_MAJOR},
{PIPE_SEQUENCE, TK_WHILE},
{PIPE_SEQUENCE, TK_UNTIL},
@ -580,6 +666,8 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEQUENCE, COMPOUND_LIST},
{PIPE_SEQUENCE, COMPLETE_CONDITION},
{PIPE_SEQUENCE, LINEBREAK},
{PIPE_SEQUENCE, COMPLETE_COMMANDS},
{PIPE_SEQUENCE, TK_BANG},
{PIPE_SEQUENCE, TK_BANG},
{PIPE_SEQUENCE, SEPARATOR_OP},
{PIPE_SEQUENCE, NEWLINE_LIST},
@ -594,6 +682,8 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEMI_SEQUENCE, COMPOUND_LIST},
{PIPE_SEMI_SEQUENCE, COMPLETE_CONDITION},
{PIPE_SEMI_SEQUENCE, LINEBREAK},
{PIPE_SEMI_SEQUENCE, COMPLETE_COMMANDS},
{PIPE_SEMI_SEQUENCE, TK_BANG},
{PIPE_SEMI_SEQUENCE, TK_BANG},
{PIPE_SEMI_SEQUENCE, SEPARATOR_OP},
{PIPE_SEMI_SEQUENCE, NEWLINE_LIST},
@ -608,10 +698,14 @@ t_stackmatch g_stackmatch[] =
{PIPELINE, COMPOUND_LIST},
{PIPELINE, COMPLETE_CONDITION},
{PIPELINE, LINEBREAK},
{PIPELINE, COMPLETE_COMMANDS},
{PIPELINE, SEPARATOR_OP},
{PIPELINE, SEPARATOR_OP},
{PIPELINE, NEWLINE_LIST},
{PIPELINE, AND_OR_MAJOR},
{AND_OR_MAJOR, LINEBREAK},
{AND_OR_MAJOR, COMPLETE_COMMANDS},
{AND_OR_MAJOR, AND_OR_MAJOR},
{AND_OR_MAJOR, AND_OR_MAJOR},
{AND_OR, TK_DO},
{AND_OR, TK_WHILE},
@ -623,13 +717,18 @@ t_stackmatch g_stackmatch[] =
{AND_OR, COMPOUND_LIST},
{AND_OR, COMPLETE_CONDITION},
{AND_OR, LINEBREAK},
{AND_OR, COMPLETE_COMMANDS},
{AND_OR, SEPARATOR_OP},
{AND_OR, SEPARATOR_OP},
{AND_OR, NEWLINE_LIST},
{LIST, LINEBREAK},
{LIST, COMPLETE_COMMANDS},
{LIST, NEWLINE_LIST},
{COMPLETE_COMMAND, LINEBREAK},
{COMPLETE_COMMAND, COMPLETE_COMMANDS},
{COMPLETE_COMMAND, NEWLINE_LIST},
{COMPLETE_COMMANDS, LINEBREAK},
{COMPLETE_COMMANDS, COMPLETE_COMMANDS},
{0, 0},
};

View file

@ -21,7 +21,8 @@ static void insert_linebreak(t_list **lst)
static int end_instruction(t_sym sym)
{
if (sym == CMD_SUPERIOR || sym == PIPE_SEMI_SEQUENCE)
if (sym == CMD_SUPERIOR || sym == PIPE_SEMI_SEQUENCE
|| sym == COMPLETE_COMMANDS || sym == END_COMMAND)
return (1);
return (0);
}
@ -29,6 +30,8 @@ static int end_instruction(t_sym sym)
int ft_parse(t_btree **ast, t_list **token, t_parser *parser)
{
(void)ast;
if (parser->state == SUCCESS || parser->state == ERROR)
parser_init(parser);
while (*token)
{
produce_sym(*parser->stack, parser->new_sym, token);
@ -49,7 +52,6 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser)
// build_tree(ast, token);
// btree_print(STDBUG, *ast, &ft_putast);
if ((end_instruction(*parser->stack) && !(*token)->next))
/* || *parser->stack == PROGRAM) */
insert_linebreak(token);
else
ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free);

View file

@ -46,6 +46,7 @@ t_prodmatch g_prodmatch[] =
{TK_WORD, TK_IN, PATTERN},
{TK_WORD, CASE_LIST, PATTERN},
{TK_WORD, TK_PAREN_OPEN, PATTERN},
{TK_WORD, COMPLETE_COMMANDS, CMD_NAME},
{TK_ASSIGNEMENT_WORD, LINEBREAK, CMD_PREFIX},
{TK_ASSIGNEMENT_WORD, TK_BANG, CMD_PREFIX},
{TK_ASSIGNEMENT_WORD, SEPARATOR_OP, CMD_PREFIX},

2
42sh/test.sh Normal file
View file

@ -0,0 +1,2 @@
> >
ls | cat