/// <summary> /// Resolves a provided reference of forms "X" or "X.Y" and passes back the first given or /// derivation which matches. /// </summary> /// <param name="reference">The string reference for the given or derivative</param> /// <returns>An IValue representing either the given or derivation the reference points to.</returns> internal IValue ResolveReference(string reference, string ElementScope) { //Find near givens with a full reference first. IValue val = Givens.Find(t => t.Key == ElementScope + "." + reference); if (val == null) { //Ok, try near givens with a partial reference val = Givens.Find(t => t.Key == reference); } //Ok, givens exhausted; find me a derivation with that reference. if (val == null) { string[] references = reference.Split('.'); Element el = Elements.Find(t => t.ElementName == references[0]); if (el == null) { throw new ArgumentException("Unable to reference expression element"); } val = el.Derivations.Find(t => t.Name == references[1]); } return(val); }