private UDMFToken?ParseAssignment_Expr(object block, ParserInfo.IAssignmentInfo data) { UDMFToken tok = scanner.Scan(); if (tok.Type != UDMFTokenType.EQSIGN) { Errors.Add(new UDMFParseError("Unexpected token '" + tok.Text.ToString().Replace("\n", "") + "' found. Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.EQSIGN), 0x1001, tok)); return(null); } var valTok = scanner.Scan(); var valTokText = valTok.Text; if (data != null) { switch (Type.GetTypeCode(data.PropType)) { case TypeCode.Boolean: { bool?val = BoolFromSpan(valTokText); if (!val.HasValue) { Errors.Add(new UDMFParseError("Expected bool, got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } SetAssignmentInfo(data, block, val.Value); } break; case TypeCode.Int32: { if (valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.INTEGER) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } if (!int.TryParse(valTokText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val)) { int.TryParse(valTokText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val); } SetAssignmentInfo(data, block, val); } break; case TypeCode.Int64: { if (valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.INTEGER) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } if (!uint.TryParse(valTokText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val)) { uint.TryParse(valTokText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val); } SetAssignmentInfo(data, block, val); } break; case TypeCode.UInt32: { if (valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.INTEGER) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } if (!long.TryParse(valTokText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val)) { long.TryParse(valTokText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val); } SetAssignmentInfo(data, block, val); } break; case TypeCode.UInt64: { if (valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.INTEGER) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } if (!ulong.TryParse(valTokText, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val)) { ulong.TryParse(valTokText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val); } SetAssignmentInfo(data, block, val); } break; case TypeCode.Single: { if (valTok.Type != UDMFTokenType.FLOAT && valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.FLOAT) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } float.TryParse(valTokText, NumberStyles.Integer | NumberStyles.Float, CultureInfo.InvariantCulture, out var val); SetAssignmentInfo(data, block, val); } break; case TypeCode.Double: { if (valTok.Type != UDMFTokenType.FLOAT && valTok.Type != UDMFTokenType.INTEGER) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.FLOAT) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } double.TryParse(valTokText, NumberStyles.Integer | NumberStyles.Float, CultureInfo.InvariantCulture, out var val); SetAssignmentInfo(data, block, val); } break; case TypeCode.String: if (valTok.Type != UDMFTokenType.QUOTED_STRING) { Errors.Add(new UDMFParseError("Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.QUOTED_STRING) + ", got " + UDMFToken.TokenTypeToString(valTok.Type) + ".", 0x1001, valTok)); break; } SetAssignmentInfo(data, block, CleanUpQuotedString(valTokText)); break; default: throw new NotImplementedException(); } } tok = scanner.Scan(); if (tok.Type != UDMFTokenType.SEMICOLON) { Errors.Add(new UDMFParseError("Unexpected token '" + tok.Text.ToString().Replace("\n", "") + "' found. Expected " + UDMFToken.TokenTypeToString(UDMFTokenType.SEMICOLON), 0x1001, tok)); return(null); } return(valTok); }
private static void SetAssignmentInfo <T> (ParserInfo.IAssignmentInfo info, object self, T val) { ((ParserInfo.AssignmentInfo <T>)info).Assign(self, val); }