Beispiel #1
0
        /// <summary>
        /// Registers a given SimplType into one of the relevant type registries.
        /// </summary>
        /// <param name="type">Type to register</param>
        /// <returns>True if it succeded, false if it was not registered, exception if an issue occurred or the type would not fit in a category.</returns>
        public static bool RegisterSimplType(SimplType type)
        {
            bool result = false;

            result |= ScalarTypes.TryAdd(type);
            result |= CollectionTypes.TryAdd(type);
            result |= CompositeTypes.TryAdd(type);
            result |= SimplTypes.TryAdd(type);

            return(result);
        }
Beispiel #2
0
        private CompositeSymbolRef TryParseCompositeRecursive(Expression expr)
        {
            Func <ASTNode> compositeParser = () =>
            {
                Expression   lhs, rhs;
                VariableType lhsType;
                lhs     = expr;
                lhsType = lhs.ResolveType();

                var token = Tokens.ConsumeToken(TokenType.Dot);
                if (token == null)
                {
                    return(null);
                }

                rhs = TryParseBasicRef(lhs) ?? TryParseFunctionCall() ?? (Expression)null;
                if (rhs == null)
                {
                    return(Error("Expected a valid member name to follow the dot!", CurrentPosition, CurrentPosition.GetModifiedPosition(0, 1, 1)));
                }

                if (!CompositeTypes.Contains(lhsType.NodeType))
                {
                    return(Error("Left side symbol is not of a composite type!", CurrentPosition, CurrentPosition.GetModifiedPosition(0, 1, 1)));
                }

                while (CurrentTokenType == TokenType.Dot)
                {
                    return(TryParseCompositeRecursive(new CompositeSymbolRef(lhs, rhs, lhs.StartPos, rhs.EndPos)));
                }

                return(new CompositeSymbolRef(lhs, rhs, lhs.StartPos, rhs.EndPos));
            };

            return((CompositeSymbolRef)Tokens.TryGetTree(compositeParser));
        }