| 1 | funarglist: |
| 2 | { $$ = 0; } |
| 3 | | funargs |
| 4 | ; |
| 5 | |
| 6 | funargs: expr |
| 7 | { $$ = mkchain($1, 0); } |
| 8 | | funargs SCOMMA expr |
| 9 | { $$ = hookup($1, mkchain($3,0) ); } |
| 10 | ; |
| 11 | |
| 12 | |
| 13 | expr: uexpr |
| 14 | | SLPAR expr SRPAR { $$ = $2; } |
| 15 | | complex_const |
| 16 | ; |
| 17 | |
| 18 | uexpr: lhs |
| 19 | | simple_const |
| 20 | | expr addop expr %prec SPLUS |
| 21 | { $$ = mkexpr($2, $1, $3); } |
| 22 | | expr SSTAR expr |
| 23 | { $$ = mkexpr(OPSTAR, $1, $3); } |
| 24 | | expr SSLASH expr |
| 25 | { $$ = mkexpr(OPSLASH, $1, $3); } |
| 26 | | expr SPOWER expr |
| 27 | { $$ = mkexpr(OPPOWER, $1, $3); } |
| 28 | | addop expr %prec SSTAR |
| 29 | { if($1 == OPMINUS) |
| 30 | $$ = mkexpr(OPNEG, $2, 0); |
| 31 | else $$ = $2; |
| 32 | } |
| 33 | | expr relop expr %prec SEQ |
| 34 | { $$ = mkexpr($2, $1, $3); } |
| 35 | | expr SEQV expr |
| 36 | { $$ = mkexpr(OPEQV, $1,$3); } |
| 37 | | expr SNEQV expr |
| 38 | { $$ = mkexpr(OPNEQV, $1, $3); } |
| 39 | | expr SOR expr |
| 40 | { $$ = mkexpr(OPOR, $1, $3); } |
| 41 | | expr SAND expr |
| 42 | { $$ = mkexpr(OPAND, $1, $3); } |
| 43 | | SNOT expr |
| 44 | { $$ = mkexpr(OPNOT, $2, 0); } |
| 45 | | expr SCONCAT expr |
| 46 | { $$ = mkexpr(OPCONCAT, $1, $3); } |
| 47 | ; |
| 48 | |
| 49 | addop: SPLUS { $$ = OPPLUS; } |
| 50 | | SMINUS { $$ = OPMINUS; } |
| 51 | ; |
| 52 | |
| 53 | relop: SEQ { $$ = OPEQ; } |
| 54 | | SGT { $$ = OPGT; } |
| 55 | | SLT { $$ = OPLT; } |
| 56 | | SGE { $$ = OPGE; } |
| 57 | | SLE { $$ = OPLE; } |
| 58 | | SNE { $$ = OPNE; } |
| 59 | ; |
| 60 | |
| 61 | lhs: name |
| 62 | { $$ = mkprim($1, 0, 0, 0); } |
| 63 | | name SLPAR opt_expr SCOLON opt_expr SRPAR |
| 64 | { $$ = mkprim($1, 0, $3, $5); } |
| 65 | | name SLPAR funarglist SRPAR |
| 66 | { $$ = mkprim($1, mklist($3), 0, 0); } |
| 67 | | name SLPAR funarglist SRPAR SLPAR opt_expr SCOLON opt_expr SRPAR |
| 68 | { $$ = mkprim($1, mklist($3), $6, $8); } |
| 69 | ; |
| 70 | |
| 71 | opt_expr: |
| 72 | { $$ = 0; } |
| 73 | | expr |
| 74 | ; |
| 75 | |
| 76 | simple: name |
| 77 | { if($1->vclass == CLPARAM) |
| 78 | $$ = cpexpr($1->paramval); |
| 79 | } |
| 80 | | simple_const |
| 81 | ; |
| 82 | |
| 83 | simple_const: STRUE { $$ = mklogcon(1); } |
| 84 | | SFALSE { $$ = mklogcon(0); } |
| 85 | | SHOLLERITH { $$ = mkstrcon(toklen, token); } |
| 86 | | SICON = { $$ = mkintcon( convci(toklen, token) ); } |
| 87 | | SRCON = { $$ = mkrealcon(TYREAL, convcd(toklen, token)); } |
| 88 | | SDCON = { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); } |
| 89 | ; |
| 90 | |
| 91 | complex_const: SLPAR uexpr SCOMMA uexpr SRPAR |
| 92 | { $$ = mkcxcon($2,$4); } |
| 93 | ; |
| 94 | |
| 95 | bit_const: SHEXCON |
| 96 | { $$ = mkbitcon(4, toklen, token); } |
| 97 | | SOCTCON |
| 98 | { $$ = mkbitcon(3, toklen, token); } |
| 99 | | SBITCON |
| 100 | { $$ = mkbitcon(1, toklen, token); } |
| 101 | ; |
| 102 | |
| 103 | fexpr: unpar_fexpr |
| 104 | | SLPAR fexpr SRPAR |
| 105 | { $$ = $2; } |
| 106 | ; |
| 107 | |
| 108 | unpar_fexpr: lhs |
| 109 | | simple_const |
| 110 | | fexpr addop fexpr %prec SPLUS |
| 111 | { $$ = mkexpr($2, $1, $3); } |
| 112 | | fexpr SSTAR fexpr |
| 113 | { $$ = mkexpr(OPSTAR, $1, $3); } |
| 114 | | fexpr SSLASH fexpr |
| 115 | { $$ = mkexpr(OPSLASH, $1, $3); } |
| 116 | | fexpr SPOWER fexpr |
| 117 | { $$ = mkexpr(OPPOWER, $1, $3); } |
| 118 | | addop fexpr %prec SSTAR |
| 119 | { if($1 == OPMINUS) |
| 120 | $$ = mkexpr(OPNEG, $2, 0); |
| 121 | else $$ = $2; |
| 122 | } |
| 123 | | fexpr SCONCAT fexpr |
| 124 | { $$ = mkexpr(OPCONCAT, $1, $3); } |
| 125 | ; |