mirror of https://github.com/rusefi/lua.git
new algorithm for reading floats.
files end with EOF, instead of 0.
This commit is contained in:
parent
ad07c0f638
commit
d1c5f42943
37
lex.c
37
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();
|
||||
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 { save_and_next(); } while (isdigit(current));
|
||||
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;
|
||||
}
|
||||
*yytextLast = 0;
|
||||
yylval.vFloat = atof(yytext[currentText]);
|
||||
}
|
||||
yylval.vFloat = a;
|
||||
return NUMBER;
|
||||
|
||||
}
|
||||
case U_and: next(); return AND;
|
||||
case U_do: next(); return DO;
|
||||
case U_else: next(); return ELSE;
|
||||
|
|
Loading…
Reference in New Issue