From 40f4c7305a041d4214df117491593898d04d0134 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 26 Oct 2021 10:26:17 -0700 Subject: proto(rc): control structures --- sys/cmd/rc/syntax.y | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'sys/cmd/rc/syntax.y') diff --git a/sys/cmd/rc/syntax.y b/sys/cmd/rc/syntax.y index f3c9f29..58bef16 100644 --- a/sys/cmd/rc/syntax.y +++ b/sys/cmd/rc/syntax.y @@ -1,4 +1,4 @@ -%token Tfor Tin Twhile Tif Telse Tswitch Ttwiddle Tbang Tsubshell Tfunc +%token Tfor Tin Twhile Tif Telse Tswitch Tcase Tcasebody Ttwiddle Tbang Tsubshell Tfunc %token Tredir Tdup Tpipe Tindex %token Tbasic Targs Tword Twords Tparen Tblock @@ -12,7 +12,7 @@ %} /* operator precendence: lowest first */ -%left Tif Tfor Tswitch ')' Twhile Telse +%left Tif Tfor Tswitch Tcase ')' Twhile Telse %left Tandand Toror '\n' %left Tbang Tsubshell %left Tpipe; @@ -24,9 +24,9 @@ %union{ struct Tree *tree; } -%type line cmds cmdsln body paren block ifbody assign epilog redir; +%type line cmds cmdsln body paren block ifbody casebody case assign epilog redir; %type cmd basic executable nonkeyword keyword word words wordsnl atom; -%type Tfor Tin Twhile Tif Telse Tswitch Ttwiddle Tbang Tsubshell Tfunc; +%type Tfor Tin Twhile Tif Telse Tswitch Tcase Ttwiddle Tbang Tsubshell Tfunc; %type Tword Tredir Tpipe Tdup; /* grammar */ @@ -64,6 +64,15 @@ ifbody: cmd %prec Telse { $$ = maketree2(Tif, nil, $1); } | block Telse nl cmd { $$ = maketree3(Tif, nil, $1, $2); } +case: + Tcase words ';' { $$ = hangchild1($1, $2, 0); } +| Tcase words '\n' { $$ = hangchild1($1, $2, 0); } + +casebody: + cmd { $$ = maketree2(Tcasebody, $1, nil); } +| case casebody { $$ = maketree2(Tcasebody, $1, $2); } +| cmdsln casebody { $$ = maketree2(Tcasebody, $1, $2); } + assign: executable '=' word { $$ = maketree2('=', $1, $3); } @@ -76,17 +85,21 @@ epilog: | redir epilog { $$ = hangchild1($1, $2, 1); } cmd: -/* empty */ %prec Twhile { $$ = nil; } -| basic { $$ = maketree1(Tbasic, $1); } -| block epilog { $$ = hangepilog($1, $2); } -| cmd Tpipe nl cmd { $$ = hangchild2($2, $1, 0, $4, 1); } -| cmd Tandand nl cmd { $$ = maketree2(Tandand, $1, $4); } -| cmd Toror nl cmd { $$ = maketree2(Toror, $1, $4); } -| redir cmd %prec Tbang { $$ = hangchild1($1, $2, 1); } -| assign cmd %prec Tbang { $$ = hangchild1($1, $2, 2); } -| Tbang cmd { $$ = maketree1(Tbang, $2); } -| Tsubshell cmd { $$ = maketree1(Tsubshell, $2); } -| Tif paren nl ifbody { $$ = hangchild1($2, $1, 0); } +/* empty */ %prec Twhile { $$ = nil; } +| basic { $$ = maketree1(Tbasic, $1); } +| block epilog { $$ = hangepilog($1, $2); } +| cmd Tpipe nl cmd { $$ = hangchild2($2, $1, 0, $4, 1); } +| cmd Tandand nl cmd { $$ = maketree2(Tandand, $1, $4); } +| cmd Toror nl cmd { $$ = maketree2(Toror, $1, $4); } +| redir cmd %prec Tbang { $$ = hangchild1($1, $2, 1); } +| assign cmd %prec Tbang { $$ = hangchild1($1, $2, 2); } +| Tbang cmd { $$ = maketree1(Tbang, $2); } +| Tsubshell cmd { $$ = maketree1(Tsubshell, $2); } +| Tfor '(' word ')' nl cmd { $$ = hangchild3($1, $3, nil, $6); } +| Tfor '(' word Tin words ')' nl cmd { $$ = hangchild3($1, $3, $5, $8); } +| Twhile paren nl cmd { $$ = hangchild2($1, $2, 0, $4, 1); } +| Tif paren nl ifbody { $$ = hangchild1($2, $1, 0); } +| Tswitch '(' word ')' nl '{' casebody '}' { $$ = hangchild2($1, $3, 0, $7, 1); } basic: executable @@ -113,11 +126,10 @@ nonkeyword: | Tcount atom { $$ = maketree1(Tcount, $2); } | Tjoin atom { $$ = maketree1(Tjoin, $2); } | '`' block { $$ = maketree1('`', $2); } -//| '(' words ')' { $$ = maketree1(Tparen, $2); } //| Tredir block { $$ = hangchild1($1, $2, 0); $$->type = Tpipefd; } keyword: - Tin|Tfor|Twhile|Tif|Telse|Tswitch|Tbang|Tsubshell|Tfunc + Tin|Tfor|Twhile|Tif|Telse|Tswitch|Tcase|Tbang|Tsubshell|Tfunc words: /* empty */ { $$ = nil; } @@ -131,4 +143,5 @@ wordsnl: nl: /*empty*/ | nl '\n' + %% -- cgit v1.2.1