diff options
Diffstat (limited to 'parse.y')
| -rw-r--r-- | parse.y | 19 |
1 files changed, 14 insertions, 5 deletions
@@ -16,10 +16,12 @@ Node *parsetree; /* not using yylval because bison declares it as an auto */ %token ANDAND BACKBACK BANG CASE COUNT DUP ELSE END FLAT FN FOR IF IN %token OROR PIPE REDIR SREDIR SUB SUBSHELL SWITCH TWIDDLE WHILE WORD HUH +%left '^' '=' %left WHILE ')' ELSE %left ANDAND OROR '\n' %left BANG SUBSHELL %left PIPE +%left PREDIR /* fictitious */ %right '$' %left SUB /* @@ -41,6 +43,7 @@ Node *parsetree; /* not using yylval because bison declares it as an auto */ %type <keyword> keyword %type <node> assign body brace case cbody cmd cmdsa cmdsan comword epilog first line nlwords paren redir sword simple iftail word words + arg args %start rc @@ -72,7 +75,7 @@ brace : '{' body '}' { $$ = $2; } paren : '(' body ')' { $$ = $2; } -assign : first '=' word { $$ = mk(nAssign,$1,$3); } +assign : first optcaret '=' optcaret word { $$ = mk(nAssign,$1,$5); } epilog : { $$ = NULL; } | redir epilog { $$ = mk(nEpilog,$1,$2); } @@ -108,19 +111,24 @@ cmd : /* empty */ %prec WHILE { $$ = NULL; } | cmd ANDAND optnl cmd { $$ = mk(nAndalso,$1,$4); } | cmd OROR optnl cmd { $$ = mk(nOrelse,$1,$4); } | cmd PIPE optnl cmd { $$ = mk(nPipe,$2.left,$2.right,$1,$4); } - | redir cmd %prec BANG { $$ = ($2 != NULL ? mk(nPre,$1,$2) : $1); } + | redir cmd %prec PREDIR { $$ = ($2 != NULL ? mk(nPre,$1,$2) : $1); } | assign cmd %prec BANG { $$ = ($2 != NULL ? mk(nPre,$1,$2) : $1); } | BANG optcaret cmd { $$ = mk(nBang,$3); } | SUBSHELL optcaret cmd { $$ = mk(nSubshell,$3); } | FN words brace { $$ = mk(nNewfn,$2,$3); } | FN words { $$ = mk(nRmfn,$2); } -optcaret : /* empty */ +optcaret : /* empty */ %prec '^' | '^' simple : first - | simple word { $$ = ($2 != NULL ? mk(nArgs,$1,$2) : $1); } - | simple redir { $$ = mk(nArgs,$1,$2); } + | first args { $$ = ($2 != NULL ? mk(nArgs,$1,$2) : $1); } + +args : arg + | args arg { $$ = ($2 != NULL ? mk(nArgs,$1,$2) : $1); } + +arg : word + | redir first : comword | first '^' sword { $$ = mk(nConcat,$1,$3); } @@ -154,6 +162,7 @@ keyword : FOR { $$ = "for"; } | TWIDDLE { $$ = "~"; } | BANG { $$ = "!"; } | SUBSHELL { $$ = "@"; } + | '=' { $$ = "="; } words : { $$ = NULL; } | words word { $$ = ($1 != NULL ? ($2 != NULL ? mk(nLappend,$1,$2) : $1) : $2); } |