فهرست منبع

Fix to allow float numbers like '.2'

mingodad 6 سال پیش
والد
کامیت
ca903a3695
2فایلهای تغییر یافته به همراه12 افزوده شده و 5 حذف شده
  1. 11 4
      SquiLu/squirrel/sqlexer.cpp
  2. 1 1
      SquiLu/squirrel/sqlexer.h

+ 11 - 4
SquiLu/squirrel/sqlexer.cpp

@@ -418,7 +418,14 @@ SQInteger SQLexer::Lex()
             }
             }
 		case _SC('.'):
 		case _SC('.'):
 			NEXT();
 			NEXT();
-			if (CUR_CHAR != _SC('.')){ RETURN_TOKEN(_SC('.')) }
+			if (CUR_CHAR != _SC('.')){
+			    if (scisdigit(CUR_CHAR)) {
+				SQInteger ret = ReadNumber(_SC('.'));
+				if(ret < 0) return -1;
+				RETURN_TOKEN(ret);
+			    }
+			    RETURN_TOKEN(_SC('.'));
+			}
 			NEXT();
 			NEXT();
 			if (CUR_CHAR != _SC('.')){ return Error(_SC("invalid token '..'")); }
 			if (CUR_CHAR != _SC('.')){ return Error(_SC("invalid token '..'")); }
 			NEXT();
 			NEXT();
@@ -849,18 +856,18 @@ static SQInteger isexponent(SQInteger c) { return c == _SC('e') || c==_SC('E');
 
 
 
 
 #define MAX_HEX_DIGITS (sizeof(SQInteger)*2)
 #define MAX_HEX_DIGITS (sizeof(SQInteger)*2)
-SQInteger SQLexer::ReadNumber()
+SQInteger SQLexer::ReadNumber(SQInteger startChar)
 {
 {
 #define TINT 1
 #define TINT 1
 #define TFLOAT 2
 #define TFLOAT 2
 #define THEX 3
 #define THEX 3
 #define TSCIENTIFIC 4
 #define TSCIENTIFIC 4
 #define TOCTAL 5
 #define TOCTAL 5
-	SQInteger rtype, type = TINT, firstchar = CUR_CHAR;
+	SQInteger rtype, type = TINT, firstchar = startChar ? startChar : CUR_CHAR;
 	SQUnsignedInteger itmp=0;
 	SQUnsignedInteger itmp=0;
 	SQChar *sTemp;
 	SQChar *sTemp;
 	INIT_TEMP_STRING();
 	INIT_TEMP_STRING();
-	NEXT();
+	if(!startChar) NEXT();
 	if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) {
 	if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) {
 		if(scisodigit(CUR_CHAR)) {
 		if(scisodigit(CUR_CHAR)) {
 			type = TOCTAL;
 			type = TOCTAL;

+ 1 - 1
SquiLu/squirrel/sqlexer.h

@@ -85,7 +85,7 @@ struct SQLexer
 private:
 private:
 	SQInteger GetIDType(const SQChar *s,SQInteger len);
 	SQInteger GetIDType(const SQChar *s,SQInteger len);
 	SQInteger ReadString(SQInteger ndelim,bool verbatim);
 	SQInteger ReadString(SQInteger ndelim,bool verbatim);
-	SQInteger ReadNumber();
+	SQInteger ReadNumber(SQInteger startChar=0);
 	SQInteger LexBlockComment();
 	SQInteger LexBlockComment();
 	SQInteger LexLineComment();
 	SQInteger LexLineComment();
 	SQInteger ReadID();
 	SQInteger ReadID();