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