grammar if stable

This commit is contained in:
ariard@student.42.fr 2017-02-20 16:07:54 +01:00
parent fea9429e9f
commit 3d65d42708
14 changed files with 97 additions and 17 deletions

BIN
42sh/includes/.parser.h.swn Normal file

Binary file not shown.

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/01 12:15:54 by jhalford #+# #+# */
/* Updated: 2017/02/19 18:43:02 by ariard ### ########.fr */
/* Updated: 2017/02/20 14:57:52 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -121,6 +121,8 @@ enum e_sym
AND_OR_MAJOR,
AND_OR_MINOR,
END_COMMAND,
CONDITION,
COMPLETE_CONDITION,
ALL = 200,
};

View file

@ -0,0 +1,4 @@
if ls ;
then
pwd
fi

View file

@ -0,0 +1,10 @@
if ls ;
then
pwd
elif ls
then
pwd
elif ls
then
pwd
fi

View file

@ -0,0 +1,5 @@
if cat yolo ;
then
pwd
else ls
fi

View file

@ -0,0 +1,11 @@
if cat yolo ;
then
pwd
elif ls
then
pwd
elif pwd
then
ls
else ls
fi

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 17:39:18 by ariard #+# #+# */
/* Updated: 2017/02/19 19:32:24 by ariard ### ########.fr */
/* Updated: 2017/02/20 16:06:08 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -20,8 +20,10 @@ t_aggrematch g_aggrematch[] =
{TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0},
{TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
{TK_FI, ELSE_PART, IF_CLAUSE, TK_IF},
{TK_FI, COMPOUND_LIST, IF_CLAUSE, TK_IF},
{TK_FI, CMD_SUPERIOR, IF_CLAUSE, TK_IF},
{TK_FI, COMPOUND_LIST, IF_CLAUSE, COMPLETE_CONDITION},
{TK_FI, COMPLETE_CONDITION, IF_CLAUSE, COMPLETE_CONDITION},
{TK_FI, CONDITION, IF_CLAUSE, COMPLETE_CONDITION},
{TK_THEN, CONDITION, COMPLETE_CONDITION, CONDITION},
{TK_DONE, CMD_SUPERIOR, DO_GROUP, TK_DO},
{TK_DONE, COMPOUND_LIST, DO_GROUP, TK_DO},
//Esac ?
@ -35,8 +37,10 @@ t_aggrematch g_aggrematch[] =
//watch this
{SEPARATOR_OP, CMD_SUPERIOR, SEPARATOR, 0},
{SEPARATOR_OP, COMPOUND_LIST, SEPARATOR, 0},
{SEPARATOR_OP, PIPE_SEMI_SEQUENCE, SEPARATOR, 0},
{SEPARATOR, CMD_SUPERIOR, END_COMMAND, CMD_SUPERIOR},
{SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{SEPARATOR, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE},
{LINEBREAK, SEPARATOR_OP, SEPARATOR, SEPARATOR_OP},
{LINEBREAK, TK_SEMI, SEQUENTIAL_SEP, TK_SEMI},
@ -64,6 +68,8 @@ t_aggrematch g_aggrematch[] =
{NEWLINE_LIST, WORDLIST, SEQUENTIAL_SEP, 0},
{NEWLINE_LIST, TERM, SEPARATOR, 0},
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
//to check
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER},
@ -94,7 +100,7 @@ t_aggrematch g_aggrematch[] =
{REDIRECT_LIST, COMPOUND_COMMAND, COMPOUND_COMMAND, COMPOUND_COMMAND},
{CMD_SUFFIX, CMD_WORD, SIMPLE_COMMAND, CMD_PREFIX},
{CMD_SUFFIX, CMD_NAME, SIMPLE_COMMAND, CMD_NAME},
{CMD_SUFFIX, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
//to abstract
{CMD_PREFIX, LINEBREAK, SIMPLE_COMMAND, 0},
{CMD_PREFIX, TK_BANG, SIMPLE_COMMAND, 0},
@ -114,6 +120,7 @@ t_aggrematch g_aggrematch[] =
{CMD_NAME, TK_ELSE, CMD_SUPERIOR, 0},
{CMD_NAME, TK_THEN, CMD_SUPERIOR, 0},
{CMD_NAME, COMPOUND_LIST, CMD_SUPERIOR, 0},
{CMD_NAME, COMPLETE_CONDITION, CMD_SUPERIOR, 0},
{CMD_NAME, TK_PIPE, CMD_SUPERIOR, 0},
{CMD_NAME, PIPE_SEMI_SEQUENCE, CMD_SUPERIOR, 0},
{CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0},
@ -129,7 +136,8 @@ t_aggrematch g_aggrematch[] =
{LOOP, TK_UNTIL, UNTIL_CLAUSE, TK_UNTIL},
{UNTIL_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{WHILE_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{ELSE_PART, COMPOUND_LIST, ELSE_PART, TK_ELIF},
// {ELSE_PART, COMPOUND_LIST, ELSE_PART, TK_ELIF},
// {ELSE_PART, COMPLETE_CONDITION, IF_CLAUSE, COMPLETE_CONDITION},
{IF_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{PATTERN, TK_PAREN_OPEN, PATTERN_CASE, TK_PAREN_OPEN},
{PATTERN, CASE_LIST, PATTERN_CASE, 0},
@ -140,7 +148,10 @@ t_aggrematch g_aggrematch[] =
{CASE_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{FOR_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{TERM, LINEBREAK, COMPOUND_LIST, LINEBREAK},
{COMPOUND_LIST, TK_ELSE, ELSE_PART, TK_ELSE},
// {COMPOUND_LIST, TK_ELSE, ELSE_PART, TK_ELSE},
{COMPOUND_LIST, TK_IF, CONDITION, TK_IF},
{COMPOUND_LIST, TK_THEN, CONDITION, TK_THEN},
{COMPOUND_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
// {COMPOUND_LIST, TK_THEN, ELSE_PART, TK_ELIF},
{COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{SUBSHELL, ALL, COMPOUND_COMMAND, 0},
@ -169,6 +180,7 @@ t_aggrematch g_aggrematch[] =
{END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_THEN, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_ELSE, PIPE_SEQUENCE, 0},
{END_COMMAND, COMPLETE_CONDITION, PIPE_SEQUENCE, 0},
{END_COMMAND, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{PIPE_SEQUENCE, TK_WHILE, PIPELINE, 0},
{PIPE_SEQUENCE, TK_BANG, PIPELINE, TK_BANG},
@ -182,6 +194,7 @@ t_aggrematch g_aggrematch[] =
{PIPE_SEQUENCE, TK_THEN, PIPELINE, 0},
{PIPE_SEQUENCE, TK_ELSE, PIPELINE, 0},
{PIPE_SEQUENCE, COMPOUND_LIST, PIPELINE, 0},
{PIPE_SEQUENCE, COMPLETE_CONDITION, PIPELINE, 0},
{PIPELINE, TK_WHILE, AND_OR, 0},
{PIPELINE, TK_DO, AND_OR, 0},
{PIPELINE, TK_IF, AND_OR, 0},
@ -192,6 +205,7 @@ t_aggrematch g_aggrematch[] =
{PIPELINE, LINEBREAK, AND_OR, 0},
// {PIPELINE, LINEBREAK, AND_OR, AND_OR},
{PIPELINE, SEPARATOR_OP, AND_OR, 0},
{PIPELINE, COMPLETE_CONDITION, AND_OR, 0},
{PIPELINE, AND_OR_MAJOR, AND_OR, AND_OR_MAJOR},
{AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR},
{AND_OR, TK_DO, COMPOUND_LIST, 0},
@ -201,6 +215,7 @@ t_aggrematch g_aggrematch[] =
{AND_OR, TK_THEN, COMPOUND_LIST, 0},
{AND_OR, TK_ELSE, COMPOUND_LIST, 0},
{AND_OR, COMPOUND_LIST, COMPOUND_LIST, 0},
{AND_OR, COMPLETE_CONDITION, COMPOUND_LIST, 0},
{AND_OR, SEPARATOR_OP, LIST, LIST},
{AND_OR, NEWLINE_LIST, LIST, 0},
{AND_OR, LINEBREAK, LIST, 0},

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 16:26:30 by ariard #+# #+# */
/* Updated: 2017/02/19 19:31:38 by ariard ### ########.fr */
/* Updated: 2017/02/20 16:06:15 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -176,15 +176,21 @@ t_stackmatch g_stackmatch[] =
{TK_IF, TK_ELIF},
{TK_IF, TK_THEN},
{TK_IF, COMPOUND_LIST},
{TK_THEN, CONDITION},
{TK_THEN, COMPOUND_LIST},
{TK_THEN, CMD_SUPERIOR},
{TK_ELSE, COMPOUND_LIST},
{TK_ELSE, CONDITION},
{TK_ELSE, COMPLETE_CONDITION},
{TK_ELIF, COMPOUND_LIST},
{TK_ELIF, COMPLETE_CONDITION},
{TK_ELIF, CONDITION},
{TK_FI, ELSE_PART},
{TK_FI, COMPOUND_LIST},
{TK_FI, CMD_SUPERIOR},
{TK_FI, END_COMMAND},
{TK_FI, CONDITION},
{TK_DO, CMD_SUPERIOR},
{TK_FI, COMPLETE_CONDITION},
{TK_DO, COMPOUND_LIST},
{TK_DO, NAME},
{TK_DO, SEQUENTIAL_SEP},
@ -263,13 +269,16 @@ t_stackmatch g_stackmatch[] =
{END_COMMAND, TK_ELSE},
{END_COMMAND, LINEBREAK},
{END_COMMAND, COMPOUND_LIST},
{END_COMMAND, COMPLETE_CONDITION},
{SEPARATOR, CMD_SUPERIOR},
{SEPARATOR, TERM},
{SEPARATOR, COMPOUND_LIST},
{SEPARATOR, PIPE_SEMI_SEQUENCE},
{SEPARATOR_OP, CMD_SUPERIOR},
{SEPARATOR_OP, LIST},
{SEPARATOR_OP, TERM},
{SEPARATOR_OP, COMPOUND_LIST},
{SEPARATOR_OP, PIPE_SEMI_SEQUENCE},
{LINEBREAK, TK_SEMI},
{LINEBREAK, SEPARATOR_OP},
{LINEBREAK, TK_PAREN_CLOSE},
@ -298,6 +307,8 @@ t_stackmatch g_stackmatch[] =
{NEWLINE_LIST, TERM},
{NEWLINE_LIST, COMPOUND_LIST},
{NEWLINE_LIST, COMPLETE_COMMANDS},
{NEWLINE_LIST, COMPLETE_CONDITION},
{NEWLINE_LIST, CONDITION},
{HERE_END, TK_DLESS},
{HERE_END, TK_DLESSDASH},
{IO_HERE, TK_IO_NUMBER},
@ -345,6 +356,7 @@ t_stackmatch g_stackmatch[] =
{REDIRECT_LIST, COMPOUND_COMMAND},
{CMD_SUFFIX, CMD_WORD},
{CMD_SUFFIX, CMD_NAME},
{CMD_SUFFIX, CMD_SUPERIOR},
{CMD_PREFIX, LINEBREAK},
{CMD_PREFIX, TK_BANG},
{CMD_PREFIX, SEPARATOR_OP},
@ -364,6 +376,7 @@ t_stackmatch g_stackmatch[] =
{CMD_NAME, TK_THEN},
{CMD_NAME, TK_ELSE},
{CMD_NAME, COMPOUND_LIST},
{CMD_NAME, COMPLETE_CONDITION},
{CMD_SUPERIOR, TK_WHILE},
{CMD_SUPERIOR, TK_DO},
@ -372,6 +385,7 @@ t_stackmatch g_stackmatch[] =
{CMD_SUPERIOR, TK_THEN},
{CMD_SUPERIOR, TK_ELSE},
{CMD_SUPERIOR, COMPOUND_LIST},
{CMD_SUPERIOR, COMPLETE_CONDITION},
{CMD_SUPERIOR, LINEBREAK,},
{CMD_SUPERIOR, TK_BANG},
{CMD_SUPERIOR, SEPARATOR_OP},
@ -387,6 +401,7 @@ t_stackmatch g_stackmatch[] =
{SIMPLE_COMMAND, TK_THEN},
{SIMPLE_COMMAND, TK_ELSE},
{SIMPLE_COMMAND, COMPOUND_LIST},
{SIMPLE_COMMAND, COMPLETE_CONDITION},
{SIMPLE_COMMAND, LINEBREAK},
{SIMPLE_COMMAND, TK_BANG},
{SIMPLE_COMMAND, SEPARATOR_OP},
@ -399,6 +414,9 @@ t_stackmatch g_stackmatch[] =
{DO_GROUP, SEQUENTIAL_SEP},
{LOOP, TK_WHILE},
{LOOP, TK_UNTIL},
{CONDITION, LINEBREAK},
{CONDITION, COMPOUND_LIST},
{COMPLETE_CONDITION, LINEBREAK},
{BRACE_GROUP, LINEBREAK},
{BRACE_GROUP, TK_BANG},
{BRACE_GROUP, SEPARATOR_OP},
@ -432,7 +450,9 @@ t_stackmatch g_stackmatch[] =
{WHILE_CLAUSE, TK_THEN},
{WHILE_CLAUSE, TK_ELSE},
{WHILE_CLAUSE, COMPOUND_LIST},
{ELSE_PART, COMPOUND_LIST},
{WHILE_CLAUSE, COMPLETE_CONDITION},
// {ELSE_PART, COMPOUND_LIST},
// {ELSE_PART, COMPLETE_CONDITION},
{IF_CLAUSE, LINEBREAK},
{IF_CLAUSE, TK_BANG},
{IF_CLAUSE, SEPARATOR_OP},
@ -444,6 +464,8 @@ t_stackmatch g_stackmatch[] =
{IF_CLAUSE, TK_ELIF},
{IF_CLAUSE, TK_THEN},
{IF_CLAUSE, TK_ELSE},
{IF_CLAUSE, COMPOUND_LIST},
{IF_CLAUSE, COMPLETE_COMMAND},
{PATTERN, TK_PAREN_OPEN},
{PATTERN, CASE_LIST},
@ -478,6 +500,7 @@ t_stackmatch g_stackmatch[] =
{COMPOUND_LIST, TK_THEN},
{COMPOUND_LIST, TK_ELSE},
{COMPOUND_LIST, COMPOUND_LIST},
{COMPOUND_LIST, COMPLETE_CONDITION},
{SUBSHELL, LINEBREAK},
{SUBSHELL, TK_BANG},
{SUBSHELL, SEPARATOR_OP},
@ -496,6 +519,7 @@ t_stackmatch g_stackmatch[] =
{COMPOUND_COMMAND, TK_THEN},
{COMPOUND_COMMAND, TK_ELSE},
{COMPOUND_COMMAND, COMPOUND_LIST},
{COMPOUND_COMMAND, COMPLETE_CONDITION},
{COMMAND, TK_WHILE},
{COMMAND, LINEBREAK},
{COMMAND, TK_DO},
@ -504,6 +528,7 @@ t_stackmatch g_stackmatch[] =
{COMMAND, TK_THEN},
{COMMAND, TK_ELSE},
{COMMAND, COMPOUND_LIST},
{COMMAND, COMPLETE_CONDITION},
{COMMAND, TK_BANG},
{COMMAND, SEPARATOR_OP},
{COMMAND, NEWLINE_LIST},
@ -519,6 +544,7 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEQUENCE, TK_THEN},
{PIPE_SEQUENCE, TK_ELSE},
{PIPE_SEQUENCE, COMPOUND_LIST},
{PIPE_SEQUENCE, COMPLETE_CONDITION},
{PIPE_SEQUENCE, LINEBREAK},
{PIPE_SEQUENCE, TK_BANG},
{PIPE_SEQUENCE, SEPARATOR_OP},
@ -531,6 +557,7 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEMI_SEQUENCE, TK_THEN},
{PIPE_SEMI_SEQUENCE, TK_ELSE},
{PIPE_SEMI_SEQUENCE, COMPOUND_LIST},
{PIPE_SEMI_SEQUENCE, COMPLETE_CONDITION},
{PIPE_SEMI_SEQUENCE, LINEBREAK},
{PIPE_SEMI_SEQUENCE, TK_BANG},
{PIPE_SEMI_SEQUENCE, SEPARATOR_OP},
@ -543,6 +570,7 @@ t_stackmatch g_stackmatch[] =
{PIPELINE, TK_THEN},
{PIPELINE, TK_ELSE},
{PIPELINE, COMPOUND_LIST},
{PIPELINE, COMPLETE_CONDITION},
{PIPELINE, LINEBREAK},
{PIPELINE, SEPARATOR_OP},
{PIPELINE, NEWLINE_LIST},
@ -556,6 +584,7 @@ t_stackmatch g_stackmatch[] =
{AND_OR, TK_THEN},
{AND_OR, TK_ELSE},
{AND_OR, COMPOUND_LIST},
{AND_OR, COMPLETE_CONDITION},
{AND_OR, LINEBREAK},
{AND_OR, SEPARATOR_OP},
{AND_OR, NEWLINE_LIST},

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 17:58:34 by ariard #+# #+# */
/* Updated: 2017/02/19 19:31:40 by ariard ### ########.fr */
/* Updated: 2017/02/20 15:54:45 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -25,6 +25,7 @@ t_prodmatch g_prodmatch[] =
{TK_N_WORD, TK_CLOBBER, FILENAME},
{TK_N_WORD, CMD_WORD, CMD_SUFFIX},
{TK_N_WORD, CMD_NAME, CMD_SUFFIX},
{TK_N_WORD, CMD_SUPERIOR, CMD_SUFFIX},
{TK_N_WORD, LINEBREAK, CMD_NAME},
{TK_N_WORD, TK_PIPE, CMD_NAME},
{TK_N_WORD, AND_OR, CMD_NAME},
@ -36,7 +37,7 @@ t_prodmatch g_prodmatch[] =
{TK_N_WORD, TK_ELIF, CMD_NAME},
{TK_N_WORD, TK_ELSE, CMD_NAME},
{TK_N_WORD, COMPOUND_LIST, CMD_NAME},
{TK_N_WORD, COMPLETE_CONDITION, CMD_NAME},
{TK_N_WORD, NEWLINE_LIST, CMD_NAME},
{TK_N_WORD, TK_BANG, CMD_NAME},
{TK_N_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME},
@ -66,9 +67,12 @@ t_prodmatch g_prodmatch[] =
{TK_NEWLINE, CMD_SUPERIOR, LINEBREAK},
{TK_NEWLINE, PIPE_SEMI_SEQUENCE, LINEBREAK},
{TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST},
{TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST},
{TK_NEWLINE, CONDITION, NEWLINE_LIST},
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
{TK_SEMI, TERM, SEPARATOR_OP},
{TK_SEMI, LIST, SEPARATOR_OP},
{TK_SEMI, PIPE_SEMI_SEQUENCE, SEPARATOR_OP},
{TK_AMP, CMD_SUPERIOR, SEPARATOR_OP},
{TK_AMP, TERM, SEPARATOR_OP},
{TK_AMP, LIST, SEPARATOR_OP},

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/09 15:32:10 by ariard #+# #+# */
/* Updated: 2017/02/19 19:31:42 by ariard ### ########.fr */
/* Updated: 2017/02/20 15:04:21 by ariard ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,6 +14,10 @@
char *read_state(t_sym current)
{
if (current == CONDITION)
return ("CONDITION");
if (current == COMPLETE_CONDITION)
return ("COMPLETE_CONDITION");
if (current == TK_ELSE)
return ("TK_ELSE");
if (current == TK_FI)

View file

@ -1,4 +0,0 @@
if cat yolo
then ls
else pwd
fi