Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 private static void SetAssignmentInfo <T> (ParserInfo.IAssignmentInfo info, object self, T val)
 {
     ((ParserInfo.AssignmentInfo <T>)info).Assign(self, val);
 }