/// <summary> /// Reads a STON document from a given text reader, with whitelists of known application extensions and rules determining valid application extension names. /// </summary> /// <param name="reader">The text reader to read the document from.</param> /// <param name="knownApplicationExtensionTypes">The whitelist of known application extension types.</param> /// <param name="knownApplicationExtensionMembers">The whitelist of known application extension members.</param> /// <param name="extensionTypesRule">The rule determining if a given name is a valid application extension type name.</param> /// <param name="extensionMembersRule">The rule determining if a given name is a valid application extension member name.</param> /// <returns>The read STON document.</returns> public IStonDocument ReadDocument( TextReader reader, IEnumerable <string> knownApplicationExtensionTypes, IEnumerable <string> knownApplicationExtensionMembers, Func <string, bool> extensionTypesRule, Func <string, bool> extensionMembersRule ) { if (reader == null) { throw new ArgumentNullException("reader"); } var tokenReader = new StonTokenReader(reader); tokenReader.PeekSignificant(); var entity = _ReadEntity(tokenReader, false); if (!tokenReader.Peek().HasChartype(StonChartype.EOS)) { throw tokenReader.MakeUnexpectedCharacterException(StonChartype.EOS, $"Unexpected character after the valid entity: '{(char)tokenReader.Peek()}'."); } if (!(entity is IStonValuedEntity)) { throw new StonException("The parsed entity is not a valid document core."); } return(DocumentFactory.CreateDocument(entity as IStonValuedEntity, knownApplicationExtensionTypes, knownApplicationExtensionMembers, extensionTypesRule, extensionMembersRule)); }
// reads a STON address initial context private IStonInitialContext ReadInitialContext(StonTokenReader reader) { int addressOpen = reader.ExpectChartype(StonChartype.AddressBegin); // reference defining context if (addressOpen == '$') { reader.PeekSignificant(); return(ElementFactory.CreateAncestorInitialContext(0)); } else if (addressOpen == '^') { // document core if (reader.Peek() == '*') { reader.ReadAndSkip(); return(ElementFactory.CreateGlobalEntityInitialContext("")); } // reference defining context ancestor else { int ancestorOrder = 1; reader.PeekSignificant(); while (reader.TryAndSkip(StonChartype.AncestorAccess)) { ++ancestorOrder; } return(ElementFactory.CreateAncestorInitialContext(ancestorOrder)); } } // globally identified entity else { reader.PeekSignificant(); string globalIdentifier = reader.ReadCanun(); return(ElementFactory.CreateGlobalEntityInitialContext(globalIdentifier)); } }
/// <summary> /// Reads a STON entity from a given text reader. /// </summary> /// <param name="reader">The text reader to read the entity from.</param> /// <returns>The read STON entity.</returns> public IStonEntity ReadEntity(TextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } var tokenReader = new StonTokenReader(reader); tokenReader.PeekSignificant(); var entity = _ReadEntity(tokenReader, false); if (!tokenReader.Peek().HasChartype(StonChartype.EOS)) { throw tokenReader.MakeUnexpectedCharacterException(StonChartype.EOS, $"Unexpected character after the valid entity: '{(char)tokenReader.Peek()}'."); } return(entity); }