/// <summary>
        /// パースを行います。
        /// </summary>
        /// <param name="src"></param>
        /// <returns></returns>
        protected override ResultCore <char> DoParse(Reader src)
        {
            var ch  = src.Peek();
            var res = _original.Parse(src);

            return(res.Successful ? Success((char)ch) : Failure(res.Message));
        }
Beispiel #2
0
        public void ParseAsyncは内部パーサーと同じように失敗します()
        {
            var cursol = new Cursol("public");
            var parser = new CharParser('a');
            var tested = new RecursiveParser <char>(() => parser);

            (tested.Parse(cursol)).IsStructuralEqual(parser.Parse(cursol));
        }
Beispiel #3
0
        public void ParseAsyncは内部パーサーと同じように成功します()
        {
            var cursol = new Cursol("public");
            var parser = new CharParser('p');
            var tested = new DebugParser <char>(parser, () => { });

            (tested.Parse(cursol)).IsStructuralEqual(parser.Parse(cursol));
        }
Beispiel #4
0
        public void ParseAsyncはIgnoreCaseでない場合に大文字指定の場合に小文字を区別します()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('P');

            var(isSuccess, _, _) = tested.Parse(cursol);

            isSuccess.IsFalse();
        }
Beispiel #5
0
        public void ParseAsyncはIgnoreCaseで大文字指定でも小文字を識別します()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('P', true);

            var(isSuccess, _, _) = tested.Parse(cursol);

            isSuccess.IsTrue();
        }
Beispiel #6
0
        public void ParseAsyncは読み込みに成功した場合にその分進んだカーソルを返します()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('p');

            var result = tested.Parse(cursol);

            result.cursol.Index.Is(1);
        }
Beispiel #7
0
        public void ParseAsyncは指定していない文字を読み込みに失敗します()
        {
            var cursol = new Cursol("internal");
            var tested = new CharParser('p');

            var result = tested.Parse(cursol);

            result.isSuccess.IsFalse();
        }
Beispiel #8
0
        public void ParseAsyncは指定した文字を読み込みます()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('p');

            var result = tested.Parse(cursol);

            result.parsed.Is('p');
        }
Beispiel #9
0
        public void ParseAsyncは指定した文字を読み込みに成功します()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('p');

            var result = tested.Parse(cursol);

            result.isSuccess.IsTrue();
        }
Beispiel #10
0
        public void ParseAsyncはIgnoreCaseで大文字指定の場合に実際に識別した文字を結果とします()
        {
            var cursol = new Cursol("public");
            var tested = new CharParser('P', true);

            var(_, _, parsed) = tested.Parse(cursol);

            parsed.Is('p');
        }
        public void FailParse()
        {
            IScanner   scanner = Provider.Scanner;
            CharParser parser  = Prims.CharOf(NonMatchedChar);

            ParserMatch m = parser.Parse(scanner);

            Assert.IsTrue(!m.Success);
            Assert.AreEqual(scanner.Offset, 0);
        }
        public void SuccessParse()
        {
            IScanner   scanner = Provider.Scanner;
            CharParser parser  = Prims.CharOf(MatchedChar);

            ParserMatch m = parser.Parse(scanner);

            Assert.IsTrue(m.Success);
            Assert.AreEqual(m.Offset, 0);
            Assert.AreEqual(m.Length, 1);
            Assert.AreEqual(scanner.Offset, 1);
        }
Beispiel #13
0
        public ParserError(ParserMatch noMatch, string errorId, string errorMessage)
        {
            if (errorId == null)
            {
                throw new ArgumentNullException("errorId");
            }

            if (errorMessage == null)
            {
                throw new ArgumentNullException("errorMessage");
            }

            long errorOffset = noMatch.Offset + noMatch.Length;

            IScanner scanner        = noMatch.Scanner;
            long     originalOffset = scanner.Offset;
            long     lastLineOffset = 0;

            scanner.Offset = 0;
            Parser eol    = Prims.Eol;
            Parser notEol = new CharParser(delegate(Char c)
            {
                return(c != '\r' && c != '\n');
            });

            _line = 1; // 1 based not 0 based
            while (!scanner.AtEnd)
            {
                notEol.Parse(scanner);
                if (scanner.AtEnd)
                {
                    break;
                }
                ParserMatch match = eol.Parse(scanner);
                if (scanner.Offset > errorOffset)
                {
                    break;
                }
                if (match.Success)
                {
                    ++_line;
                    lastLineOffset = scanner.Offset;
                }
            }

            _column        = errorOffset - lastLineOffset + 1; // 1 based not 0 based
            scanner.Offset = originalOffset;
            _errorText     = errorMessage;
            _errorId       = errorId;
        }
Beispiel #14
0
 public static Either <TLeft, char> ParseToChar <TLeft>(this string source, TLeft left)
 {
     return(CharParser.Parse(source, left));
 }
Beispiel #15
0
 public static Either <TLeft, char> ParseToChar <TLeft>(this Either <TLeft, string> source, TLeft left)
 {
     return(source.FlatMap(x => CharParser.Parse(x, left)));
 }
Beispiel #16
0
 public static Maybe <char> ParseToChar(this string source)
 {
     return(CharParser.Parse(source));
 }