|
|
1.1 ! root 1: %term FOR IN WHILE IF NOT TWIDDLE BANG SUBSHELL SWITCH FN ! 2: %term WORD REDIR DUP PIPE SUB ! 3: %term SIMPLE ARGLIST WORDS BRACE PAREN PCMD PIPEFD /* not used in syntax */ ! 4: /* operator priorities -- lowest first */ ! 5: %left IF WHILE FOR SWITCH ')' NOT ! 6: %left ANDAND OROR ! 7: %left BANG SUBSHELL ! 8: %left PIPE ! 9: %left '^' ! 10: %right '$' COUNT '"' ! 11: %left SUB ! 12: %{ ! 13: #include "rc.h" ! 14: #include "fns.h" ! 15: %} ! 16: %union{ ! 17: struct tree *tree; ! 18: }; ! 19: %type<tree> line paren brace body cmdsa cmdsan assign epilog redir ! 20: %type<tree> cmd simple first word comword keyword words ! 21: %type<tree> NOT FOR IN WHILE IF TWIDDLE BANG SUBSHELL SWITCH FN ! 22: %type<tree> WORD REDIR DUP PIPE ! 23: %% ! 24: rc: { return 1;} ! 25: | line '\n' {return !compile($1);} ! 26: line: cmd ! 27: | cmdsa line {$$=tree2(';', $1, $2);} ! 28: body: cmd ! 29: | cmdsan body {$$=tree2(';', $1, $2);} ! 30: cmdsa: cmd ';' ! 31: | cmd '&' {$$=tree1('&', $1);} ! 32: cmdsan: cmdsa ! 33: | cmd '\n' ! 34: brace: '{' body '}' {$$=tree1(BRACE, $2);} ! 35: paren: '(' body ')' {$$=tree1(PCMD, $2);} ! 36: assign: first '=' word {$$=tree2('=', $1, $3);} ! 37: epilog: {$$=0;} ! 38: | redir epilog {$$=mung2($1, $1->child[0], $2);} ! 39: redir: REDIR word {$$=mung1($1, $1->rtype==HERE?heredoc($2):$2);} ! 40: | DUP ! 41: cmd: {$$=0;} ! 42: | brace epilog {$$=epimung($1, $2);} ! 43: | IF paren {skipnl();} cmd ! 44: {$$=mung2($1, $2, $4);} ! 45: | IF NOT {skipnl();} cmd {$$=mung1($2, $4);} ! 46: | FOR '(' word IN words ')' {skipnl();} cmd ! 47: {$$=mung3($1, $3, tree1(PAREN, $5), $8);} ! 48: | FOR '(' word ')' {skipnl();} cmd ! 49: {$$=mung3($1, $3, (struct tree *)0, $6);} ! 50: | WHILE paren {skipnl();} cmd ! 51: {$$=mung2($1, $2, $4);} ! 52: | SWITCH word {skipnl();} brace ! 53: {$$=tree2(SWITCH, $2, $4);} ! 54: | simple {$$=simplemung($1);} ! 55: | TWIDDLE word words {$$=mung2($1, $2, $3);} ! 56: | cmd ANDAND cmd {$$=tree2(ANDAND, $1, $3);} ! 57: | cmd OROR cmd {$$=tree2(OROR, $1, $3);} ! 58: | cmd PIPE cmd {$$=mung2($2, $1, $3);} ! 59: | redir cmd %prec BANG {$$=mung2($1, $1->child[0], $2);} ! 60: | assign cmd %prec BANG {$$=mung3($1, $1->child[0], $1->child[1], $2);} ! 61: | BANG cmd {$$=mung1($1, $2);} ! 62: | SUBSHELL cmd {$$=mung1($1, $2);} ! 63: | FN words brace {$$=tree2(FN, $2, $3);} ! 64: | FN words {$$=tree1(FN, $2);} ! 65: simple: first ! 66: | simple word {$$=tree2(ARGLIST, $1, $2);} ! 67: | simple redir {$$=tree2(ARGLIST, $1, $2);} ! 68: first: comword ! 69: | first '^' word {$$=tree2('^', $1, $3);} ! 70: word: keyword {$1->type=WORD;} ! 71: | comword ! 72: | word '^' word {$$=tree2('^', $1, $3);} ! 73: comword: '$' word {$$=tree1('$', $2);} ! 74: | '$' word SUB words ')' {$$=tree2(SUB, $2, $4);} ! 75: | '"' word {$$=tree1('"', $2);} ! 76: | COUNT word {$$=tree1(COUNT, $2);} ! 77: | WORD ! 78: | '`' brace {$$=tree1('`', $2);} ! 79: | '(' words ')' {$$=tree1(PAREN, $2);} ! 80: | REDIR brace {$$=mung1($1, $2); $$->type=PIPEFD;} ! 81: keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN ! 82: words: {$$=0;} ! 83: | words word {$$=tree2(WORDS, $1, $2);}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.