1funarglist: 2 { $$ = 0; } 3 | funargs 4 ; 5 6funargs: expr 7 { $$ = mkchain($1, 0); } 8 | funargs SCOMMA expr 9 { $$ = hookup($1, mkchain($3,0) ); } 10 ; 11 12 13expr: uexpr 14 | SLPAR expr SRPAR { $$ = $2; } 15 | complex_const 16 ; 17 18uexpr: 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 49addop: SPLUS { $$ = OPPLUS; } 50 | SMINUS { $$ = OPMINUS; } 51 ; 52 53relop: SEQ { $$ = OPEQ; } 54 | SGT { $$ = OPGT; } 55 | SLT { $$ = OPLT; } 56 | SGE { $$ = OPGE; } 57 | SLE { $$ = OPLE; } 58 | SNE { $$ = OPNE; } 59 ; 60 61lhs: 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 71opt_expr: 72 { $$ = 0; } 73 | expr 74 ; 75 76simple: name 77 { if($1->vclass == CLPARAM) 78 $$ = cpexpr($1->b_param.paramval); 79 } 80 | simple_const 81 ; 82 83simple_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 91complex_const: SLPAR uexpr SCOMMA uexpr SRPAR 92 { $$ = mkcxcon($2,$4); } 93 ; 94 95bit_const: SHEXCON 96 { $$ = mkbitcon(4, toklen, token); } 97 | SOCTCON 98 { $$ = mkbitcon(3, toklen, token); } 99 | SBITCON 100 { $$ = mkbitcon(1, toklen, token); } 101 ; 102 103fexpr: unpar_fexpr 104 | SLPAR fexpr SRPAR 105 { $$ = $2; } 106 ; 107 108unpar_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 ; 126