From 6601e2111f9c0a09ad7b6105d1362b35e9321e73 Mon Sep 17 00:00:00 2001 From: AntoHesse Date: Sun, 12 Feb 2017 04:09:36 +0100 Subject: [PATCH] moar moar grammar --- 42sh/includes/parser.h | 2 ++ 42sh/src/parser/aggregate_sym.c | 21 +++++++++++-- 42sh/src/parser/eval_sym.c | 55 ++++++++++++++++++++++++++++++++- 42sh/src/parser/produce_sym.c | 2 +- 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index ba7226e3..d15dc7a9 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -61,6 +61,8 @@ enum e_sym TK_CASE, TK_LBRACE, TK_IN, + TK_CASE, + TK_ESAC, PROGRAM = 100, COMPLETE_COMMANDS, LIST, diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c index 41cb395f..35b9ea4d 100644 --- a/42sh/src/parser/aggregate_sym.c +++ b/42sh/src/parser/aggregate_sym.c @@ -23,8 +23,25 @@ t_aggrematch g_aggrematch[] = {ELSE_PART, TK_FI, IF_CLAUSE}, {COMPOUND_LIST, TK_FI, IF_CLAUSE}, - {TK_COMPOUND_LIST, TK_DONE, DO_GROUP}, - {TK_COMPOUND_LIST, TK_RBRACE, BRACE_GROUP}, + {COMPOUND_LIST, TK_DONE, DO_GROUP}, + {COMPOUND_LIST, TK_RBRACE, BRACE_GROUP}, + + {TK_PAREN_CLOSE, COMPOUND_LIST, SUBSHELL, 2}, + +//watch this + {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, 1}, + + {LINEBREAK, TK_SEMI, SEPARATOR_OP, 1}, +//prediction one + {LINEBREAK, TK_PAREN_CLOSE, TK_ESAC, CASE_ITEM_NS, tant que pattern ou '('}, + + {NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, ALL, tant que newline}, + {NEWLINE_LIST, NAME, SEPARATOR_SEP, ALL, 0}, + {NEWlINE_LIST, IN, SEPARATOR_SEP, ALL, 0}, + {NEWLINE_LIST, WORDLIST, SEPARATOR_SEP, ALL, 0}, + {NEWLINE_LIST, TERM, SEPARATOR, ALL, 0}, + {NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, ALL, 0}, + {0, 0, 0}, int aggregate_sym(t_sym **stack, t_sym *new_sym) diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index ff6c7761..72313720 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -170,7 +170,60 @@ t_stackmatch g_stackmatch[] = {TK_BANG, SEPARATOR_OP}, {TK_BANG, NEWLINE_LIST}, - {TK_IN, LINEBREAK}, + {TK_IN, LINEBREAK}, + + {TK_SEMI, NAME}, + {TK_SEMI, IN}, + {TK_SEMI, WORDLIST}, + {TK_SEMI, LIST}, + {TK_SEMI, TERM}, + + {TK_AMP, LIST}, + {TK_AMP, TERM}, + + {TK_PIPE, PATTERN}, + {TK_PIPE, PIPE_SEQUENCE}, + + {TK_PAREN_OPEN, FNAME}, + {TK_PAREN_OPEN, CASE_LIST}, + {TK_PAREN_OPEN, LINEBREAK}, + {TK_PAREN_OPEN, TK_BANG}, + {TK_PAREN_OPEN, SEPARATOR_OP}, + {TK_PAREN_OPEN, NEWLINE_LIST}, + + {TK_PAREN_CLOSE, TK_PAREN_OPEN}, + {TK_PAREN_CLOSE, PATTERN}, + {TK_PAREN_CLOSE, COMPOUND_LIST}, + + {SEQUENTIAL_SEP, NAME}, + {SEQUENTIAL_SEP, IN}, + {SEQUENTIAL_SEP, WORDLIST}, + + {SEPARATOR, TERM}, + {SEPARATOR, COMPOUND_LIST}, + + {SEPARATOR_OP, LIST}, + {SEPARATOR_OP, TERM}, + {SEPARATOR_OP, COMPOUND_LIST}, + + {LINEBREAK, TK_SEMI}, + {LINEBREAK, TK_PAREN_CLOSE}, + {LINEBREAK, WORD}, + {LINEBREAK, IN}, + {LINEBREAK, TK_AND_IF}, + {LINEBREAK, TK_OR_IF}, + {LINEBREAK, TK_PIPE}, + {LINEBREAK, LINEBREAK}, + {LINEBREAK, COMPLETECOMMANDS}, + + {NEWLINE_LIST, NEWLINE_LIST}, + {NEWLINE_LIST, NAME}, + {NEWLINE_LIST, IN}, + {NEWLINE_LIST, WORDLIST}, + {NEWLINE_LIST, TERM}, + {NEWLINE_LIST, COMPOUND_LIST}, + {NEWLINE_LIST, COMPLETE_COMMANDS}, + {0, 0}, }; diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c index ef44af73..112ada0f 100644 --- a/42sh/src/parser/produce_sym.c +++ b/42sh/src/parser/produce_sym.c @@ -28,7 +28,7 @@ t_prodmatch g_prodmatch[] = {TK_WORD, LINEBREAK, CMD_NAME}, {TK_WORD, NEWLINE_LIST, CMD_NAME}, {TK_WORD, IN, WORDLIST}, -// {{TK_WORD, CASE_LIST, PATTERN}, rule 4 ? + {{TK_WORD, CASE_LIST, PATTERN}, {TK_WORD, TK_PAREN_OPEN, PATTERN}, {TK_ASSIGNEMENT_WORD, LINEBREAK, CMD_PREFIX},