|
|
|
|
@ -124,7 +124,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -124,7 +124,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
errors.Error(Line, Col, String.Format("Invalid date time {0}", e)); |
|
|
|
|
} |
|
|
|
|
return new Token(Tokens.LiteralDate, x, y, s, time); |
|
|
|
|
return new Token(Tokens.LiteralDate, x, y, s, time, LiteralFormat.DateTimeLiteral); |
|
|
|
|
} else { |
|
|
|
|
ReadPreprocessorDirective(); |
|
|
|
|
continue; |
|
|
|
|
@ -217,9 +217,9 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -217,9 +217,9 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
if (s.Length == 0) { |
|
|
|
|
s = "\0"; |
|
|
|
|
} |
|
|
|
|
return new Token(Tokens.LiteralCharacter, x, y, '"' + s + "\"C", s[0]); |
|
|
|
|
return new Token(Tokens.LiteralCharacter, x, y, '"' + s + "\"C", s[0], LiteralFormat.CharLiteral); |
|
|
|
|
} |
|
|
|
|
return new Token(Tokens.LiteralString, x, y, '"' + s + '"', s); |
|
|
|
|
return new Token(Tokens.LiteralString, x, y, '"' + s + '"', s, LiteralFormat.StringLiteral); |
|
|
|
|
} |
|
|
|
|
Token token = ReadOperator(ch); |
|
|
|
|
if (token != null) { |
|
|
|
|
@ -294,7 +294,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -294,7 +294,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
if (ch == '&') { |
|
|
|
|
errors.Error(Line, Col, String.Format("digit expected")); |
|
|
|
|
} |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString() ,ch - '0'); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString() ,ch - '0', LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
if (ch == '.') { |
|
|
|
|
if (Char.IsDigit((char)ReaderPeek())) { |
|
|
|
|
@ -334,21 +334,24 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -334,21 +334,24 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
|
|
|
|
|
if (digit.Length == 0) { |
|
|
|
|
errors.Error(Line, Col, String.Format("digit expected")); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0, LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (ReaderPeek() != -1 && ("%&SILU".IndexOf(PeekUpperChar()) != -1 || ishex || isokt)) { |
|
|
|
|
ch = (char)ReaderPeek(); |
|
|
|
|
sb.Append(ch); |
|
|
|
|
ch = Char.ToUpper(ch, CultureInfo.InvariantCulture); |
|
|
|
|
bool unsigned = ch == 'U'; |
|
|
|
|
if (unsigned) { |
|
|
|
|
ReaderRead(); // read the U
|
|
|
|
|
if (ReaderPeek() != -1 && "%&SILU".IndexOf(PeekUpperChar()) != -1 || ishex || isokt) { |
|
|
|
|
bool unsigned = false; |
|
|
|
|
if (ReaderPeek() != -1) { |
|
|
|
|
ch = (char)ReaderPeek(); |
|
|
|
|
sb.Append(ch); |
|
|
|
|
ch = Char.ToUpper(ch, CultureInfo.InvariantCulture); |
|
|
|
|
if (ch != 'I' && ch != 'L' && ch != 'S') { |
|
|
|
|
errors.Error(Line, Col, "Invalid type character: U" + ch); |
|
|
|
|
unsigned = ch == 'U'; |
|
|
|
|
if (unsigned) { |
|
|
|
|
ReaderRead(); // read the U
|
|
|
|
|
ch = (char)ReaderPeek(); |
|
|
|
|
sb.Append(ch); |
|
|
|
|
ch = Char.ToUpper(ch, CultureInfo.InvariantCulture); |
|
|
|
|
if (ch != 'I' && ch != 'L' && ch != 'S') { |
|
|
|
|
errors.Error(Line, Col, "Invalid type character: U" + ch); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
@ -360,56 +363,57 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -360,56 +363,57 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
} |
|
|
|
|
if (ch == 'S') { |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (ushort)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (ushort)number, LiteralFormat.OctalNumber); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (short)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (short)number, LiteralFormat.OctalNumber); |
|
|
|
|
} else if (ch == '%' || ch == 'I') { |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (uint)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (uint)number, LiteralFormat.OctalNumber); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (int)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (int)number, LiteralFormat.OctalNumber); |
|
|
|
|
} else if (ch == '&' || ch == 'L') { |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (ulong)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (ulong)number, LiteralFormat.OctalNumber); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (long)number); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), (long)number, LiteralFormat.OctalNumber); |
|
|
|
|
} else { |
|
|
|
|
if (number > uint.MaxValue) { |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((long)number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((long)number), LiteralFormat.OctalNumber); |
|
|
|
|
} else { |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number), LiteralFormat.OctalNumber); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
LiteralFormat literalFormat = ishex ? LiteralFormat.HexadecimalNumber : LiteralFormat.DecimalNumber; |
|
|
|
|
if (ch == 'S') { |
|
|
|
|
ReaderRead(); |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt16.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt16.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int16.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int16.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
} else if (ch == '%' || ch == 'I') { |
|
|
|
|
ReaderRead(); |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
} else if (ch == '&' || ch == 'L') { |
|
|
|
|
ReaderRead(); |
|
|
|
|
if (unsigned) |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), UInt64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
else |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), literalFormat); |
|
|
|
|
} else if (ishex) { |
|
|
|
|
ulong number = UInt64.Parse(digit, NumberStyles.HexNumber); |
|
|
|
|
if (number > uint.MaxValue) { |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((long)number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((long)number), literalFormat); |
|
|
|
|
} else { |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number)); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), unchecked((int)number), literalFormat); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (OverflowException ex) { |
|
|
|
|
errors.Error(Line, Col, ex.Message); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0); |
|
|
|
|
return new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0, LiteralFormat.None); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
Token nextToken = null; // if we accedently read a 'dot'
|
|
|
|
|
@ -462,37 +466,37 @@ namespace ICSharpCode.NRefactory.Parser.VB
@@ -462,37 +466,37 @@ namespace ICSharpCode.NRefactory.Parser.VB
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
if (issingle) { |
|
|
|
|
return new Token(Tokens.LiteralSingle, x, y, sb.ToString(), Single.Parse(digit, CultureInfo.InvariantCulture)); |
|
|
|
|
return new Token(Tokens.LiteralSingle, x, y, sb.ToString(), Single.Parse(digit, CultureInfo.InvariantCulture), LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
if (isdecimal) { |
|
|
|
|
return new Token(Tokens.LiteralDecimal, x, y, sb.ToString(), Decimal.Parse(digit, NumberStyles.Currency | NumberStyles.AllowExponent, CultureInfo.InvariantCulture)); |
|
|
|
|
return new Token(Tokens.LiteralDecimal, x, y, sb.ToString(), Decimal.Parse(digit, NumberStyles.Currency | NumberStyles.AllowExponent, CultureInfo.InvariantCulture), LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
if (isdouble) { |
|
|
|
|
return new Token(Tokens.LiteralDouble, x, y, sb.ToString(), Double.Parse(digit, CultureInfo.InvariantCulture)); |
|
|
|
|
return new Token(Tokens.LiteralDouble, x, y, sb.ToString(), Double.Parse(digit, CultureInfo.InvariantCulture), LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
} catch (FormatException) { |
|
|
|
|
errors.Error(Line, Col, String.Format("{0} is not a parseable number", digit)); |
|
|
|
|
if (issingle) |
|
|
|
|
return new Token(Tokens.LiteralSingle, x, y, sb.ToString(), 0f); |
|
|
|
|
return new Token(Tokens.LiteralSingle, x, y, sb.ToString(), 0f, LiteralFormat.DecimalNumber); |
|
|
|
|
if (isdecimal) |
|
|
|
|
return new Token(Tokens.LiteralDecimal, x, y, sb.ToString(), 0m); |
|
|
|
|
return new Token(Tokens.LiteralDecimal, x, y, sb.ToString(), 0m, LiteralFormat.DecimalNumber); |
|
|
|
|
if (isdouble) |
|
|
|
|
return new Token(Tokens.LiteralDouble, x, y, sb.ToString(), 0.0); |
|
|
|
|
return new Token(Tokens.LiteralDouble, x, y, sb.ToString(), 0.0, LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
Token token; |
|
|
|
|
try { |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int32.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), ishex ? LiteralFormat.HexadecimalNumber : LiteralFormat.DecimalNumber); |
|
|
|
|
} catch (Exception) { |
|
|
|
|
try { |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number)); |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), Int64.Parse(digit, ishex ? NumberStyles.HexNumber : NumberStyles.Number), ishex ? LiteralFormat.HexadecimalNumber : LiteralFormat.DecimalNumber); |
|
|
|
|
} catch (FormatException) { |
|
|
|
|
errors.Error(Line, Col, String.Format("{0} is not a parseable number", digit)); |
|
|
|
|
// fallback, when nothing helps :)
|
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0); |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0, LiteralFormat.DecimalNumber); |
|
|
|
|
} catch (OverflowException) { |
|
|
|
|
errors.Error(Line, Col, String.Format("{0} is too long for a integer literal", digit)); |
|
|
|
|
// fallback, when nothing helps :)
|
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0); |
|
|
|
|
token = new Token(Tokens.LiteralInteger, x, y, sb.ToString(), 0, LiteralFormat.DecimalNumber); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
token.next = nextToken; |
|
|
|
|
|