ADD_KEYWORD(vargv,TK_VARGV);\r
ADD_KEYWORD(true,TK_TRUE);\r
ADD_KEYWORD(false,TK_FALSE);\r
+ ADD_KEYWORD(static,TK_STATIC);\r
\r
_readf = rg;\r
_up = up;\r
SQInteger t = _readf(_up);\r
if(t > MAX_CHAR) Error(_SC("Invalid character"));\r
if(t != 0) {\r
- _currdata = t;\r
+ _currdata = (LexChar)t;\r
return;\r
}\r
_currdata = SQUIRREL_EOB;\r
}\r
else {\r
SQInteger c = CUR_CHAR;\r
- if (sciscntrl(c)) Error(_SC("unexpected character(control)"));\r
+ if (sciscntrl((int)c)) Error(_SC("unexpected character(control)"));\r
NEXT();\r
RETURN_TOKEN(c); \r
}\r
return TK_STRING_LITERAL;\r
}\r
\r
-SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }\r
+void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)\r
+{\r
+ *res = 0;\r
+ while(*s != 0)\r
+ {\r
+ if(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');\r
+ else if(scisxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);\r
+ else { assert(0); }\r
+ }\r
+}\r
\r
+void LexInteger(const SQChar *s,SQUnsignedInteger *res)\r
+{\r
+ *res = 0;\r
+ while(*s != 0)\r
+ {\r
+ *res = (*res)*10+((*s++)-'0');\r
+ }\r
+}\r
+\r
+SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }\r
+#define MAX_HEX_DIGITS (sizeof(SQInteger)*2)\r
SQInteger SQLexer::ReadNumber()\r
{\r
#define TINT 1\r
#define THEX 3\r
#define TSCIENTIFIC 4\r
SQInteger type = TINT, firstchar = CUR_CHAR;\r
- bool isfloat = false;\r
SQChar *sTemp;\r
INIT_TEMP_STRING();\r
NEXT();\r
APPEND_CHAR(CUR_CHAR);\r
NEXT();\r
}\r
- if(_longstr.size() > 8) Error(_SC("Hex number over 8 digits"));\r
+ if(_longstr.size() > MAX_HEX_DIGITS) Error(_SC("too many digits for an Hex number"));\r
}\r
else {\r
- APPEND_CHAR(firstchar);\r
+ APPEND_CHAR((int)firstchar);\r
while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {\r
if(CUR_CHAR == _SC('.')) type = TFLOAT;\r
if(isexponent(CUR_CHAR)) {\r
_fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp);\r
return TK_FLOAT;\r
case TINT:\r
- _nvalue = (SQInteger)scstrtol(&_longstr[0],&sTemp,10);\r
+ LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue);\r
return TK_INTEGER;\r
case THEX:\r
- *((SQUnsignedInteger *)&_nvalue) = scstrtoul(&_longstr[0],&sTemp,16);\r
+ LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue);\r
return TK_INTEGER;\r
}\r
return 0;\r
\r
SQInteger SQLexer::ReadID()\r
{\r
- SQInteger res, size = 0;\r
+ SQInteger res;\r
INIT_TEMP_STRING();\r
do {\r
APPEND_CHAR(CUR_CHAR);\r
} while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_'));\r
TERMINATE_BUFFER();\r
res = GetIDType(&_longstr[0]);\r
- if(res == TK_IDENTIFIER) {\r
+ if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) {\r
_svalue = &_longstr[0];\r
}\r
return res;\r