1 %{ 2 3 #ifndef lint 4 static char sccsid[] = "@(#)lextab.l 4.1 (Berkeley) 02/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 222