more if elif then else grammar

This commit is contained in:
AntoHesse 2017-02-20 01:05:11 +01:00
parent f6aefd7739
commit fea9429e9f
6 changed files with 88 additions and 5 deletions

View file

@ -8,6 +8,4 @@ elif ls
then
pwd
else ls
then
pwd
fi

View file

@ -111,6 +111,7 @@ t_aggrematch g_aggrematch[] =
{CMD_NAME, TK_DO, CMD_SUPERIOR, 0},
{CMD_NAME, TK_IF, CMD_SUPERIOR, 0},
{CMD_NAME, TK_ELIF, CMD_SUPERIOR, 0},
{CMD_NAME, TK_ELSE, CMD_SUPERIOR, 0},
{CMD_NAME, TK_THEN, CMD_SUPERIOR, 0},
{CMD_NAME, COMPOUND_LIST, CMD_SUPERIOR, 0},
{CMD_NAME, TK_PIPE, CMD_SUPERIOR, 0},
@ -140,7 +141,7 @@ t_aggrematch g_aggrematch[] =
{FOR_CLAUSE, ALL, COMPOUND_COMMAND, 0},
{TERM, LINEBREAK, COMPOUND_LIST, LINEBREAK},
{COMPOUND_LIST, TK_ELSE, ELSE_PART, TK_ELSE},
{COMPOUND_LIST, TK_THEN, ELSE_PART, TK_ELIF},
// {COMPOUND_LIST, TK_THEN, ELSE_PART, TK_ELIF},
{COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{SUBSHELL, ALL, COMPOUND_COMMAND, 0},
{COMPOUND_COMMAND, ALL, COMMAND, 0},
@ -154,6 +155,7 @@ t_aggrematch g_aggrematch[] =
{COMMAND, TK_IF, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, TK_THEN, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, TK_ELIF, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, TK_ELSE, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, TK_BANG, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, SEPARATOR_OP, PIPE_SEMI_SEQUENCE, 0},
{COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0},
@ -166,6 +168,7 @@ t_aggrematch g_aggrematch[] =
{END_COMMAND, TK_IF, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_THEN, PIPE_SEQUENCE, 0},
{END_COMMAND, TK_ELSE, PIPE_SEQUENCE, 0},
{END_COMMAND, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
{PIPE_SEQUENCE, TK_WHILE, PIPELINE, 0},
{PIPE_SEQUENCE, TK_BANG, PIPELINE, TK_BANG},
@ -177,12 +180,14 @@ t_aggrematch g_aggrematch[] =
{PIPE_SEQUENCE, TK_IF, PIPELINE, 0},
{PIPE_SEQUENCE, TK_ELIF, PIPELINE, 0},
{PIPE_SEQUENCE, TK_THEN, PIPELINE, 0},
{PIPE_SEQUENCE, TK_ELSE, PIPELINE, 0},
{PIPE_SEQUENCE, COMPOUND_LIST, PIPELINE, 0},
{PIPELINE, TK_WHILE, AND_OR, 0},
{PIPELINE, TK_DO, AND_OR, 0},
{PIPELINE, TK_IF, AND_OR, 0},
{PIPELINE, TK_ELIF, AND_OR, 0},
{PIPELINE, TK_THEN, AND_OR, 0},
{PIPELINE, TK_ELSE, AND_OR, 0},
{PIPELINE, COMPOUND_LIST, AND_OR, 0},
{PIPELINE, LINEBREAK, AND_OR, 0},
// {PIPELINE, LINEBREAK, AND_OR, AND_OR},
@ -194,6 +199,7 @@ t_aggrematch g_aggrematch[] =
{AND_OR, TK_IF, COMPOUND_LIST, 0},
{AND_OR, TK_ELIF, COMPOUND_LIST, 0},
{AND_OR, TK_THEN, COMPOUND_LIST, 0},
{AND_OR, TK_ELSE, COMPOUND_LIST, 0},
{AND_OR, COMPOUND_LIST, COMPOUND_LIST, 0},
{AND_OR, SEPARATOR_OP, LIST, LIST},
{AND_OR, NEWLINE_LIST, LIST, 0},

View file

@ -170,7 +170,14 @@ t_stackmatch g_stackmatch[] =
{TK_IF, SEPARATOR_OP},
{TK_IF, NEWLINE_LIST},
{TK_IF, PIPE_SEMI_SEQUENCE},
{TK_IF, TK_WHILE},
{TK_IF, TK_IF},
{TK_IF, TK_DO},
{TK_IF, TK_ELIF},
{TK_IF, TK_THEN},
{TK_IF, COMPOUND_LIST},
{TK_THEN, COMPOUND_LIST},
{TK_THEN, CMD_SUPERIOR},
{TK_ELSE, COMPOUND_LIST},
{TK_ELIF, COMPOUND_LIST},
{TK_FI, ELSE_PART},
@ -200,6 +207,9 @@ t_stackmatch g_stackmatch[] =
{TK_WHILE, TK_DO},
{TK_WHILE, TK_WHILE},
{TK_WHILE, COMPOUND_LIST},
{TK_WHILE, TK_IF},
{TK_WHILE, TK_ELIF},
{TK_WHILE, TK_THEN},
{TK_UNTIL, LINEBREAK},
{TK_UNTIL, TK_BANG},
{TK_UNTIL, SEPARATOR_OP},
@ -247,6 +257,10 @@ t_stackmatch g_stackmatch[] =
{END_COMMAND, PIPE_SEMI_SEQUENCE},
{END_COMMAND, TK_WHILE},
{END_COMMAND, TK_DO},
{END_COMMAND, TK_IF},
{END_COMMAND, TK_THEN},
{END_COMMAND, TK_ELIF},
{END_COMMAND, TK_ELSE},
{END_COMMAND, LINEBREAK},
{END_COMMAND, COMPOUND_LIST},
{SEPARATOR, CMD_SUPERIOR},
@ -272,6 +286,10 @@ t_stackmatch g_stackmatch[] =
{LINEBREAK, PROGRAM},
{NEWLINE_LIST, TK_DO},
{NEWLINE_LIST, TK_WHILE},
{NEWLINE_LIST, TK_IF},
{NEWLINE_LIST, TK_ELIF},
{NEWLINE_LIST, TK_THEN},
{NEWLINE_LIST, TK_ELSE},
{NEWLINE_LIST, CMD_NAME},
{NEWLINE_LIST, NEWLINE_LIST},
{NEWLINE_LIST, NAME},
@ -341,10 +359,18 @@ t_stackmatch g_stackmatch[] =
{CMD_NAME, AND_OR_MAJOR},
{CMD_NAME, TK_WHILE},
{CMD_NAME, TK_DO},
{CMD_NAME, TK_IF},
{CMD_NAME, TK_ELIF},
{CMD_NAME, TK_THEN},
{CMD_NAME, TK_ELSE},
{CMD_NAME, COMPOUND_LIST},
{CMD_SUPERIOR, TK_WHILE},
{CMD_SUPERIOR, TK_DO},
{CMD_SUPERIOR, TK_IF},
{CMD_SUPERIOR, TK_ELIF},
{CMD_SUPERIOR, TK_THEN},
{CMD_SUPERIOR, TK_ELSE},
{CMD_SUPERIOR, COMPOUND_LIST},
{CMD_SUPERIOR, LINEBREAK,},
{CMD_SUPERIOR, TK_BANG},
@ -356,6 +382,10 @@ t_stackmatch g_stackmatch[] =
{SIMPLE_COMMAND, TK_WHILE},
{SIMPLE_COMMAND, TK_DO},
{SIMPLE_COMMAND, TK_IF},
{SIMPLE_COMMAND, TK_ELIF},
{SIMPLE_COMMAND, TK_THEN},
{SIMPLE_COMMAND, TK_ELSE},
{SIMPLE_COMMAND, COMPOUND_LIST},
{SIMPLE_COMMAND, LINEBREAK},
{SIMPLE_COMMAND, TK_BANG},
@ -397,6 +427,10 @@ t_stackmatch g_stackmatch[] =
{WHILE_CLAUSE, PIPE_SEMI_SEQUENCE},
{WHILE_CLAUSE, TK_DO},
{WHILE_CLAUSE, TK_WHILE},
{WHILE_CLAUSE, TK_IF},
{WHILE_CLAUSE, TK_ELIF},
{WHILE_CLAUSE, TK_THEN},
{WHILE_CLAUSE, TK_ELSE},
{WHILE_CLAUSE, COMPOUND_LIST},
{ELSE_PART, COMPOUND_LIST},
{IF_CLAUSE, LINEBREAK},
@ -404,6 +438,13 @@ t_stackmatch g_stackmatch[] =
{IF_CLAUSE, SEPARATOR_OP},
{IF_CLAUSE, NEWLINE_LIST},
{IF_CLAUSE, PIPE_SEMI_SEQUENCE},
{IF_CLAUSE, TK_DO},
{IF_CLAUSE, TK_WHILE},
{IF_CLAUSE, TK_IF},
{IF_CLAUSE, TK_ELIF},
{IF_CLAUSE, TK_THEN},
{IF_CLAUSE, TK_ELSE},
{PATTERN, TK_PAREN_OPEN},
{PATTERN, CASE_LIST},
{PATTERN_CASE, CASE_LIST},
@ -434,6 +475,8 @@ t_stackmatch g_stackmatch[] =
{COMPOUND_LIST, TK_ELIF},
{COMPOUND_LIST, TK_ELSE},
{COMPOUND_LIST, TK_IF},
{COMPOUND_LIST, TK_THEN},
{COMPOUND_LIST, TK_ELSE},
{COMPOUND_LIST, COMPOUND_LIST},
{SUBSHELL, LINEBREAK},
{SUBSHELL, TK_BANG},
@ -448,10 +491,18 @@ t_stackmatch g_stackmatch[] =
{COMPOUND_COMMAND, FUNC},
{COMPOUND_COMMAND, TK_DO},
{COMPOUND_COMMAND, TK_WHILE},
{COMPOUND_COMMAND, TK_IF},
{COMPOUND_COMMAND, TK_ELIF},
{COMPOUND_COMMAND, TK_THEN},
{COMPOUND_COMMAND, TK_ELSE},
{COMPOUND_COMMAND, COMPOUND_LIST},
{COMMAND, TK_WHILE},
{COMMAND, LINEBREAK},
{COMMAND, TK_DO},
{COMMAND, TK_IF},
{COMMAND, TK_ELIF},
{COMMAND, TK_THEN},
{COMMAND, TK_ELSE},
{COMMAND, COMPOUND_LIST},
{COMMAND, TK_BANG},
{COMMAND, SEPARATOR_OP},
@ -463,6 +514,10 @@ t_stackmatch g_stackmatch[] =
{AND_OR_MINOR, AND_OR_MAJOR},
{PIPE_SEQUENCE, TK_WHILE},
{PIPE_SEQUENCE, TK_DO},
{PIPE_SEQUENCE, TK_IF},
{PIPE_SEQUENCE, TK_ELIF},
{PIPE_SEQUENCE, TK_THEN},
{PIPE_SEQUENCE, TK_ELSE},
{PIPE_SEQUENCE, COMPOUND_LIST},
{PIPE_SEQUENCE, LINEBREAK},
{PIPE_SEQUENCE, TK_BANG},
@ -471,6 +526,10 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEQUENCE, AND_OR_MAJOR},
{PIPE_SEMI_SEQUENCE, TK_WHILE},
{PIPE_SEMI_SEQUENCE, TK_DO},
{PIPE_SEMI_SEQUENCE, TK_IF},
{PIPE_SEMI_SEQUENCE, TK_ELIF},
{PIPE_SEMI_SEQUENCE, TK_THEN},
{PIPE_SEMI_SEQUENCE, TK_ELSE},
{PIPE_SEMI_SEQUENCE, COMPOUND_LIST},
{PIPE_SEMI_SEQUENCE, LINEBREAK},
{PIPE_SEMI_SEQUENCE, TK_BANG},
@ -479,6 +538,10 @@ t_stackmatch g_stackmatch[] =
{PIPE_SEMI_SEQUENCE, AND_OR_MAJOR},
{PIPELINE, TK_WHILE},
{PIPELINE, TK_DO},
{PIPELINE, TK_IF},
{PIPELINE, TK_ELIF},
{PIPELINE, TK_THEN},
{PIPELINE, TK_ELSE},
{PIPELINE, COMPOUND_LIST},
{PIPELINE, LINEBREAK},
{PIPELINE, SEPARATOR_OP},
@ -488,6 +551,10 @@ t_stackmatch g_stackmatch[] =
{AND_OR_MAJOR, AND_OR_MAJOR},
{AND_OR, TK_DO},
{AND_OR, TK_WHILE},
{AND_OR, TK_IF},
{AND_OR, TK_ELIF},
{AND_OR, TK_THEN},
{AND_OR, TK_ELSE},
{AND_OR, COMPOUND_LIST},
{AND_OR, LINEBREAK},
{AND_OR, SEPARATOR_OP},

View file

@ -34,6 +34,7 @@ t_prodmatch g_prodmatch[] =
{TK_N_WORD, TK_IF, CMD_NAME},
{TK_N_WORD, TK_THEN, CMD_NAME},
{TK_N_WORD, TK_ELIF, CMD_NAME},
{TK_N_WORD, TK_ELSE, CMD_NAME},
{TK_N_WORD, COMPOUND_LIST, CMD_NAME},
{TK_N_WORD, NEWLINE_LIST, CMD_NAME},
@ -58,6 +59,7 @@ t_prodmatch g_prodmatch[] =
{TK_NEWLINE, TK_FI, NEWLINE_LIST},
{TK_NEWLINE, TK_ELIF, NEWLINE_LIST},
{TK_NEWLINE, TK_ELSE, NEWLINE_LIST},
{TK_NEWLINE, TK_THEN, NEWLINE_LIST},
{TK_NEWLINE, CMD_NAME, NEWLINE_LIST},
{TK_NEWLINE, COMPLETE_COMMANDS, NEWLINE_LIST},
{TK_NEWLINE, LINEBREAK, NEWLINE_LIST},

View file

@ -14,6 +14,12 @@
char *read_state(t_sym current)
{
if (current == TK_ELSE)
return ("TK_ELSE");
if (current == TK_FI)
return ("TK_FI");
if (current == ELSE_PART)
return ("ELSE_PART");
if (current == TK_FI)
return ("TK_FI");
if (current == TK_IF)

4
42sh/test.sh Normal file
View file

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