/// <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); }
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)); }