Skip to content

Commit 8e4e7cd

Browse files
committed
Lookahead parser, fix work with lookahead, fix placeholder parser
1 parent 391a55e commit 8e4e7cd

File tree

6 files changed

+70
-83
lines changed

6 files changed

+70
-83
lines changed

src/SimpleStateMachine.StructuralSearch.Sandbox/Custom/ILookaheadParser.cs

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using Pidgin;
3+
4+
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
5+
{
6+
public abstract class LookaheadParser<TToken, T> : Parser<TToken, T>
7+
{
8+
private Parser<TToken, T> _parser { get; set; }
9+
10+
public abstract Parser<TToken, T> BuildParser<Res1, Res2>(Func<Parser<TToken, Res1>> next,
11+
Func<Parser<TToken, Res2>> nextNext);
12+
13+
public void Lookahead<Res1, Res2>(Func<Parser<TToken, Res1>> next, Func<Parser<TToken, Res2>> nextNext)
14+
{
15+
_parser = BuildParser(next, nextNext);
16+
}
17+
18+
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expected,
19+
out T result)
20+
{
21+
return _parser.TryParse(ref state, ref expected, out result);
22+
}
23+
}
24+
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Custom/Parsers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken,
4545
}
4646

4747

48-
public static Parser<TToken, R> Series<TToken, T, R>(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>, R> func)
48+
public static Parser<TToken, R> Series<TToken, T, R>(IEnumerable<Parser<TToken, T>> parsers,
49+
Func<IEnumerable<T>, R> func)
4950
{
5051
if (parsers == null)
5152
throw new ArgumentNullException(nameof (parsers));
Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
34
using Pidgin;
45
using SimpleStateMachine.StructuralSearch.Sandbox.Extensions;
56

67
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
78
{
8-
public class PlaceholderParser: Parser<char, SourceMatch>, ILookaheadParser<char, SourceMatch>
9+
public class PlaceholderParser: LookaheadParser<char, SourceMatch>
910
{
1011
public string Name { get; }
1112

@@ -14,33 +15,26 @@ public PlaceholderParser(string name)
1415
Name = name;
1516
}
1617

17-
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expecteds, out SourceMatch result)
18+
public override Parser<char, SourceMatch> BuildParser<Res1, Res2>(Func<Parser<char, Res1>> next, Func<Parser<char, Res2>> nextNext)
1819
{
19-
throw new NotImplementedException();
20-
}
21-
22-
public bool TryParse<Res1, Res2>(
23-
Parser<char, Res1> next,
24-
Parser<char, Res2> nextNext,
25-
ref ParseState<char> state,
26-
ref PooledList<Expected<char>> expected,
27-
out SourceMatch result)
28-
{
29-
var lookahead = Parser.Lookahead(next.Then(nextNext).Try());
30-
var anyString= Parser<char>.Any.AtLeastOnceAsStringUntil(lookahead).Try();
31-
var token = Parser.OneOf(anyString, CommonParser.WhiteSpaces).AtLeastOnce();
20+
var _next = next();
21+
var _nextNext = nextNext();
22+
var lookahead = Parser.Lookahead(_next.Then(_nextNext).Try());
23+
var anyString = Parser<char>.Any.AtLeastOnceAsStringUntil(lookahead)
24+
.Try();
25+
26+
var simpleString = CommonTemplateParser.StringWithoutParenthesisedAndWhiteSpaces;
27+
var token = Parser.OneOf(simpleString, CommonParser.WhiteSpaces)
28+
.AtLeastOnce();
3229
Parser<char, IEnumerable<string>> term = null;
3330

3431
var parenthesised = Parsers.BetweenOneOfChars(Parsers.Stringc,
3532
Parser.Rec(() => term),
3633
Constant.AllParenthesised);
3734

3835
term = Parser.OneOf(token, parenthesised).AtLeastOnce().MergerMany();
39-
40-
var parser = term.JoinToString().AsMatch();
41-
42-
return parser.TryParse(ref state, ref expected, out result);
36+
var parser = Parser.OneOf(parenthesised.JoinToString(), anyString).AsMatch();
37+
return parser;
4338
}
44-
4539
}
4640
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Custom/SeriesParser.cs

Lines changed: 25 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,43 @@ namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
77
{
88
public class SeriesParser<TToken, T, R>: Parser<TToken, R>
99
{
10-
private readonly Func<IEnumerable<T>, R> _func;
10+
private readonly Func<IEnumerable<T>, R> _getResult;
1111
private readonly IEnumerable<Parser<TToken, T>> parsers;
1212

13-
public SeriesParser(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>, R> func)
13+
public SeriesParser(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>, R> getResult)
1414
{
15-
this._func = func;
15+
this._getResult = getResult;
1616
this.parsers = parsers;
1717
}
18-
19-
// public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expecteds, out R result)
20-
// {
21-
// var results = new List<T>();
22-
// foreach (var parser in parsers)
23-
// {
24-
// if (!parser.TryParse(ref state, ref expecteds, out var _result))
25-
// {
26-
// result = default (R);
27-
// return false;
28-
// }
29-
// Console.WriteLine($"R: {_result}");
30-
// results.Add(_result);
31-
// }
32-
//
33-
// result = _func(results);
34-
// return true;
35-
// }
36-
37-
18+
3819
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expecteds, out R result)
3920
{
4021
var results = new List<T>();
41-
for (int i = 0; i < parsers.Count(); i++)
22+
var count = parsers.Count();
23+
24+
for (var i = count - 1; i > 0 ; i--)
4225
{
43-
T _result;
44-
var parser = parsers.ElementAt(i);
45-
46-
if (parser is ILookaheadParser<TToken, T> lookaheadParser)
26+
if (parsers.ElementAt(i) is LookaheadParser<TToken, T> lookaheadParser)
4727
{
48-
var next = parsers.ElementAt(i + 1);
49-
var nextNext = parsers.ElementAtOrDefault(i + 2);
50-
if (!TryParseWithLookahead(lookaheadParser, next, nextNext, ref state, ref expecteds, out _result))
28+
var number = i;
29+
if (number + 2 < count - 1)
5130
{
52-
result = default (R);
53-
return false;
31+
lookaheadParser.Lookahead(() => parsers.ElementAt(number + 1), () =>
32+
parsers.ElementAt(number + 2));
5433
}
34+
else
35+
{
36+
lookaheadParser.Lookahead(() => parsers.ElementAt(number + 1), () =>
37+
Parser<TToken>.End);
38+
}
39+
5540
}
56-
else if (!parser.TryParse(ref state, ref expecteds, out _result))
41+
}
42+
43+
for (int i = 0; i < parsers.Count(); i++)
44+
{
45+
var parser = parsers.ElementAt(i);
46+
if (!parser.TryParse(ref state, ref expecteds, out var _result))
5747
{
5848
result = default (R);
5949
return false;
@@ -64,24 +54,8 @@ public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expec
6454

6555
}
6656

67-
result = _func(results);
57+
result = _getResult(results);
6858
return true;
6959
}
70-
71-
private bool TryParseWithLookahead(ILookaheadParser<TToken, T> lookaheadParser,
72-
Parser<TToken, T> next,
73-
Parser<TToken, T> nextNext,
74-
ref ParseState<TToken> state,
75-
ref PooledList<Expected<TToken>> expected,
76-
out T result)
77-
{
78-
79-
if (nextNext is not null)
80-
{
81-
return lookaheadParser.TryParse(next, nextNext, ref state, ref expected, out result);
82-
}
83-
84-
return lookaheadParser.TryParse(next, Parser<TToken>.End, ref state, ref expected, out result);
85-
}
8660
}
8761
}

src/SimpleStateMachine.StructuralSearch.Sandbox/StructuralSearch/CommonTemplateParser.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ public static class CommonTemplateParser
1212
{
1313
public static readonly Parser<char, string> Placeholder
1414
= CommonParser.Identifier.Between(Char(Constant.PlaceholderSeparator));
15-
15+
16+
public static readonly Parser<char, string> StringWithoutParenthesisedAndWhiteSpaces
17+
= AnyCharExcept(Constant.AllExclude(Constant.PlaceholderSeparator))
18+
.AtLeastOnceString();
19+
1620
//can be contains one $
1721
public static readonly Parser<char, string> StringWithoutPlaceholder
1822
= Any.AtLeastOnceAsStringUntilNot(Placeholder);

0 commit comments

Comments
 (0)