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

@ -1,13 +1,11 @@
if ls if ls
then then
pwd pwd
elif ls elif ls
then then
pwd pwd
elif ls elif ls
then then
pwd pwd
else ls else ls
then
pwd
fi fi

View file

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

View file

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

View file

@ -14,6 +14,12 @@
char *read_state(t_sym current) 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) if (current == TK_FI)
return ("TK_FI"); return ("TK_FI");
if (current == TK_IF) if (current == TK_IF)

4
42sh/test.sh Normal file
View file

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