|
|
1.1 ! root 1: %{ ! 2: ! 3: #ifndef lint ! 4: static char sccsid[] = "@(#)lextab.l 4.1 (Berkeley) 2/11/83"; ! 5: #endif not lint ! 6: ! 7: #include "y.tab.h" ! 8: #include "b.h" ! 9: #undef input ! 10: #define input() ninput() ! 11: #undef unput ! 12: #define unput(c) nunput(c) ! 13: extern int yylval; ! 14: #define xxbpmax 1700 ! 15: char xxbuf[xxbpmax + 2]; ! 16: int xxbp = -1; ! 17: #define xxunmax 200 ! 18: char xxunbuf[xxunmax + 2]; ! 19: int xxunbp = -1; ! 20: ! 21: ! 22: int blflag; ! 23: %} ! 24: ! 25: D [0-9] ! 26: A [0-9a-z] ! 27: L [a-z] ! 28: SP [^0-9a-z] ! 29: ! 30: %% ! 31: ! 32: %{ ! 33: char *xxtbuff; ! 34: int xxj, xxn, xxk; ! 35: char *xxp; ! 36: %} ! 37: [=/,(]{D}+[h] { ! 38: blflag = 1; ! 39: sscanf(&yytext[1],"%d",&xxn); ! 40: xxtbuff = malloc(2*xxn+3); ! 41: for (xxj = xxk = 1; xxj <= xxn; ++xxj) ! 42: { ! 43: xxtbuff[xxk] = ninput(); ! 44: if (xxtbuff[xxk] == '"') ! 45: xxtbuff[++xxk] = '"'; ! 46: ++xxk; ! 47: } ! 48: xxtbuff[0] = xxtbuff[xxk++] = '"'; ! 49: xxtbuff[xxk] = '\0'; ! 50: putback(xxtbuff); ! 51: free(xxtbuff); ! 52: ! 53: backup(yytext[0]); ! 54: blflag = 0; ! 55: xxbp = -1; ! 56: } ! 57: IF {fixval(); xxbp = -1; return(xxif);} ! 58: ELSE {fixval(); xxbp = -1; return(xxelse);} ! 59: REPEAT {fixval(); xxbp = -1; return(xxrept); } ! 60: WHILE {fixval(); xxbp = -1; return(xxwhile); } ! 61: UNTIL { fixval(); xxbp = -1; return(xxuntil); } ! 62: DO {fixval(); xxbp = -1; return(xxdo); } ! 63: SWITCH {fixval(); xxbp = -1; return(xxswitch); } ! 64: CASE {fixval(); xxbp = -1; return(xxcase); } ! 65: DEFAULT {fixval(); xxbp = -1; return(xxdefault); } ! 66: END {fixval(); xxbp = -1; return(xxend); } ! 67: ! 68: ".true." | ! 69: ".false." | ! 70: ! 71: {L}{A}* {fixval(); xxbp = -1; return(xxident); } ! 72: ~{D}+ {xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); } ! 73: {D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"." | ! 74: {D}+\.? | ! 75: {D}+\.?[de][+-]?{D}+ | ! 76: {D}*\.{D}+[de][+-]?{D}+ | ! 77: {D}*\.{D}+ {fixval(); xxbp = -1; return(xxnum); } ! 78: ! 79: ".gt." { putback(">"); xxbp = -1; } ! 80: ".ge." { putback(">=");xxbp = -1; } ! 81: ".lt." { putback("<"); xxbp = -1; } ! 82: ".le." { putback("<="); xxbp = -1; } ! 83: ".eq." { putback("=="); xxbp = -1; } ! 84: ".ne." { putback("!="); xxbp = -1; } ! 85: ".not." { putback("!"); xxbp = -1; } ! 86: ".or." { putback("||"); xxbp = -1; } ! 87: ".and." { putback("&&"); xxbp = -1; } ! 88: ">=" {fixval(); xxbp = -1; return(xxge); } ! 89: "<=" {fixval(); xxbp = -1; return(xxle); } ! 90: == {fixval(); xxbp = -1; return(xxeq); } ! 91: != {fixval(); xxbp = -1; return(xxne); } ! 92: "||" {fixval(); xxbp = -1; return('|'); } ! 93: "&&" {fixval(); xxbp = -1; return('&'); } ! 94: "**" {fixval(); xxbp = -1; return('^'); } ! 95: ! 96: #.* {fixval(); xxbp = -1; return(xxcom); } ! 97: \"([^"]|\"\")*\" {fixval(); xxbp = -1; return(xxstring); } ! 98: '([^']|'')*' { ! 99: fixval(); ! 100: xxp = yylval; ! 101: xxn = slength(xxp); ! 102: xxtbuff = malloc(2*xxn+1); ! 103: xxtbuff[0] = '"'; ! 104: for (xxj = xxk = 1; xxj < xxn-1; ++xxj) ! 105: { ! 106: if (xxp[xxj] == '\'' && xxp[++xxj] == '\'') ! 107: xxtbuff[xxk++] = '\''; ! 108: else if (xxp[xxj] == '"') ! 109: { ! 110: xxtbuff[xxk++] = '"'; ! 111: xxtbuff[xxk++] = '"'; ! 112: } ! 113: else ! 114: xxtbuff[xxk++] = xxp[xxj]; ! 115: } ! 116: xxtbuff[xxk++] = '"'; ! 117: xxtbuff[xxk] = '\0'; ! 118: free(xxp); ! 119: yylval = xxtbuff; ! 120: xxbp = -1; ! 121: return(xxstring); ! 122: } ! 123: ! 124: ^\n xxbp = -1; ! 125: \n {xxbp = -1; if (newflag) {fixval(); return('\n'); } } ! 126: {SP} {fixval(); xxbp = -1; return(yytext[0]); } ! 127: ! 128: %% ! 129: ! 130: rdchar() ! 131: { ! 132: int c; ! 133: if (xxunbp >= 0) ! 134: return(xxunbuf[xxunbp--]); ! 135: c = getchar(); ! 136: if (c == EOF) return('\0'); ! 137: else return((char)c); ! 138: } ! 139: ! 140: backup(c) ! 141: char c; ! 142: { ! 143: if (++xxunbp > xxunmax) ! 144: { ! 145: xxunbuf[xxunmax + 1] = '\0'; ! 146: error("RATFOR beautifying; input backed up too far during lex:\n", ! 147: xxunbuf,"\n"); ! 148: } ! 149: xxunbuf[xxunbp] = c; ! 150: } ! 151: ! 152: nunput(c) ! 153: char c; ! 154: { ! 155: backup(c); ! 156: if (xxbp < 0) return; ! 157: if (c != xxbuf[xxbp]) ! 158: { ! 159: xxbuf[xxbp + 1] = '\0'; ! 160: error("RATFOR beautifying; lex call of nunput with wrong char:\n", ! 161: xxbuf,"\n"); ! 162: } ! 163: for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp) ! 164: backup(xxbuf[xxbp]); ! 165: xxbuf[xxbp+1] = '\0'; ! 166: } ! 167: ! 168: ninput() ! 169: { ! 170: char c,d; ! 171: if (blflag) c = rdchar(); ! 172: else ! 173: while ( (c = rdchar()) == ' ' || c == '\t') ! 174: addbuf(c); ! 175: if (c != '\n') ! 176: return(addbuf(c)); ! 177: while ( (d = rdchar()) == ' ' || d == '\t'); ! 178: if (d == '&') ! 179: return(ninput()); ! 180: backup(d); ! 181: return(addbuf('\n')); ! 182: } ! 183: ! 184: addbuf(c) ! 185: char c; ! 186: { ! 187: if (++xxbp > xxbpmax) ! 188: { ! 189: xxbuf[xxbpmax +1] = '\0'; ! 190: error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n", ! 191: xxbuf,"\n"); ! 192: } ! 193: xxbuf[xxbp] = c; ! 194: xxbuf[xxbp + 1] = '\0'; ! 195: return(c); ! 196: } ! 197: ! 198: ! 199: fixval() ! 200: { ! 201: int i, j, k; ! 202: for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j); ! 203: for (k = j; xxbuf[k] != '\0'; ++k); ! 204: for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k] == '\t'; --k); ! 205: xxbuf[k+1] = '\0'; ! 206: i = slength(&xxbuf[j]) + 1; ! 207: yylval = malloc(i); ! 208: str_copy(&xxbuf[j],yylval,i); ! 209: } ! 210: ! 211: ! 212: ! 213: putback(str) ! 214: char *str; ! 215: { ! 216: int i; ! 217: for (i = 0; str[i] != '\0'; ++i); ! 218: for (--i; i >= 0; --i) ! 219: backup(str[i]); ! 220: } ! 221:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.