Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
        // 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));
            }
        }
Beispiel #3
0
        /// <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);
        }