summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y19
1 files changed, 14 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index 8be65bb..276961a 100644
--- a/parse.y
+++ b/parse.y
@@ -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); }