diff --git a/lex.c b/lex.c index ee64d1c9..060fa302 100644 --- a/lex.c +++ b/lex.c @@ -1,5 +1,9 @@ -char *rcs_lex = "$Id: lex.c,v 2.5 1994/09/22 12:44:00 lhf Exp celes $"; +char *rcs_lex = "$Id: lex.c,v 2.6 1994/09/26 16:21:52 celes Exp celes $"; /*$Log: lex.c,v $ + * Revision 2.6 1994/09/26 16:21:52 celes + * Mudancas para tornar lex.c um modulo independente dos outros + * modulos de Lua + * * Revision 2.5 1994/09/22 12:44:00 lhf * added support for ugly tokens * @@ -135,6 +139,7 @@ static int findReserved (char *name) int yylex () { + float a; currentText = !currentText; while (1) { @@ -144,6 +149,9 @@ int yylex () #endif switch (current) { + case EOF: + case 0: + return 0; case '\n': lua_linenumber++; case ' ': case '\t': @@ -202,6 +210,7 @@ int yylex () { switch (current) { + case EOF: case 0: case '\n': return WRONGTOKEN; @@ -259,25 +268,37 @@ int yylex () } else if (!isdigit(current)) return '.'; /* current is a digit: goes through to number */ + a=0.0; goto fraction; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - - do { save_and_next(); } while (isdigit(current)); + a=0.0; + do { a=10*a+current-'0'; save_and_next(); } while (isdigit(current)); if (current == '.') save_and_next(); -fraction: while (isdigit(current)) save_and_next(); - if (current == 'e' || current == 'E') - { - save_and_next(); - if (current == '+' || current == '-') save_and_next(); - if (!isdigit(current)) return WRONGTOKEN; - do { save_and_next(); } while (isdigit(current)); +fraction: + { float da=0.1; + while (isdigit(current)) + {a+=(current-'0')*da; da/=10.0; save_and_next()}; + if (current == 'e' || current == 'E') + { + int e=0; + int neg; + float ea; + save_and_next(); + neg=(current=='-'); + if (current == '+' || current == '-') save_and_next(); + if (!isdigit(current)) return WRONGTOKEN; + do { e=10*e+current-'0'; save_and_next(); } while (isdigit(current)); + for (ea=neg?0.1:10.0; e>0; e>>=1) + { + if (e & 1) a*=ea; + ea*=ea; + } + } + yylval.vFloat = a; + return NUMBER; } - *yytextLast = 0; - yylval.vFloat = atof(yytext[currentText]); - return NUMBER; - case U_and: next(); return AND; case U_do: next(); return DO; case U_else: next(); return ELSE;