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