/// <summary>
        /// Tries to parse whitespace
        /// </summary>
        /// <returns>
        /// Amount of newlines
        /// </returns>
        /// <param name='data'>
        /// Data to parse,
        /// </param>
        /// <param name='offset'>
        /// Offset in data
        /// </param>
        /// <param name='result'>
        /// Nothing
        /// </param>
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            Match oncomingWhitespace = whiteSpaceRegex.Match (
                session.Data.Substring (session.Offset));

            result = null;
            if (!oncomingWhitespace.Success)
                return -1;

            if (oncomingWhitespace.Index != 0)
                return -1;

            string consecSpace = oncomingWhitespace.Value;

            session.Offset += consecSpace.Length;

            int lastBreak = 0;

            for (int charI = 0; charI < consecSpace.Length; charI++) {
                if (consecSpace [charI] == '\n') {
                    lastBreak = charI;
                    session.CurrentLine++;
                }
            }

            session.CurrentColumn = consecSpace.Length - lastBreak;

            result = oncomingWhitespace.Value;
            return oncomingWhitespace.Length;
        }
        protected virtual int ParseListBody(ParsingSession session, ref List<object> target)
        {
            object parsed;

            bool coupled = true;

            while (coupled && (InnerParser.Run(session, out parsed) > 0)) {
                target.Add (parsed);
                coupled = false;
                while (coupler.Run (session) > 0)
                    coupled = true;
            }

            int closerResult = closer.Run (session);

            if (closerResult > 0) {
                return target.Count + 1;
            } else {
                string trail, ahead;
                trail = session.GetTrail();
                ahead = session.GetAhead();

                throw new ParsingException (session, closer, trail, ahead);
            }
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            // "
            if (session.Data[session.Offset] == '\"') {
                if (session.Data[session.Offset + 1] != '\"') {
                    string entirity, quotedText, escapedText, text;

                    // "cheese"
                    entirity = session.Data.Substring(session.Offset);

                    Match quoteMatch = stringRegex.Match (entirity);

                    quotedText = quoteMatch.Value;
                    escapedText = quotedText.Remove(quotedText.Length - 1, 1).Remove(0, 1);
                    text = Regex.Unescape(escapedText);

                    session.Offset += quotedText.Length;

                    result = text;
                    return text.Length;
                } else {
                    session.Offset += 2;
                    result = "";
                    return 1;
                }
            }

            result = null;
            return -1;
        }
Exemple #4
0
        private static List <Block> Parse(AssemblyDef assembly, XmlContainerCodeElement container, ParsingSession session)
        {
            List <Block>   blocks          = new List <Block>();
            ExceptionList  exceptions      = new ExceptionList();
            PermissionList permissions     = new PermissionList();
            Paragraph      inlineContainer = null;

            if (session == null)
            {
                session = new ParsingSession();
            }

            for (int counter = 0; counter < container.Elements.Count;)
            {
                if (container.Elements[counter].IsInline)
                {
                    inlineContainer = new Paragraph();
                    while (counter < container.Elements.Count && container.Elements[counter].IsInline)
                    {
                        inlineContainer.Inlines.Add(Parser.ParseInline(assembly, container.Elements[counter], session));
                        counter++;
                    }
                    blocks.Add(inlineContainer);
                    inlineContainer = null;
                }
                else
                {
                    Block block = Parser.ParseBlock(assembly, container.Elements[counter], session);
                    if (block != null)
                    {
                        if (block is ExceptionEntry)
                        {
                            exceptions.Add(block as ExceptionEntry);
                        }
                        else if (block is PermissionEntry)
                        {
                            permissions.Add(block as PermissionEntry);
                        }
                        else
                        {
                            blocks.Add(block);
                        }
                    }
                    counter++;
                }
            }

            if (exceptions.ExceptionCount > 0)
            {
                blocks.Add(exceptions);
            }
            if (permissions.Count > 0)
            {
                blocks.Add(permissions);
            }

            return(blocks);
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            for (int iParser = 0; iParser < AcceptedParsers.Count; iParser++)
                if (AcceptedParsers [iParser].Run (session, out result) > 0)
                    return iParser + 1;

            result = null;
            return -1;
        }
 public void TestHandover()
 {
     var session = new ParsingSession ("cherry cake", new WhitespaceParser ());
     object result;
     Assert.Less (SUT.Run (session, out result), 0);
     Assert.Greater ((new SequenceParser ("cherry")).Run (session, out result), 0);
     Assert.AreEqual ("cherry", result);
     Assert.Greater (SUT.Run (session, out result), 0);
     Assert.AreEqual ("cake", result);
 }
 public void TestSequentialHandover()
 {
     var session = new ParsingSession ("koekjes eten kaas", new WhitespaceParser ());
     object result;
     Assert.AreEqual (2, SUT.Run (session, out result));
     Assert.AreEqual ("koekjes", result);
     Assert.AreEqual (3, SUT.Run (session, out result));
     Assert.AreEqual ("eten", result);
     Assert.AreEqual (1, SUT.Run (session, out result));
     Assert.AreEqual ("kaas", result);
 }
 internal override int ParseMethod(ParsingSession session, out object result)
 {
     List<Tuple<string, object>> tuples;
     if (Parse<Tuple<string, object>>.TryListUsing(this.BlockParser, session, out tuples)) {
         result = Settings.FromTuples (tuples);
         return 1;
     } else {
         result = null;
         return -1;
     }
 }
 internal override int ParseMethod(ParsingSession session, out object result)
 {
     if (session.Data.Length > session.Offset) {
         if (session.Data [session.Offset] == TargetCharacter) {
             session.Offset++;
             result = TargetCharacter;
             return 1;
         }
     }
     result = null;
     return -1;
 }
 internal override int ParseMethod(ParsingSession session, out object result)
 {
     if (base.ParseMethod (session, out result) > 0) {
         var target = (IEnumerable<object>)result;
         StringBuilder mergedString = new StringBuilder ();
         foreach (object component in target) {
             mergedString.Append (component);
         }
         result = mergedString.ToString ();
         return mergedString.Length + 1;
     } else {
         return -1;
     }
 }
Exemple #11
0
        private object GetParsedValue(string serialValue)
        {
            ParsingSession session = new ParsingSession(serialValue, new WhitespaceParser());

            object value;

            if (valueParser.Run(session, out value) < 0)
            {
                return(serialValue);
            }
            else
            {
                return(value);
            }
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            int successValue = -1;

            if (opener.Run (session) > 0) {
                List<object> target = new List<object> ();
                successValue = ParseListBody (session, ref target);

                result = target;
            } else {
                result = null;
            }

            return successValue;
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            List<Settings> predefinitions = new List<Settings> ();

            object referenceCandidate;
            while (ReferenceParser.ParseMethod (session, out referenceCandidate) > 0) {
                if (referenceCandidate is Settings) {
                    predefinitions.Add ((Settings)referenceCandidate);
                } else {
                    throw new ParsingException (session, ReferenceParser, session.Ahead, session.Trail);
                }
            }

            result = predefinitions;
            return predefinitions.Count + 1;
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            result = "";

            var bookmark = session.Offset;

            foreach (Parser parserInSequence in parserSequence) {
                if (parserInSequence.Run (session) < 0) {
                    session.Offset = bookmark;
                    return -1;
                }
            }

            result = this.Sequence;

            return Sequence.Length;
        }
        /// <summary>
        /// Tries to parse an Identifier
        /// </summary>
        /// <returns>
        /// The parsed result
        /// </returns>
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            StringBuilder resultBuilder = new StringBuilder ();

            result = "";

            // d
            if (IsAlpha (session.Data [session.Offset]))
                resultBuilder.Append (session.Data [session.Offset++]);
            else
                return -1;

            while ((session.Data.Length > session.Offset) && Validator(session.Data[session.Offset])) {
                resultBuilder.Append (session.Data [session.Offset++]);
            }

            result = resultBuilder.ToString();
            return resultBuilder.Length;
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            if ((session.Data [session.Offset++] == 'f') && (session.Data[session.Offset] == '"')) {
                object fileNameObj;
                string fileName, fullPath;
                base.ParseMethod (session, out fileNameObj);
                fileName = (string)fileNameObj;

                fullPath = string.Format("{0}{1}{2}",
                    session.WorkingDirectory,
                    Path.DirectorySeparatorChar,
                    fileName);

                result = fullPath;
                return fullPath.Length;
            } else {
                session.Offset--;
                result = "";
                return -1;
            }
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            int succescode = 0;
            object unparsedIdentifier, dummy;
            CharacterParser leadingDot = new CharacterParser ('.');
            List<string> contextString = null;

            result = null;

            int bookmark = session.Offset;

            while (leadingDot.ParseMethod(session, out dummy) > 0) {
                if (contextString == null) {
                    contextString = new List<string>(session.Context.ToArray());
                    contextString.Reverse();
                }

                contextString.RemoveAt(contextString.Count - 1);
                succescode--;
            }

            string identifier = (contextString == null ? "" : string.Join(".", contextString.ToArray()) + ".");

            if (base.ParseMethod (session, out unparsedIdentifier) > 0) {
                identifier += unparsedIdentifier as String;

                if (session.References.Has (identifier)) {
                    result = session.References [identifier];
                    succescode = 1;
                } else {
                    session.Offset = bookmark;
                    if (succescode < 0)
                        throw new InvalidReferenceException (identifier);
                    else
                        succescode = -1;
                }
            }

            return succescode;
        }
        internal override int ParseMethod(ParsingSession session, out object result)
        {
            if (Parse<char>.Try (ExtensionMarker, session)) {
                var chainDefinition = Parse<Settings>.Using (ReferenceParser, session);

                if (chainDefinition == null) {
                    session.DeepenContext (Substitution);
                    chainDefinition = Parse<Settings>.Using (InnerParser, session);
                    session.SurfaceContext (Substitution);
                }

                if (chainDefinition == null) {
                    throw new ParsingException (session, InnerParser, session.Ahead, session.Trail);
                }

                result = chainDefinition;
                return 1;
            } else {
                result = null;
                return -1;
            }
        }
Exemple #19
0
        private static Inline ParseInline(AssemblyDef assembly, XmlCodeElement element, ParsingSession session)
        {
            TraceHelper.WriteLine("parsing-inline: e({0})", element.Element.ToString());

            switch (element.Element)
            {
            // Invalid elements
            case XmlCodeElements.Code:
            case XmlCodeElements.Example:
            case XmlCodeElements.Exception:
            case XmlCodeElements.List:
            case XmlCodeElements.ListHeader:
            case XmlCodeElements.ListItem:
            case XmlCodeElements.Include:
            case XmlCodeElements.Para:
            case XmlCodeElements.Param:
            case XmlCodeElements.Permission:
            case XmlCodeElements.Remarks:
            case XmlCodeElements.Returns:
            case XmlCodeElements.Summary:
            case XmlCodeElements.TypeParam:
            case XmlCodeElements.Value:
                InvalidOperationException ex = new InvalidOperationException(
                    "Found a block level element where an inline element was expected."
                    );
                ex.Data["element"] = element;
                throw ex;

            case XmlCodeElements.B:
                return(new Bold(new Run(element.Text)));

            case XmlCodeElements.C:
                return(new C(element.Text));

            case XmlCodeElements.I:
                return(new Italic(new Run(element.Text)));

            case XmlCodeElements.ParamRef:
                return(new Italic(new Run(element.Text)));

            case XmlCodeElements.See:
                SeeXmlCodeElement seeElement = element as SeeXmlCodeElement;
                string            displayName;
                CrefEntryKey      key;
                if (Parser.ResolveMember(seeElement.Text, seeElement.Member, assembly, out key, out displayName))
                {
                    return(new See(key, displayName));
                }
                else
                {
                    return(new Run(displayName));
                }

            case XmlCodeElements.SeeAlso:
                SeeAlsoXmlCodeElement seeAlsoElement = element as SeeAlsoXmlCodeElement;
                // key and displayname defined in see
                if (Parser.ResolveMember(seeAlsoElement.Text, seeAlsoElement.Member, assembly, out key, out displayName))
                {
                    return(new SeeAlso(key, displayName));
                }
                else
                {
                    return(new SeeAlso(displayName));
                }

            case XmlCodeElements.Text:
                return(new Run(element.Text));

            case XmlCodeElements.TypeParamRef:
                return(new Italic(new Run(element.Text)));
            }

            throw new Exception("Unknown inline parsing error.");
        }
Exemple #20
0
        private static Block ParseBlock(AssemblyDef assembly, XmlCodeElement element, ParsingSession session)
        {
            TraceHelper.WriteLine("parsing-block: e({0})", element.Element.ToString());

            CrefEntryKey crefEntryKey;
            Inline       link;
            string       displayName;

            switch (element.Element)
            {
            // Invalid inline elements
            case XmlCodeElements.C:
            case XmlCodeElements.ParamRef:
            case XmlCodeElements.See:
            case XmlCodeElements.SeeAlso:
            case XmlCodeElements.Text:
            case XmlCodeElements.TypeParamRef:
                InvalidOperationException ex = new InvalidOperationException(
                    "Found an inline element where a block level element was expected."
                    );
                ex.Data["element"] = element;
                throw ex;

            case XmlCodeElements.Include:
                InvalidOperationException includeEx = new InvalidOperationException(
                    "Found an include comment element, the c# parser has failed."
                    );
                includeEx.Data["element"] = element;
                throw includeEx;

            // End points
            case XmlCodeElements.Code:
                return(new Code(element.Text));

            case XmlCodeElements.Exception:
                ExceptionXmlCodeElement exceptionElement = element as ExceptionXmlCodeElement;

                if (Parser.ResolveMember(exceptionElement.Text, exceptionElement.Member, assembly, out crefEntryKey, out displayName))
                {
                    link = link = Parser.CreateHyperlink(crefEntryKey, exceptionElement.Member.TypeName);
                }
                else
                {
                    if (string.IsNullOrEmpty(displayName))
                    {
                        link = new Run(exceptionElement.Member.TypeName);
                    }
                    else
                    {
                        link = new Run(displayName);
                    }
                }

                return(new ExceptionEntry(link, Parser.Parse(assembly, element as ExceptionXmlCodeElement)));

            case XmlCodeElements.Example:
                ExampleXmlCodeElement exampleElement = element as ExampleXmlCodeElement;
                return(new Example(Parser.Parse(assembly, exampleElement)));

            case XmlCodeElements.Para:
                ParaXmlCodeElement paraElement = element as ParaXmlCodeElement;
                return(new Para(Parser.Parse(assembly, paraElement)));

            case XmlCodeElements.Permission:
                PermissionXmlCodeElement permissionElement = element as PermissionXmlCodeElement;

                if (Parser.ResolveMember(permissionElement.Text, permissionElement.Member, assembly, out crefEntryKey, out displayName))
                {
                    link = link = Parser.CreateHyperlink(crefEntryKey, permissionElement.Member.TypeName);
                }
                else
                {
                    if (string.IsNullOrEmpty(displayName))
                    {
                        link = new Run(permissionElement.Member.TypeName);
                    }
                    else
                    {
                        link = new Run(displayName);
                    }
                }

                return(new PermissionEntry(link, Parser.Parse(assembly, element as PermissionXmlCodeElement)));

            case XmlCodeElements.Remarks:
                return(new Remarks(Parser.Parse(assembly, element as RemarksXmlCodeElement)));

            case XmlCodeElements.Returns:
                return(new Returns(Parser.Parse(assembly, element as ReturnsXmlCodeElement)));

            case XmlCodeElements.Summary:
                return(new Summary(Parser.Parse(assembly, element as SummaryXmlCodeElement)));

            case XmlCodeElements.Value:
                return(new Value(Parser.Parse(assembly, element as ValueXmlCodeElement)));

            case XmlCodeElements.Param:
                return(new Param(((ParamXmlCodeElement)element).Name, Parser.Parse(assembly, element as ParamXmlCodeElement)));

            case XmlCodeElements.TypeParam:
                TypeParamXmlCodeElement typeParamElement = (TypeParamXmlCodeElement)element;
                return(new TypeParamEntry(typeParamElement.Name, typeParamElement.Text));

            case XmlCodeElements.List:
                ListXmlCodeElement listElement = (ListXmlCodeElement)element;
                return(Parser.ParseList(assembly, listElement));

            case XmlCodeElements.Term:
            case XmlCodeElements.Description:
                Section termOrDescription = new Section();
                termOrDescription.Blocks.AddRange(Parser.Parse(assembly, (XmlContainerCodeElement)element));
                return(termOrDescription);

                break;
            }

            throw new Exception("WTF, block parsing error");
        }