Skip to content

Commit 391a55e

Browse files
committed
refact methods
1 parent bdc83b8 commit 391a55e

21 files changed

+274
-605
lines changed

src/SimpleStateMachine.StructuralSearch.Sandbox/Common.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Pidgin;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
4+
{
5+
public static class EmptyParser
6+
{
7+
public static readonly Parser<char, string> AlwaysCorrectString = new EmptyStringParser(true);
8+
public static readonly Parser<char, string> AlwaysNotCorrectString = new EmptyStringParser(false);
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Pidgin;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
4+
{
5+
public interface ILookaheadParser<TToken, T>
6+
{
7+
public bool TryParse<Res1, Res2>(Parser<TToken, Res1> next, Parser<TToken, Res2> nextNext,
8+
ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expected, out T result);
9+
}
10+
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace SimpleStateMachine.StructuralSearch.Sandbox
1010
{
1111
public static class Parsers
1212
{
13+
14+
1315
public static Parser<char, string> Stringc(char character) => String(character.ToString());
1416

1517
public static Parser<TToken, List<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1, Parser<TToken, T> parser2, Parser<TToken, T> parser3)
@@ -52,5 +54,19 @@ public static Parser<TToken, R> Series<TToken, T, R>(IEnumerable<Parser<TToken,
5254

5355
return new SeriesParser<TToken, T, R>(parsers, func);
5456
}
57+
58+
public static Parser<char, IEnumerable<T>> BetweenChars<T>(char left, char right,
59+
Func<char, Parser<char, T>> leftRight,
60+
Parser<char, IEnumerable<T>> expr)
61+
=> MapToMany(leftRight(left), expr, leftRight(right));
62+
63+
64+
public static Parser<char, IEnumerable<T>> BetweenOneOfChars<T>(Func<char, Parser<char, T>> leftRight,
65+
Parser<char, IEnumerable<T>> expr, params (char, char)[] values)
66+
{
67+
return OneOf(values.Select(x =>
68+
MapToMany(leftRight(x.Item1), expr, leftRight(x.Item2)))
69+
);
70+
}
5571
}
5672
}
Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,46 @@
11
using System;
22
using System.Collections.Generic;
33
using Pidgin;
4+
using SimpleStateMachine.StructuralSearch.Sandbox.Extensions;
45

56
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
67
{
7-
public class PlaceholderParser: Parser<char, SourceMatch>
8+
public class PlaceholderParser: Parser<char, SourceMatch>, ILookaheadParser<char, SourceMatch>
89
{
9-
private Func<IEnumerable<Parser<char, SourceMatch>>, Parser<char, SourceMatch>> _parser;
1010
public string Name { get; }
11-
private IEnumerable<Parser<char, SourceMatch>> _parsers;
12-
public PlaceholderParser(string name, Func<IEnumerable<Parser<char, SourceMatch>>, Parser<char, SourceMatch>> parser)
11+
12+
public PlaceholderParser(string name)
1313
{
1414
Name = name;
15-
_parser = parser;
1615
}
1716

18-
public void SetParsers(IEnumerable<Parser<char, SourceMatch>> parsers)
17+
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expecteds, out SourceMatch result)
1918
{
20-
_parsers = parsers;
19+
throw new NotImplementedException();
2120
}
22-
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expecteds, out SourceMatch result)
23-
{
24-
var isCorrect = _parser(_parsers).TryParse(ref state, ref expecteds, out result);
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();
32+
Parser<char, IEnumerable<string>> term = null;
2533

26-
return isCorrect;
34+
var parenthesised = Parsers.BetweenOneOfChars(Parsers.Stringc,
35+
Parser.Rec(() => term),
36+
Constant.AllParenthesised);
37+
38+
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);
2743
}
44+
2845
}
2946
}

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

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,20 @@ public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expec
4040
var results = new List<T>();
4141
for (int i = 0; i < parsers.Count(); i++)
4242
{
43+
T _result;
4344
var parser = parsers.ElementAt(i);
44-
if (parser is PlaceholderParser placeholderParser)
45+
46+
if (parser is ILookaheadParser<TToken, T> lookaheadParser)
4547
{
46-
var next = parsers.ElementAt(i + 1) as Parser<char, SourceMatch>;
47-
var end = Parser<char>.End.ThenReturn(SourceMatch.Empty);
48-
var test1 = parsers.ElementAtOrDefault(i + 2);
49-
var test2 = test1 as Parser<char, SourceMatch>;
50-
var nextNext = test2 ?? end;
51-
var list = new List<Parser<char, SourceMatch>>{next, nextNext };
52-
placeholderParser.SetParsers(list);
53-
parser = placeholderParser as Parser<TToken, T>;
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))
51+
{
52+
result = default (R);
53+
return false;
54+
}
5455
}
55-
56-
if (!parser.TryParse(ref state, ref expecteds, out var _result))
56+
else if (!parser.TryParse(ref state, ref expecteds, out _result))
5757
{
5858
result = default (R);
5959
return false;
@@ -63,8 +63,25 @@ public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expec
6363
results.Add(_result);
6464

6565
}
66+
6667
result = _func(results);
6768
return true;
6869
}
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+
}
6986
}
7087
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Pidgin;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Sandbox
4+
{
5+
public class EmptyStringParser:Parser<char, string>
6+
{
7+
public bool Value { get; }
8+
9+
public EmptyStringParser(bool value)
10+
{
11+
Value = value;
12+
}
13+
14+
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expecteds, out string result)
15+
{
16+
result = string.Empty;
17+
return Value;
18+
}
19+
}
20+
}

src/SimpleStateMachine.StructuralSearch.Sandbox/ExprParser.cs

Lines changed: 0 additions & 84 deletions
This file was deleted.

src/SimpleStateMachine.StructuralSearch.Sandbox/Extensions/CharParserExtensions.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using Pidgin;
34

45
namespace SimpleStateMachine.StructuralSearch.Sandbox.Extensions
@@ -9,5 +10,17 @@ public static Parser<TToken, string> AsString<TToken>(this Parser<TToken, char>
910
{
1011
return parser.Select(x => x.ToString());
1112
}
13+
14+
public static Parser<TToken, string> AtLeastOnceAsStringUntil<TToken, U>(
15+
this Parser<TToken, char> parser, Parser<TToken, U> terminator)
16+
{
17+
return parser != null ? parser.AtLeastOnceUntil(terminator).AsString() : throw new ArgumentNullException(nameof (parser));
18+
}
19+
20+
public static Parser<TToken, string> AtLeastOnceAsStringUntilNot<TToken, U>(this Parser<TToken, char> parser,
21+
Parser<TToken, U> terminator)
22+
{
23+
return parser != null ? parser.AtLeastOnceUntilNot(terminator).AsString() : throw new ArgumentNullException(nameof (parser));
24+
}
1225
}
1326
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Extensions/ParserExtensions.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ namespace SimpleStateMachine.StructuralSearch.Sandbox.Extensions
1616
{
1717
public static class ParserExtensions
1818
{
19+
20+
public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser)
21+
{
22+
return Parser.Try(parser);
23+
}
24+
25+
public static Parser<TToken, IEnumerable<T>> AtLeastOnceUntilNot<TToken, T, U>(this Parser<TToken, T> parser,
26+
Parser<TToken, U> terminator)
27+
{
28+
return parser != null ? parser.AtLeastOnceUntil(Not(terminator)) : throw new ArgumentNullException(nameof (parser));
29+
}
30+
31+
1932
// public static Parser<TToken, TOut> WithResult<TToken, TOut>(this Parser<TToken, TOut> parser, Func<TToken, SourcePos, TOut> transformResult)
2033
// {
2134
// = Parser<TToken>.CurrentSourcePosDelta.Select<SourcePos>((Func<SourcePosDelta, SourcePos>) (d => new SourcePos(1, 1) + d));
@@ -33,11 +46,6 @@ public static class ParserExtensions
3346
// return Parser.Map((Func<U, T, V, T>) ((_, t, _) => t), parser1, parser, parser2);
3447
// }
3548

36-
public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser)
37-
{
38-
return Parser.Try(parser);
39-
}
40-
4149
// public Parser<TToken, T> Between<U, V>(
4250
// Parser<TToken, U> parser1,
4351
// Parser<TToken, V> parser2)

0 commit comments

Comments
 (0)