|
|
1.1 ! root 1: expr: lhs ! 2: { if($1->tag == TCALL) ! 3: $1 = funcinv($1); ! 4: if($1->vtype==TYUNDEFINED && $1->vext==0) ! 5: impldecl($1); ! 6: else if($1->tag==TNAME && $1->vdcldone==0 ! 7: && $1->vext==0 && !inbound) ! 8: dclit($1); ! 9: if($1->vtype==TYFIELD) ! 10: $$ = extrfield($1); ! 11: } ! 12: | CONST ! 13: | logcon ! 14: { $$ = mkconst(TYLOG, ($1 == TRUE ? ".true." : ".false.") ); } ! 15: | specs parexprs ! 16: { $$ = typexpr($1,$2); } ! 17: | sizeof ! 18: | lengthof ! 19: | parexprs ! 20: { if( !ininit && $1->tag== TLIST) ! 21: $$ = compconst($1); ! 22: else $1->needpar = 1; } ! 23: | expr ADDOP expr ! 24: { $$ = mknode(TAROP,$2,$1,$3); } ! 25: | expr MULTOP expr ! 26: { $$ = mknode(TAROP,$2,$1,$3); } ! 27: | expr POWER expr ! 28: { $$ = mknode(TAROP,$2,$1,$3); } ! 29: | ADDOP expr %prec MULTOP ! 30: { if($1==OPMINUS) ! 31: $$ = mknode(TNEGOP,OPMINUS, $2, PNULL); ! 32: else $$ = $2; } ! 33: | DOUBLEADDOP lhs %prec MULTOP ! 34: { $$ = mknode(TASGNOP,$1,$2,mkint(1)); } ! 35: | expr RELOP expr ! 36: { $$ = mknode(TRELOP,$2,$1,$3); } ! 37: | expr OR expr ! 38: { $$ = mknode(TLOGOP,$2,$1,$3); } ! 39: | expr AND expr ! 40: { $$ = mknode(TLOGOP,$2,$1,$3); } ! 41: | NOT expr ! 42: { $$ = mknode(TNOTOP,$1,$2,PNULL); } ! 43: | lhs ASGNOP expr ! 44: { if($1->tag == TCALL) ! 45: { ! 46: exprerr("may not assign to a function", CNULL); ! 47: $$ = errnode(); ! 48: } ! 49: else ! 50: $$ = mknode(TASGNOP,$2,$1,$3); ! 51: } ! 52: | expr REPOP expr ! 53: { $$ = mknode(TREPOP,0,$1,$3); } ! 54: | iostat ! 55: | error ! 56: { $$ = errnode(); } ! 57: ; ! 58: ! 59: lhs: lhs1 ! 60: { if($1->tag==TNAME && $1->vdcldone==0 && ! 61: $1->vsubs==0 && $1->vext==0 && !inbound) ! 62: dclit($1); ! 63: } ! 64: ; ! 65: ! 66: lhs1: lhsname ! 67: | lhsname parexprs ! 68: { ! 69: if($2->tag!=TLIST) ! 70: $2 = mknode(TLIST,0, mkchain($2,CHNULL), PNULL); ! 71: if($1->vdim) ! 72: { ! 73: if($1->vdcldone==0 && $1->vext==0) ! 74: dclit($1); ! 75: $$ = subscript($1,$2); ! 76: } ! 77: else $$ = mkcall($1,$2); ! 78: } ! 79: | lhs QUALOP NAME ! 80: { $$ = strucelt($1,$3); } ! 81: | lhs QUALOP NAME parexprs ! 82: { if($4->tag != TLIST) ! 83: $4 = mknode(TLIST,0, mkchain($4,CHNULL), PNULL); ! 84: $$ = subscript(strucelt($1,$3), $4); ! 85: } ! 86: | lhs ARROW STRUCTNAME ! 87: { $$ = mkarrow($1,$3); } ! 88: ; ! 89: ! 90: lhsname: NAME ! 91: { if($1->varp == 0) mkvar($1); ! 92: if(inbound) ! 93: $1->varp->vadjdim = 1; ! 94: $$ = cpexpr($1->varp); } ! 95: ; ! 96: ! 97: parexprs: LPAR RPAR ! 98: { $$ = mknode(TLIST, 0, PNULL, PNULL); } ! 99: | LPAR expr RPAR ! 100: { $$ = $2; } ! 101: | LPAR exprlist RPAR ! 102: { $$ = mknode(TLIST,0,$2,PNULL); } ! 103: ; ! 104: ! 105: exprlist: expr COMMA expr ! 106: { $$ = mkchain($1, mkchain($3, CHNULL) ); } ! 107: | exprlist COMMA expr ! 108: { hookup($1, mkchain($3,CHNULL) ); } ! 109: ; ! 110: ! 111: sizeof: SIZEOF LPAR expr RPAR ! 112: { $$ = esizeof($3->vtype, $3->vtypep, $3->vdim); ! 113: frexpr($3); } ! 114: | SIZEOF LPAR specs RPAR ! 115: { if($3->attype==TYREAL && $3->atprec) ! 116: $3->attype = TYLREAL; ! 117: $$ = esizeof($3->attype, $3->attypep, $3->atdim); ! 118: cfree($3); ! 119: } ! 120: | SIZEOF LPAR CHARACTER RPAR ! 121: { $$ = mkint(tailor.ftnsize[FTNINT]/tailor.ftnchwd); } ! 122: ; ! 123: ! 124: lengthof: LENGTHOF LPAR expr RPAR ! 125: { $$ = elenof($3->vtype, $3->vtypep, $3->vdim); ! 126: frexpr($3); } ! 127: | LENGTHOF LPAR specs RPAR ! 128: { $$ = elenof($3->attype, $3->attypep, $3->atdim); ! 129: cfree($3); ! 130: } ! 131: | LENGTHOF LPAR CHARACTER RPAR ! 132: { $$ = mkint(1); } ! 133: ; ! 134: ! 135: logcon: logval ! 136: | QUALOP logval QUALOP ! 137: { $$ = $2; } ! 138: ; ! 139: ! 140: logval: TRUE ! 141: | FALSE ! 142: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.