aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/syntax.y
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/syntax.y')
-rw-r--r--sys/cmd/rc/syntax.y47
1 files changed, 30 insertions, 17 deletions
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<tree> line cmds cmdsln body paren block ifbody assign epilog redir;
+%type<tree> line cmds cmdsln body paren block ifbody casebody case assign epilog redir;
%type<tree> cmd basic executable nonkeyword keyword word words wordsnl atom;
-%type<tree> Tfor Tin Twhile Tif Telse Tswitch Ttwiddle Tbang Tsubshell Tfunc;
+%type<tree> Tfor Tin Twhile Tif Telse Tswitch Tcase Ttwiddle Tbang Tsubshell Tfunc;
%type<tree> 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'
+
%%