|
|
1.1 ! root 1: funarglist: ! 2: { $$ = 0; } ! 3: | funargs ! 4: ; ! 5: ! 6: funargs: expr ! 7: { $$ = mkchain($1, CHNULL); } ! 8: | funargs SCOMMA expr ! 9: { $$ = hookup($1, mkchain($3,CHNULL) ); } ! 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, ENULL); ! 31: else $$ = $2; ! 32: } ! 33: | expr relop expr %prec SEQ ! 34: { $$ = mkexpr($2, $1, $3); } ! 35: | expr SEQV expr ! 36: { NO66(".EQV. operator"); ! 37: $$ = mkexpr(OPEQV, $1,$3); } ! 38: | expr SNEQV expr ! 39: { NO66(".NEQV. operator"); ! 40: $$ = mkexpr(OPNEQV, $1, $3); } ! 41: | expr SOR expr ! 42: { $$ = mkexpr(OPOR, $1, $3); } ! 43: | expr SAND expr ! 44: { $$ = mkexpr(OPAND, $1, $3); } ! 45: | SNOT expr ! 46: { $$ = mkexpr(OPNOT, $2, ENULL); } ! 47: | expr SCONCAT expr ! 48: { NO66("concatenation operator //"); ! 49: $$ = mkexpr(OPCONCAT, $1, $3); } ! 50: ; ! 51: ! 52: addop: SPLUS { $$ = OPPLUS; } ! 53: | SMINUS { $$ = OPMINUS; } ! 54: ; ! 55: ! 56: relop: SEQ { $$ = OPEQ; } ! 57: | SGT { $$ = OPGT; } ! 58: | SLT { $$ = OPLT; } ! 59: | SGE { $$ = OPGE; } ! 60: | SLE { $$ = OPLE; } ! 61: | SNE { $$ = OPNE; } ! 62: ; ! 63: ! 64: lhs: name ! 65: { $$ = mkprim($1, PNULL, CHNULL); } ! 66: | name substring ! 67: { NO66("substring operator :"); ! 68: $$ = mkprim($1, PNULL, $2); } ! 69: | name SLPAR funarglist SRPAR ! 70: { $$ = mkprim($1, mklist($3), CHNULL); } ! 71: | name SLPAR funarglist SRPAR substring ! 72: { NO66("substring operator :"); ! 73: $$ = mkprim($1, mklist($3), $5); } ! 74: ; ! 75: ! 76: substring: SLPAR opt_expr SCOLON opt_expr SRPAR ! 77: { $$ = mkchain($2, mkchain($4,CHNULL)); } ! 78: ; ! 79: ! 80: opt_expr: ! 81: { $$ = 0; } ! 82: | expr ! 83: ; ! 84: ! 85: simple: name ! 86: { if($1->vclass == CLPARAM) ! 87: $$ = (expptr) cpexpr( ! 88: ( (struct Paramblock *) ($1) ) -> paramval); ! 89: } ! 90: | simple_const ! 91: ; ! 92: ! 93: simple_const: STRUE { $$ = mklogcon(1); } ! 94: | SFALSE { $$ = mklogcon(0); } ! 95: | SHOLLERITH { $$ = mkstrcon(toklen, token); } ! 96: | SICON = { $$ = mkintcon( convci(toklen, token) ); } ! 97: | SRCON = { $$ = mkrealcon(TYREAL, convcd(toklen, token)); } ! 98: | SDCON = { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); } ! 99: ; ! 100: ! 101: complex_const: SLPAR uexpr SCOMMA uexpr SRPAR ! 102: { $$ = mkcxcon($2,$4); } ! 103: ; ! 104: ! 105: bit_const: SHEXCON ! 106: { NOEXT("hex constant"); ! 107: $$ = mkbitcon(4, toklen, token); } ! 108: | SOCTCON ! 109: { NOEXT("octal constant"); ! 110: $$ = mkbitcon(3, toklen, token); } ! 111: | SBITCON ! 112: { NOEXT("binary constant"); ! 113: $$ = mkbitcon(1, toklen, token); } ! 114: ; ! 115: ! 116: fexpr: unpar_fexpr ! 117: | SLPAR fexpr SRPAR ! 118: { $$ = $2; } ! 119: ; ! 120: ! 121: unpar_fexpr: lhs ! 122: | simple_const ! 123: | fexpr addop fexpr %prec SPLUS ! 124: { $$ = mkexpr($2, $1, $3); } ! 125: | fexpr SSTAR fexpr ! 126: { $$ = mkexpr(OPSTAR, $1, $3); } ! 127: | fexpr SSLASH fexpr ! 128: { $$ = mkexpr(OPSLASH, $1, $3); } ! 129: | fexpr SPOWER fexpr ! 130: { $$ = mkexpr(OPPOWER, $1, $3); } ! 131: | addop fexpr %prec SSTAR ! 132: { if($1 == OPMINUS) ! 133: $$ = mkexpr(OPNEG, $2, ENULL); ! 134: else $$ = $2; ! 135: } ! 136: | fexpr SCONCAT fexpr ! 137: { NO66("concatenation operator //"); ! 138: $$ = mkexpr(OPCONCAT, $1, $3); } ! 139: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.