Merge branch 'master' of github.com:buggins/dlangide

This commit is contained in:
Vadim Lopatin 2015-02-18 09:52:20 +03:00
commit 91591afb65
1 changed files with 23 additions and 22 deletions

View File

@ -2029,39 +2029,40 @@ class Tokenizer
} }
protected Token processDecNumber(dchar c) { protected Token processDecNumber(dchar c) {
_pos--;
_sharedIntegerToken.setPos(_startLine, _startPos); _sharedIntegerToken.setPos(_startLine, _startPos);
_sharedRealToken.setPos(_startLine, _startPos); _sharedRealToken.setPos(_startLine, _startPos);
if (_pos >= _len) //if (_pos >= _len)
return parserError("Unexpected end of line in number", _sharedIntegerToken); // return parserError("Unexpected end of line in number", _sharedIntegerToken);
int digits = 0; int digits = 1;
ulong number = 0; ulong number = c - '0';
int i = _pos; int i = _pos;
bool overflow = false; bool overflow = false;
for (;i < _len; i++) { if (_line == _startLine) {
dchar ch = _lineText[i]; for (;i < _len; i++) {
uint digit = 0; dchar ch = _lineText[i];
if (ch >= '0' && ch <= '9') uint digit = 0;
digit = ch - '0'; if (ch >= '0' && ch <= '9')
else if (ch == '_') digit = ch - '0';
continue; else if (ch == '_')
else continue;
break; else
number *= 10;
if (digits >= 18) {
if ((number * 10) / 10 != number) {
overflow = true;
break; break;
number *= 10;
if (digits >= 18) {
if ((number * 10) / 10 != number) {
overflow = true;
break;
}
} }
number += digit;
digits++;
} }
number += digit; _pos = i;
digits++;
} }
_pos = i;
if (overflow) if (overflow)
return parserError("number is too big to fit 64 bits", _sharedIntegerToken); return parserError("number is too big to fit 64 bits", _sharedIntegerToken);
_sharedIntegerToken.setValue(number); _sharedIntegerToken.setValue(number);
dchar next = _pos < _len ? _lineText[_pos] : 0; dchar next = _line == _startLine && _pos < _len ? _lineText[_pos] : 0;
if (next == 0) if (next == 0)
return _sharedIntegerToken; return _sharedIntegerToken;
if (next == 'e' || next == 'E') { if (next == 'e' || next == 'E') {