{ $$ = hookup($1, mkchain($3,0) ); }
| SLPAR expr SRPAR { $$ = $2; }
| expr addop expr %prec SPLUS
{ $$ = mkexpr($2, $1, $3); }
{ $$ = mkexpr(OPSTAR, $1, $3); }
{ $$ = mkexpr(OPSLASH, $1, $3); }
{ $$ = mkexpr(OPPOWER, $1, $3); }
$$ = mkexpr(OPNEG, $2, 0);
| expr relop expr %prec SEQ
{ $$ = mkexpr($2, $1, $3); }
{ $$ = mkexpr(OPEQV, $1,$3); }
{ $$ = mkexpr(OPNEQV, $1, $3); }
{ $$ = mkexpr(OPOR, $1, $3); }
{ $$ = mkexpr(OPAND, $1, $3); }
{ $$ = mkexpr(OPNOT, $2, 0); }
{ $$ = mkexpr(OPCONCAT, $1, $3); }
addop: SPLUS { $$ = OPPLUS; }
| SMINUS { $$ = OPMINUS; }
relop: SEQ { $$ = OPEQ; }
{ $$ = mkprim($1, 0, 0, 0); }
| name SLPAR opt_expr SCOLON opt_expr SRPAR
{ $$ = mkprim($1, 0, $3, $5); }
| name SLPAR funarglist SRPAR
{ $$ = mkprim($1, mklist($3), 0, 0); }
| name SLPAR funarglist SRPAR SLPAR opt_expr SCOLON opt_expr SRPAR
{ $$ = mkprim($1, mklist($3), $6, $8); }
{ if($1->vclass == CLPARAM)
$$ = cpexpr($1->paramval);
simple_const: STRUE { $$ = mklogcon(1); }
| SFALSE { $$ = mklogcon(0); }
| SHOLLERITH { $$ = mkstrcon(toklen, token); }
| SICON = { $$ = mkintcon( convci(toklen, token) ); }
| SRCON = { $$ = mkrealcon(TYREAL, convcd(toklen, token)); }
| SDCON = { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); }
complex_const: SLPAR uexpr SCOMMA uexpr SRPAR
{ $$ = mkbitcon(4, toklen, token); }
{ $$ = mkbitcon(3, toklen, token); }
{ $$ = mkbitcon(1, toklen, token); }
| fexpr addop fexpr %prec SPLUS
{ $$ = mkexpr($2, $1, $3); }
{ $$ = mkexpr(OPSTAR, $1, $3); }
{ $$ = mkexpr(OPSLASH, $1, $3); }
{ $$ = mkexpr(OPPOWER, $1, $3); }
| addop fexpr %prec SSTAR
$$ = mkexpr(OPNEG, $2, 0);
{ $$ = mkexpr(OPCONCAT, $1, $3); }