Example #1
0
        public ParserResult <IEnumerable <O>, C> Parse(ref ICloneableEnumerator <I> input, C context)
        {
            List <O> list = new List <O>();

            while (true)
            {
                try
                {
                    if (input.Available)
                    {
                        ParserResult <O, C> result = parser.Parse(ref input, context);
                        list.Add(result.Result);
                        context = result.Context;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (ParserException <I> e)
                {
                    if (loopToEnd)
                    {
                        throw;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(new ParserResult <IEnumerable <O>, C>(list, context));
        }
Example #2
0
        public ParserResult <Pair <A, B>, C> Parse(ref ICloneableEnumerator <I> input, C context)
        {
            ICloneableEnumerator <I> temp = input.CloneEnumerator();
            var resultA = a.Parse(ref temp, context);
            var resultB = b.Parse(ref temp, resultA.Context);

            input = temp;
            return(new ParserResult <Pair <A, B>, C>(new Pair <A, B>(resultA.Result, resultB.Result), resultB.Context));
        }
Example #3
0
 public ParserResult <O, C> Parse(ref ICloneableEnumerator <I> input, C context)
 {
     try
     {
         return(parser.Parse(ref input, context));
     }
     catch (ParserException <I> e)
     {
         return(handler(e));
     }
 }
Example #4
0
 public ParserResult <Lexer <I> .Token, C> Parse(ref ICloneableEnumerator <Lexer <I> .Token> input, C context)
 {
     if (input.Available && input.Current.Tag.CompareTo(value) == 0)
     {
         Lexer <I> .Token token = input.Current;
         input.MoveNext();
         return(new ParserResult <Lexer <I> .Token, C>(token, context));
     }
     else
     {
         throw new ParserException <Lexer <I> .Token>("此处需要" + name + "。", input);
     }
 }
Example #5
0
 public ParserResult <Lexer <I> .Token, C> Parse(ref ICloneableEnumerator <Lexer <I> .Token> input, C context)
 {
     if (input.Available)
     {
         string inputValue = input.Current.Value;
         string value      = values.Where(s => inputValue == s).FirstOrDefault();
         if (value != null)
         {
             Lexer <I> .Token token = input.Current;
             input.MoveNext();
             return(new ParserResult <Lexer <I> .Token, C>(token, context));
         }
     }
     throw new ParserException <Lexer <I> .Token>("此处需要" + name + "。", input);
 }
Example #6
0
        public virtual O Parse(string input)
        {
            if (lexer == null)
            {
                Initialize(out lexer, out parser);
            }
            ICloneableEnumerator <Lexer <I> .Token> tokens = lexer.Parse(input).Where(TokenFilter).GetCloneableEnumerable().CreateCloneableEnumerator();

            tokens.MoveNext();
            ParserResult <O, C> result = parser.Parse(ref tokens, CreateContext());

            if (tokens.Available)
            {
                throw new ParserException <Lexer <I> .Token>("存在没分析完的字符串。", tokens);
            }
            else
            {
                return(result.Result);
            }
        }
Example #7
0
 public ParserResult <O, C> Parse(ref ICloneableEnumerator <I> input, C context)
 {
     try
     {
         return(a.Parse(ref input, context));
     }
     catch (ParserException <I> eA)
     {
         try
         {
             return(b.Parse(ref input, context));
         }
         catch (ParserException <I> eB)
         {
             if (eA.Input.CompareTo(eB.Input) < 0)
             {
                 throw;
             }
         }
         throw;
     }
 }
Example #8
0
 public ParserException(string message, ICloneableEnumerator <T> input)
     : base(message)
 {
     this.Input = input;
 }
 public int CompareTo(ICloneableEnumerator <T> other)
 {
     return(index.CompareTo(((ListEnumerator <T>)other).index));
 }
Example #10
0
 public ParserResult <O, C> Parse(ref ICloneableEnumerator <I> input, C context)
 {
     return(parser.Parse(ref input, context));
 }
Example #11
0
 public ParserResult <O, C> Parse(ref ICloneableEnumerator <I> input, C context)
 {
     return(new ParserResult <O, C>(value, context));
 }
Example #12
0
        public ParserResult <B, C> Parse(ref ICloneableEnumerator <I> input, C context)
        {
            ParserResult <A, C> result = parser.Parse(ref input, context);

            return(new ParserResult <B, C>(converter(result.Result), result.Context));
        }