Blame


1 dda0695d 2003-11-23 devnull %term FOR IN WHILE IF NOT TWIDDLE BANG SUBSHELL SWITCH FN
2 dda0695d 2003-11-23 devnull %term WORD REDIR DUP PIPE SUB
3 dda0695d 2003-11-23 devnull %term SIMPLE ARGLIST WORDS BRACE PAREN PCMD PIPEFD /* not used in syntax */
4 dda0695d 2003-11-23 devnull /* operator priorities -- lowest first */
5 aec641d2 2006-06-27 devnull %left LOW
6 dda0695d 2003-11-23 devnull %left IF WHILE FOR SWITCH ')' NOT
7 dda0695d 2003-11-23 devnull %left ANDAND OROR
8 dda0695d 2003-11-23 devnull %left BANG SUBSHELL
9 dda0695d 2003-11-23 devnull %left PIPE
10 dda0695d 2003-11-23 devnull %left '^'
11 f063dad9 2004-02-29 devnull %right '$' COUNT '"'
12 dda0695d 2003-11-23 devnull %left SUB
13 aec641d2 2006-06-27 devnull %left '='
14 dda0695d 2003-11-23 devnull %{
15 dda0695d 2003-11-23 devnull #include "rc.h"
16 dda0695d 2003-11-23 devnull #include "fns.h"
17 dda0695d 2003-11-23 devnull %}
18 dda0695d 2003-11-23 devnull %union{
19 dda0695d 2003-11-23 devnull struct tree *tree;
20 dda0695d 2003-11-23 devnull };
21 dda0695d 2003-11-23 devnull %type<tree> line paren brace body cmdsa cmdsan assign epilog redir
22 dda0695d 2003-11-23 devnull %type<tree> cmd simple first word comword keyword words
23 dda0695d 2003-11-23 devnull %type<tree> NOT FOR IN WHILE IF TWIDDLE BANG SUBSHELL SWITCH FN
24 dda0695d 2003-11-23 devnull %type<tree> WORD REDIR DUP PIPE
25 dda0695d 2003-11-23 devnull %%
26 dda0695d 2003-11-23 devnull rc: { return 1;}
27 dda0695d 2003-11-23 devnull | line '\n' {return !compile($1);}
28 dda0695d 2003-11-23 devnull line: cmd
29 dda0695d 2003-11-23 devnull | cmdsa line {$$=tree2(';', $1, $2);}
30 dda0695d 2003-11-23 devnull body: cmd
31 dda0695d 2003-11-23 devnull | cmdsan body {$$=tree2(';', $1, $2);}
32 dda0695d 2003-11-23 devnull cmdsa: cmd ';'
33 dda0695d 2003-11-23 devnull | cmd '&' {$$=tree1('&', $1);}
34 dda0695d 2003-11-23 devnull cmdsan: cmdsa
35 dda0695d 2003-11-23 devnull | cmd '\n'
36 dda0695d 2003-11-23 devnull brace: '{' body '}' {$$=tree1(BRACE, $2);}
37 dda0695d 2003-11-23 devnull paren: '(' body ')' {$$=tree1(PCMD, $2);}
38 dda0695d 2003-11-23 devnull assign: first '=' word {$$=tree2('=', $1, $3);}
39 dda0695d 2003-11-23 devnull epilog: {$$=0;}
40 dda0695d 2003-11-23 devnull | redir epilog {$$=mung2($1, $1->child[0], $2);}
41 dda0695d 2003-11-23 devnull redir: REDIR word {$$=mung1($1, $1->rtype==HERE?heredoc($2):$2);}
42 dda0695d 2003-11-23 devnull | DUP
43 dda0695d 2003-11-23 devnull cmd: {$$=0;}
44 dda0695d 2003-11-23 devnull | brace epilog {$$=epimung($1, $2);}
45 dda0695d 2003-11-23 devnull | IF paren {skipnl();} cmd
46 dda0695d 2003-11-23 devnull {$$=mung2($1, $2, $4);}
47 dda0695d 2003-11-23 devnull | IF NOT {skipnl();} cmd {$$=mung1($2, $4);}
48 dda0695d 2003-11-23 devnull | FOR '(' word IN words ')' {skipnl();} cmd
49 dda0695d 2003-11-23 devnull /*
50 dda0695d 2003-11-23 devnull * if ``words'' is nil, we need a tree element to distinguish between
51 dda0695d 2003-11-23 devnull * for(i in ) and for(i), the former being a loop over the empty set
52 dda0695d 2003-11-23 devnull * and the latter being the implicit argument loop. so if $5 is nil
53 dda0695d 2003-11-23 devnull * (the empty set), we represent it as "()". don't parenthesize non-nil
54 dda0695d 2003-11-23 devnull * functions, to avoid growing parentheses every time we reread the
55 dda0695d 2003-11-23 devnull * definition.
56 dda0695d 2003-11-23 devnull */
57 dda0695d 2003-11-23 devnull {$$=mung3($1, $3, $5 ? $5 : tree1(PAREN, $5), $8);}
58 dda0695d 2003-11-23 devnull | FOR '(' word ')' {skipnl();} cmd
59 dda0695d 2003-11-23 devnull {$$=mung3($1, $3, (struct tree *)0, $6);}
60 dda0695d 2003-11-23 devnull | WHILE paren {skipnl();} cmd
61 dda0695d 2003-11-23 devnull {$$=mung2($1, $2, $4);}
62 dda0695d 2003-11-23 devnull | SWITCH word {skipnl();} brace
63 dda0695d 2003-11-23 devnull {$$=tree2(SWITCH, $2, $4);}
64 dda0695d 2003-11-23 devnull | simple {$$=simplemung($1);}
65 dda0695d 2003-11-23 devnull | TWIDDLE word words {$$=mung2($1, $2, $3);}
66 dda0695d 2003-11-23 devnull | cmd ANDAND cmd {$$=tree2(ANDAND, $1, $3);}
67 dda0695d 2003-11-23 devnull | cmd OROR cmd {$$=tree2(OROR, $1, $3);}
68 dda0695d 2003-11-23 devnull | cmd PIPE cmd {$$=mung2($2, $1, $3);}
69 dda0695d 2003-11-23 devnull | redir cmd %prec BANG {$$=mung2($1, $1->child[0], $2);}
70 dda0695d 2003-11-23 devnull | assign cmd %prec BANG {$$=mung3($1, $1->child[0], $1->child[1], $2);}
71 dda0695d 2003-11-23 devnull | BANG cmd {$$=mung1($1, $2);}
72 dda0695d 2003-11-23 devnull | SUBSHELL cmd {$$=mung1($1, $2);}
73 dda0695d 2003-11-23 devnull | FN words brace {$$=tree2(FN, $2, $3);}
74 dda0695d 2003-11-23 devnull | FN words {$$=tree1(FN, $2);}
75 dda0695d 2003-11-23 devnull simple: first
76 dda0695d 2003-11-23 devnull | simple word {$$=tree2(ARGLIST, $1, $2);}
77 dda0695d 2003-11-23 devnull | simple redir {$$=tree2(ARGLIST, $1, $2);}
78 dda0695d 2003-11-23 devnull first: comword
79 dda0695d 2003-11-23 devnull | first '^' word {$$=tree2('^', $1, $3);}
80 dda0695d 2003-11-23 devnull word: keyword {lastword=1; $1->type=WORD;}
81 dda0695d 2003-11-23 devnull | comword
82 dda0695d 2003-11-23 devnull | word '^' word {$$=tree2('^', $1, $3);}
83 aec641d2 2006-06-27 devnull | word '=' word %prec LOW {$$=tree2('^', tree2('^', $1, token("=", WORD)), $3);}
84 dda0695d 2003-11-23 devnull comword: '$' word {$$=tree1('$', $2);}
85 dda0695d 2003-11-23 devnull | '$' word SUB words ')' {$$=tree2(SUB, $2, $4);}
86 dda0695d 2003-11-23 devnull | '"' word {$$=tree1('"', $2);}
87 dda0695d 2003-11-23 devnull | COUNT word {$$=tree1(COUNT, $2);}
88 dda0695d 2003-11-23 devnull | WORD
89 dda0695d 2003-11-23 devnull | '`' brace {$$=tree1('`', $2);}
90 dda0695d 2003-11-23 devnull | '(' words ')' {$$=tree1(PAREN, $2);}
91 dda0695d 2003-11-23 devnull | REDIR brace {$$=mung1($1, $2); $$->type=PIPEFD;}
92 dda0695d 2003-11-23 devnull keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN
93 dda0695d 2003-11-23 devnull words: {$$=(struct tree*)0;}
94 dda0695d 2003-11-23 devnull | words word {$$=tree2(WORDS, $1, $2);}