Пример #1
0
    private bool Accept <TInput, TOutput>(IfParser <TInput, TOutput> p, BnfStringifyVisitor state)
    {
        var children = p.GetChildren().ToArray();

        state.Append("IF ", children[0], " THEN ", children[1], " ELSE ", children[2]);
        return(true);
    }
Пример #2
0
 public override Parser <TInput> VisitIf(IfParser <TInput> parser)
 {
     if (state.State == 0)
     {
         state.State = 1;
         return(parser.Test);
     }
     else if (state.State == 1)
     {
         var length = state.LastResult;
         if (length < 0)
         {
             state.InputLength = length;
             return(null);
         }
         else
         {
             state.State = 2;
             return(parser.Parser);
         }
     }
     else
     {
         state.InputLength = state.LastResult;
         return(null);
     }
 }
Пример #3
0
        public override int VisitIf <TOutput>(IfParser <TInput, TOutput> parser, int start)
        {
            var oldPrevWasMissing = _prevWasMissing;

            var length = Search(parser.Test, start);

            if (length < 0)
            {
                return(length);
            }

            _prevWasMissing = oldPrevWasMissing;
            return(Search(parser.Parser, start));
        }
        public void TestParseCplx()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "document_dontworking_if.xml"))
            {
                var doc          = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser          = new IfParser();
                var startElement    = TraverseUtils.TagElement(documentRoot, "If");
                var endElement      = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var          ifProcessor = (IfProcessor)parentProcessor.Processors.First();
                var          ifTag       = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);

                //Assert.IsTrue(IfCondition.Equals(ifTag.Conidition));
                CollectionAssert.AreEqual(Encoding.UTF8.GetBytes(IfCondition), Encoding.UTF8.GetBytes(ifTag.Conidition));

                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var elements = ifTag.IfContent.ToList();

                Assert.AreEqual(1, elements.Count());

                /*
                 * Assert.IsTrue(elements.Take(6).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(6).Take(1).All(e => e.Name.Equals(WordMl.ParagraphName)));
                 * Assert.IsTrue(elements.Skip(7).Take(1).All(e => e.Name.Equals(WordMl.ParagraphPropertiesName)));
                 * Assert.IsTrue(elements.Skip(8).Take(1).All(e => e.Name.Equals(WordMl.BookmarkStartName)));
                 * Assert.IsTrue(elements.Skip(9).Take(4).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(13).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                 * Assert.IsTrue(elements.Skip(14).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));
                 * Assert.IsTrue(elements.Skip(15).Take(1).All(e => e.Name.Equals(WordMl.ProofingErrorAnchorName)));
                 * Assert.IsTrue(elements.Skip(16).Take(1).All(e => e.Name.Equals(WordMl.TextRunName)));
                 */
                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);
            }
        }
        public void TestParse()
        {
            using (var docStream = AssemblyResourceHelper.GetResourceStream(this, "IfParserTest.xml"))
            {
                var doc          = XDocument.Load(docStream);
                var documentRoot = doc.Root.Element(WordMl.WordMlNamespace + "body");

                var parser          = new IfParser();
                var startElement    = TraverseUtils.TagElement(documentRoot, "If");
                var endElement      = TraverseUtils.TagElement(documentRoot, "EndIf");
                var parentProcessor = new RootProcessor();
                parser.Parse(parentProcessor, startElement);

                var          ifProcessor = (IfProcessor)parentProcessor.Processors.First();
                var          ifTag       = ifProcessor.Tag;
                const string IfCondition = "//test/condition";

                Assert.IsNotNull(ifProcessor);
                Assert.AreEqual(IfCondition, ifTag.Conidition);
                var content = ifTag.IfContent.ToList();
                Assert.AreEqual(1, content.Count);
                Assert.AreEqual(WordMl.ParagraphName, content[0].Name);
                var paragraphChildren = content[0].Elements().ToList();
                Assert.AreEqual(6, paragraphChildren.Count());
                Assert.AreEqual(WordMl.ParagraphPropertiesName, paragraphChildren[0].Name);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[1].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[2].Name);
                Assert.AreEqual("Hello", paragraphChildren[2].Value);
                Assert.AreEqual(WordMl.ProofingErrorAnchorName, paragraphChildren[3].Name);
                Assert.AreEqual(WordMl.TextRunName, paragraphChildren[4].Name);
                Assert.AreEqual(", World!", paragraphChildren[4].Value);
                Assert.AreEqual(WordMl.SdtName, paragraphChildren[5].Name);
                Assert.IsTrue(paragraphChildren[5].IsTag("text"));
                Assert.AreEqual(startElement, ifTag.StartIf);
                Assert.AreEqual(endElement, ifTag.EndIf);

                var textProcessor = (TextProcessor)ifProcessor.Processors.FirstOrDefault();
                Assert.IsNotNull(textProcessor);
                Assert.IsNotNull(textProcessor.TextTag);
                Assert.AreEqual("//test/text", textProcessor.TextTag.Expression);
            }
        }
Пример #6
0
            public override Parser <TInput> VisitIf <TOutput>(IfParser <TInput, TOutput> parser)
            {
                if (state.State == 0)
                {
                    var length = parser.Test.Scan(source, state.InputStart);

                    if (length < 0)
                    {
                        state.InputLength = length;
                        return(null);
                    }
                    else
                    {
                        state.State = 1;
                        return(parser.Parser);
                    }
                }
                else
                {
                    state.InputLength = state.LastResult;
                    return(null);
                }
            }
Пример #7
0
        public override int VisitIf(IfParser <TInput> parser, int start)
        {
            var oldPrevWasMissing = _prevWasMissing;

            var length = parser.Test.Scan(_source, start);

            if (length >= 0)
            {
                _prevWasMissing = oldPrevWasMissing;
                length          = Search(parser.Parser, start);
            }
            else
            {
                _prevWasMissing = oldPrevWasMissing;
                length          = Search(parser.Test, start);
            }

            if (length < 0)
            {
                _prevWasMissing = oldPrevWasMissing;
            }

            return(length);
        }
 public override void VisitIf(IfParser <TInput> parser)
 {
     this.Visit(parser.Parser);
 }
 public override Parser <TInput> VisitIf(IfParser <TInput> parser)
 {
     return(NextIf(parser.Test, parser.Parser));
 }
Пример #10
0
        public static bool Parse(SyntaxContext context, int position)
        {
            var list     = context.list;
            var offset   = 0;
            var index    = position;
            var count    = 0;
            var isMissed = false;

            count = 0;
            while (true)
            {
                while (ReturnParser.Parse(context, index))
                {
                    ;
                }
                while (BreakParser.Parse(context, index))
                {
                    ;
                }
                while (DoParser.Parse(context, index))
                {
                    ;
                }
                while (WhileParser.Parse(context, index))
                {
                    ;
                }
                while (ForNParser.Parse(context, index))
                {
                    ;
                }
                while (ForParser.Parse(context, index))
                {
                    ;
                }
                while (ForEachParser.Parse(context, index))
                {
                    ;
                }
                while (FunctionNParser.Parse(context, index))
                {
                    ;
                }
                while (FunctionSParser.Parse(context, index))
                {
                    ;
                }
                while (IfParser.Parse(context, index))
                {
                    ;
                }
                while (IfElseParser.Parse(context, index))
                {
                    ;
                }
                while (DefineNParser.Parse(context, index))
                {
                    ;
                }
                while (CallParser.Parse(context, index))
                {
                    ;
                }
                while (BindParser.Parse(context, index))
                {
                    ;
                }
                while (BindNParser.Parse(context, index))
                {
                    ;
                }
                if (context.isMissed)
                {
                    context.isMissed = false;
                    offset          += 1;
                    index            = position + offset;
                    count           += 1;
                    break;
                }
                if (!list[index].isStatement)
                {
                    break;
                }
                else
                {
                    // ignored
                }
                offset += 1;
                index   = position + offset;
                count  += 1;
            }
            if (count == 0)
            {
                return(false);
            }
            context.Insert(position, ExpressionCreator.CreateModule(list, position, offset));
            context.Remove(position + 1, offset);
            return(true);
        }