Blame


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