ソースを参照

Add a flag to differentiate single character from integer numbers

mingodad 6 年 前
コミット
e4b7c99f49
3 ファイル変更18 行追加3 行削除
  1. 9 0
      SquiLu/squirrel/sq_lexer.cpp
  2. 6 3
      SquiLu/squirrel/sqlexer.cpp
  3. 3 0
      SquiLu/squirrel/sqlexer.h

+ 9 - 0
SquiLu/squirrel/sq_lexer.cpp

@@ -166,6 +166,14 @@ static SQRESULT sq_SQLexer_svalue(HSQUIRRELVM v){
 	return 1;
 	return 1;
 }
 }
 
 
+static SQRESULT sq_SQLexer_isCharacter(HSQUIRRELVM v){
+	SQ_FUNC_VARS_NO_TOP(v);
+	GET_SQLexer_INSTANCE();
+
+    sq_pushbool(v, self->lex->data->isCharacter);
+	return 1;
+}
+
 static SQRESULT sq_SQLexer_nvalue(HSQUIRRELVM v){
 static SQRESULT sq_SQLexer_nvalue(HSQUIRRELVM v){
 	SQ_FUNC_VARS_NO_TOP(v);
 	SQ_FUNC_VARS_NO_TOP(v);
 	GET_SQLexer_INSTANCE();
 	GET_SQLexer_INSTANCE();
@@ -270,6 +278,7 @@ static SQRegFunction SQLexer_obj_funcs[]={
 	_DECL_SQLEXER_FUNC(tok2str, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(tok2str, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(token_name, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(token_name, 2, _SC(".i")),
 	_DECL_SQLEXER_FUNC(lasterror, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(lasterror, 1, _SC(".")),
+	_DECL_SQLEXER_FUNC(isCharacter, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(longstr, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(longstr, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(svalue, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(svalue, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(nvalue, 1, _SC(".")),
 	_DECL_SQLEXER_FUNC(nvalue, 1, _SC(".")),

+ 6 - 3
SquiLu/squirrel/sqlexer.cpp

@@ -50,6 +50,7 @@ SQInteger SQLexer::ResetReader(SQLEXREADFUNC rg, SQUserPointer up, SQInteger lin
 	data->prevtoken = -1;
 	data->prevtoken = -1;
 	data->readcount = 0;
 	data->readcount = 0;
 	data->reached_eof = SQFalse;
 	data->reached_eof = SQFalse;
+	data->isCharacter = SQFalse;
 	return Next();
 	return Next();
 }
 }
 
 
@@ -789,6 +790,7 @@ try_again:
 		if(len == 0) return Error(_SC("empty constant"));
 		if(len == 0) return Error(_SC("empty constant"));
 		if(len > 1) return Error(_SC("constant too long"));
 		if(len > 1) return Error(_SC("constant too long"));
 		data->nvalue = data->longstr[0];
 		data->nvalue = data->longstr[0];
+		data->isCharacter = SQTrue;
 		return TK_INTEGER;
 		return TK_INTEGER;
 	}
 	}
 	data->svalue = &data->longstr[0];
 	data->svalue = &data->longstr[0];
@@ -930,6 +932,7 @@ SQInteger SQLexer::ReadNumber(SQInteger startChar)
 	if(!okNumber) Error(_SC("integer overflow %s"), &data->longstr[0]);
 	if(!okNumber) Error(_SC("integer overflow %s"), &data->longstr[0]);
 
 
 	rtype = TK_INTEGER;
 	rtype = TK_INTEGER;
+	data->isCharacter = SQFalse;
 	switch(type) {
 	switch(type) {
 	case TINT:
 	case TINT:
 	    switch(CUR_CHAR)
 	    switch(CUR_CHAR)
@@ -971,9 +974,9 @@ SQInteger SQLexer::ReadNumber(SQInteger startChar)
 	case THEX:
 	case THEX:
 	case TOCTAL:
 	case TOCTAL:
 	    //to allow 64 bits integers comment bellow
 	    //to allow 64 bits integers comment bellow
-        //if(itmp > INT_MAX) return Error(_SC("integer overflow %ulld %d"));
-        data->nvalue = (SQInteger) itmp;
-		return rtype;
+	    //if(itmp > INT_MAX) return Error(_SC("integer overflow %ulld %d"));
+	    data->nvalue = (SQInteger) itmp;
+	    return rtype;
 	}
 	}
 	return 0;
 	return 0;
 }
 }

+ 3 - 0
SquiLu/squirrel/sqlexer.h

@@ -23,6 +23,7 @@ struct SQLexerData
     LexChar currdata;
     LexChar currdata;
     SQInteger readcount;
     SQInteger readcount;
     SQBool reached_eof;
     SQBool reached_eof;
+    SQBool isCharacter;
     SQChar lasterror[256];
     SQChar lasterror[256];
     SQLexerData()
     SQLexerData()
     {
     {
@@ -36,6 +37,7 @@ struct SQLexerData
     {
     {
         curtoken = src->curtoken;
         curtoken = src->curtoken;
         reached_eof = src->reached_eof;
         reached_eof = src->reached_eof;
+        isCharacter = src->isCharacter;
         prevtoken = src->prevtoken;
         prevtoken = src->prevtoken;
         currentline = src->currentline;
         currentline = src->currentline;
         currentcolumn = src->currentcolumn;
         currentcolumn = src->currentcolumn;
@@ -54,6 +56,7 @@ struct SQLexerData
     {
     {
         curtoken = 0;
         curtoken = 0;
         reached_eof = SQFalse;
         reached_eof = SQFalse;
+        isCharacter = SQFalse;
         prevtoken = -1;
         prevtoken = -1;
         currentline = 0;
         currentline = 0;
         currentcolumn = 0;
         currentcolumn = 0;