From fea9429e9f76352370b9115fc5fb45e4692c0943 Mon Sep 17 00:00:00 2001 From: AntoHesse Date: Mon, 20 Feb 2017 01:05:11 +0100 Subject: [PATCH] more if elif then else grammar --- 42sh/sample/if.sh | 4 +- 42sh/src/parser/aggregate_sym.c | 8 +++- 42sh/src/parser/eval_sym.c | 69 ++++++++++++++++++++++++++++++++- 42sh/src/parser/produce_sym.c | 2 + 42sh/src/parser/read_stack.c | 6 +++ 42sh/test.sh | 4 ++ 6 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 42sh/test.sh diff --git a/42sh/sample/if.sh b/42sh/sample/if.sh index 7e2b40d0..d5903503 100644 --- a/42sh/sample/if.sh +++ b/42sh/sample/if.sh @@ -1,13 +1,11 @@ if ls then pwd -elif ls +elif ls then pwd elif ls then pwd else ls -then - pwd fi diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 506be68a..1b876c02 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -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}, diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index 79770694..5b3f5135 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -170,9 +170,16 @@ 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_ELIF, COMPOUND_LIST}, {TK_FI, ELSE_PART}, {TK_FI, COMPOUND_LIST}, {TK_FI, CMD_SUPERIOR}, @@ -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}, diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index 1773e115..f52ff681 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -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}, diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c index a943423b..d5d0c802 100644 --- a/42sh/src/parser/read_stack.c +++ b/42sh/src/parser/read_stack.c @@ -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) diff --git a/42sh/test.sh b/42sh/test.sh new file mode 100644 index 00000000..36681fe0 --- /dev/null +++ b/42sh/test.sh @@ -0,0 +1,4 @@ +if cat yolo +then ls +else pwd +fi