diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-10-17 17:01:53 -0200 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-10-17 17:01:53 -0200 |
| commit | d1c5f4294365e9c5dbcd7f57bd0e3d55b548329c (patch) | |
| tree | 7734e6b61075906db385d320ee1841aa341d01a3 /lex.c | |
| parent | ad07c0f6380f527a8983039c4ae72ad40dd0443b (diff) | |
| download | lua-d1c5f4294365e9c5dbcd7f57bd0e3d55b548329c.tar.gz lua-d1c5f4294365e9c5dbcd7f57bd0e3d55b548329c.tar.bz2 lua-d1c5f4294365e9c5dbcd7f57bd0e3d55b548329c.zip | |
new algorithm for reading floats.
files end with EOF, instead of 0.
Diffstat (limited to '')
| -rw-r--r-- | lex.c | 49 |
1 files changed, 35 insertions, 14 deletions
| @@ -1,5 +1,9 @@ | |||
| 1 | char *rcs_lex = "$Id: lex.c,v 2.5 1994/09/22 12:44:00 lhf Exp celes $"; | 1 | char *rcs_lex = "$Id: lex.c,v 2.6 1994/09/26 16:21:52 celes Exp celes $"; |
| 2 | /*$Log: lex.c,v $ | 2 | /*$Log: lex.c,v $ |
| 3 | * Revision 2.6 1994/09/26 16:21:52 celes | ||
| 4 | * Mudancas para tornar lex.c um modulo independente dos outros | ||
| 5 | * modulos de Lua | ||
| 6 | * | ||
| 3 | * Revision 2.5 1994/09/22 12:44:00 lhf | 7 | * Revision 2.5 1994/09/22 12:44:00 lhf |
| 4 | * added support for ugly tokens | 8 | * added support for ugly tokens |
| 5 | * | 9 | * |
| @@ -135,6 +139,7 @@ static int findReserved (char *name) | |||
| 135 | 139 | ||
| 136 | int yylex () | 140 | int yylex () |
| 137 | { | 141 | { |
| 142 | float a; | ||
| 138 | currentText = !currentText; | 143 | currentText = !currentText; |
| 139 | while (1) | 144 | while (1) |
| 140 | { | 145 | { |
| @@ -144,6 +149,9 @@ int yylex () | |||
| 144 | #endif | 149 | #endif |
| 145 | switch (current) | 150 | switch (current) |
| 146 | { | 151 | { |
| 152 | case EOF: | ||
| 153 | case 0: | ||
| 154 | return 0; | ||
| 147 | case '\n': lua_linenumber++; | 155 | case '\n': lua_linenumber++; |
| 148 | case ' ': | 156 | case ' ': |
| 149 | case '\t': | 157 | case '\t': |
| @@ -202,6 +210,7 @@ int yylex () | |||
| 202 | { | 210 | { |
| 203 | switch (current) | 211 | switch (current) |
| 204 | { | 212 | { |
| 213 | case EOF: | ||
| 205 | case 0: | 214 | case 0: |
| 206 | case '\n': | 215 | case '\n': |
| 207 | return WRONGTOKEN; | 216 | return WRONGTOKEN; |
| @@ -259,25 +268,37 @@ int yylex () | |||
| 259 | } | 268 | } |
| 260 | else if (!isdigit(current)) return '.'; | 269 | else if (!isdigit(current)) return '.'; |
| 261 | /* current is a digit: goes through to number */ | 270 | /* current is a digit: goes through to number */ |
| 271 | a=0.0; | ||
| 262 | goto fraction; | 272 | goto fraction; |
| 263 | 273 | ||
| 264 | case '0': case '1': case '2': case '3': case '4': | 274 | case '0': case '1': case '2': case '3': case '4': |
| 265 | case '5': case '6': case '7': case '8': case '9': | 275 | case '5': case '6': case '7': case '8': case '9': |
| 266 | 276 | a=0.0; | |
| 267 | do { save_and_next(); } while (isdigit(current)); | 277 | do { a=10*a+current-'0'; save_and_next(); } while (isdigit(current)); |
| 268 | if (current == '.') save_and_next(); | 278 | if (current == '.') save_and_next(); |
| 269 | fraction: while (isdigit(current)) save_and_next(); | 279 | fraction: |
| 270 | if (current == 'e' || current == 'E') | 280 | { float da=0.1; |
| 271 | { | 281 | while (isdigit(current)) |
| 272 | save_and_next(); | 282 | {a+=(current-'0')*da; da/=10.0; save_and_next()}; |
| 273 | if (current == '+' || current == '-') save_and_next(); | 283 | if (current == 'e' || current == 'E') |
| 274 | if (!isdigit(current)) return WRONGTOKEN; | 284 | { |
| 275 | do { save_and_next(); } while (isdigit(current)); | 285 | int e=0; |
| 286 | int neg; | ||
| 287 | float ea; | ||
| 288 | save_and_next(); | ||
| 289 | neg=(current=='-'); | ||
| 290 | if (current == '+' || current == '-') save_and_next(); | ||
| 291 | if (!isdigit(current)) return WRONGTOKEN; | ||
| 292 | do { e=10*e+current-'0'; save_and_next(); } while (isdigit(current)); | ||
| 293 | for (ea=neg?0.1:10.0; e>0; e>>=1) | ||
| 294 | { | ||
| 295 | if (e & 1) a*=ea; | ||
| 296 | ea*=ea; | ||
| 297 | } | ||
| 298 | } | ||
| 299 | yylval.vFloat = a; | ||
| 300 | return NUMBER; | ||
| 276 | } | 301 | } |
| 277 | *yytextLast = 0; | ||
| 278 | yylval.vFloat = atof(yytext[currentText]); | ||
| 279 | return NUMBER; | ||
| 280 | |||
| 281 | case U_and: next(); return AND; | 302 | case U_and: next(); return AND; |
| 282 | case U_do: next(); return DO; | 303 | case U_do: next(); return DO; |
| 283 | case U_else: next(); return ELSE; | 304 | case U_else: next(); return ELSE; |
