Skip to content

Commit f43c0f5

Browse files
committed
FindParserMatch
1 parent 5b77543 commit f43c0f5

File tree

18 files changed

+109
-122
lines changed

18 files changed

+109
-122
lines changed

src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateTests.cs renamed to src/SimpleStateMachine.StructuralSearch.Tests/FindTemplateParserTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.IO;
2+
using System.Linq;
23
using Pidgin;
34
using Xunit;
45

@@ -31,11 +32,13 @@ public void SourceParsingBeFindTemplateShouldBeSuccess(string templatePath, stri
3132
var input = Input.String(source);
3233
var findParser = StructuralSearch.ParseFindTemplate(findTemplate);
3334
IParsingContext parsingContext = new ParsingContext(input);
34-
var result = findParser.Parse(ref parsingContext, input);
35+
var matches = findParser.Parse(ref parsingContext);
36+
Assert.Single(matches);
37+
38+
var match = matches.First();
3539

3640
Assert.NotNull(findParser);
37-
// Assert.NotNull(result.Value);
38-
Assert.Equal(result.Length, source.Length);
41+
Assert.Equal(match.Match.Lenght, source.Length);
3942
}
4043
}
4144
}

src/SimpleStateMachine.StructuralSearch.Tests/Mock/EmptyParsingContext.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace SimpleStateMachine.StructuralSearch.Tests.Mock
1+
using System.Collections.Generic;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Tests.Mock
24
{
35
public class EmptyParsingContext : IParsingContext
46
{
@@ -18,5 +20,10 @@ public Placeholder GetPlaceholder(string name)
1820
{
1921
return Placeholder.CreateEmpty(this, name, string.Empty);
2022
}
23+
24+
public IReadOnlyDictionary<string, Placeholder> Switch()
25+
{
26+
throw new System.NotImplementedException();
27+
}
2128
}
2229
}

src/SimpleStateMachine.StructuralSearch.Tests/PlaceholderParserTests.cs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Pidgin;
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Microsoft.VisualBasic;
4+
using Pidgin;
25
using Xunit;
36

47
namespace SimpleStateMachine.StructuralSearch.Tests
@@ -21,22 +24,32 @@ public void TemplateParsingShouldBeSuccess(string template, string source, strin
2124
var input = Input.String(source);
2225
IParsingContext parsingContext = new ParsingContext(input);
2326
var templateParser = StructuralSearch.ParseFindTemplate(template);
24-
var res = templateParser.Parse(ref parsingContext, input);
25-
var placeholder = parsingContext.GetPlaceholder("test");
27+
var matches = templateParser.Parse(ref parsingContext);
28+
29+
Assert.Single(matches);
30+
var match = matches.First();
31+
Assert.Single(match.Placeholders);
32+
var placeholder = match.Placeholders.First();
2633

27-
Assert.Equal(placeholder.Value, result);
34+
Assert.Equal(placeholder.Value.Value, result);
2835
}
2936

3037
[Theory]
31-
[InlineData("$var$;$var2$;", "test;;;test;;;", "value ")]
32-
public void TemplateParsingShouldBeSuccess2(string template, string source, string result)
38+
[InlineData("$var$;", "test;;;", "test;;")]
39+
[InlineData("$var$;.", "test;;;.", "test;;")]
40+
[InlineData("$var$;$var2$;", "test;;;test;;;", "test",";;test;;")]
41+
public void TemplateParsingShouldBeSuccess2(string template, string source, params string[] values)
3342
{
3443
var input = Input.String(source);
3544
IParsingContext parsingContext = new ParsingContext(input);
3645
var templateParser = StructuralSearch.ParseFindTemplate(template);
37-
templateParser.Parse(ref parsingContext, input);
38-
46+
var matches = templateParser.Parse(ref parsingContext);
47+
Assert.Single(matches);
48+
var match = matches.First();
49+
Assert.Equal(match.Placeholders.Count, values.Length);
3950

51+
Assert.Equal(match.Placeholders.Select(x=> x.Value.Value), values);
52+
4053
// var templateStr = File.ReadAllText(templatePath);
4154
// var template = StructuralSearch.ParseTemplate(templateStr);
4255
//

src/SimpleStateMachine.StructuralSearch/EmptyInput.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace SimpleStateMachine.StructuralSearch
44
{
55
public class EmptyInput : IInput
66
{
7-
public Result<char, T> Parse<T>(Parser<char, T> parser)
7+
public Result<char, T> ParseBy<T>(Parser<char, T> parser)
88
{
99
throw new System.NotImplementedException();
1010
}

src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs

Lines changed: 10 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,22 @@ public static bool TryParse(this Parser<char, string> parser, string value, out
4242
result = res.Success ? res.Value : default;
4343
return res.Success;
4444
}
45+
46+
public static Parser<TToken, T> ThenInvoke<TToken, T>(this Parser<TToken, T> parser, Action<T> action)
47+
{
48+
return parser.Select(x =>
49+
{
50+
action.Invoke(x);
51+
return x;
52+
});
53+
}
54+
4555
public static Parser<TToken, bool> Contains<TToken, T>(this Parser<TToken, T> parser)
4656
{
4757
return parser != null
4858
? parser.Optional().Select(x => x.HasValue)
4959
: throw new ArgumentNullException(nameof(parser));
5060
}
51-
52-
// public static Parser<char, T> Match<T>(this Parser<char, T> parser, ref ParseState<char> state,
53-
// ref PooledList<Expected<char>> expected, out T result)
54-
// {
55-
// Parser<char>.CurrentPos.TryParse(ref state, ref expected, out var oldPos);
56-
// Parser<char>.CurrentOffset.TryParse(ref state, ref expected, out var oldOffset);
57-
// var res = parser.TryParse(ref state, ref expected, out result);
58-
//
59-
// if (res)
60-
// {
61-
// Parser<char>.CurrentPos.TryParse(ref state, ref expected, out var newPos);
62-
// Parser<char>.CurrentOffset.TryParse(ref state, ref expected, out var newOffset);
63-
//
64-
// var line = new LinePosition(oldPos.Line, newPos.Line);
65-
// var column = new ColumnPosition(oldPos.Col, newPos.Col);
66-
// var offset = new OffsetPosition(oldOffset, newOffset);
67-
//
68-
// return null;
69-
// }
70-
// }
7161

7262
public static Parser<char, Match<T>> Match<T>(this Parser<char, T> parser)
7363
{
@@ -83,37 +73,7 @@ public static Parser<char, Match<T>> Match<T>(this Parser<char, T> parser)
8373
parser,
8474
Parser<char>.CurrentPos, Parser<char>.CurrentOffset);
8575
}
86-
87-
88-
89-
90-
// public static Parser<TToken, TOut> WithResult<TToken, TOut>(this Parser<TToken, TOut> parser, Func<TToken, SourcePos, TOut> transformResult)
91-
// {
92-
// = Parser<TToken>.CurrentSourcePosDelta.Select<SourcePos>((Func<SourcePosDelta, SourcePos>) (d => new SourcePos(1, 1) + d));
93-
// parser.Select()
94-
// return this.Select<U>((Func<T, U>)(_ => result));
95-
// }
96-
97-
// public static Parser<TToken, T> BetweenWithLookahead<TToken, T, U, V>(this Parser<TToken, T> parser, Parser<TToken, U> parser1, Parser<TToken, V> parser2)
98-
// {
99-
// if (parser1 == null)
100-
// throw new ArgumentNullException(nameof (parser1));
101-
// if (parser2 == null)
102-
// throw new ArgumentNullException(nameof (parser2));
103-
//
104-
// return Parser.Map((Func<U, T, V, T>) ((_, t, _) => t), parser1, parser, parser2);
105-
// }
10676

107-
// public Parser<TToken, T> Between<U, V>(
108-
// Parser<TToken, U> parser1,
109-
// Parser<TToken, V> parser2)
110-
// {
111-
// if (parser1 == null)
112-
// throw new ArgumentNullException(nameof (parser1));
113-
// if (parser2 == null)
114-
// throw new ArgumentNullException(nameof (parser2));
115-
// return Parser.Map<TToken, U, T, V, T>((Func<U, T, V, T>) ((u, t, v) => t), parser1, this, parser2);
116-
// }
11777
public static Parser<TToken, T> WithDebug<TToken, T>(this Parser<TToken, T> parser, string label)
11878
{
11979
return Map((u, t, v) =>
@@ -153,33 +113,5 @@ public static Parser<TToken, T> After<TToken, T, U>(this Parser<TToken, T> parse
153113
{
154114
return parserAfter.Then(parser, (u, t) => t);
155115
}
156-
157-
// public static Parser<TToken, T> BetweenAsThen<TToken, T, U, V>(this Parser<TToken, T> parser, Parser<TToken, U> parser1, Parser<TToken, V> parser2, Func<U, T, V, T> func)
158-
// {
159-
// if (parser1 == null)
160-
// throw new ArgumentNullException(nameof (parser1));
161-
// if (parser2 == null)
162-
// throw new ArgumentNullException(nameof (parser2));
163-
//
164-
// return Parser.Map<TToken, T, T, T, T>(func, parser1, this, parser2);
165-
// }
166-
167-
// public static Parser<TToken, T> Between<TToken, T, U,V>(this Parser<TToken, T> parser,
168-
// Parser<TToken, U> parser1,
169-
// Parser<TToken, V> parser2)
170-
// {
171-
// if (parser1 == null)
172-
// throw new ArgumentNullException(nameof (parser1));
173-
// if (parser2 == null)
174-
// throw new ArgumentNullException(nameof (parser2));
175-
// return Parser.Map<TToken, U, T, V, T>((Func<U, T, V, T>) ((u, t, v) => t), parser1, this, parser2);
176-
// }
177-
178-
// public static T ParseOrThrow<T>(this Parser<char, T> parser,
179-
// string input,
180-
// IConfiguration<char>? configuration = null)
181-
// {
182-
// return ParserExtensions.GetValueOrThrow<char, T>(parser.Parse<T>(input, configuration));
183-
// }
184116
}
185117
}

src/SimpleStateMachine.StructuralSearch/FileInput.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public FileInput(FileInfo fileInfo)
1212

1313
public readonly FileInfo FileInfo;
1414

15-
public Result<char, T> Parse<T>(Parser<char, T> parser)
15+
public Result<char, T> ParseBy<T>(Parser<char, T> parser)
1616
{
1717
return parser.Parse(FileInfo.OpenText());
1818
}

src/SimpleStateMachine.StructuralSearch/FindParser.cs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,39 @@ namespace SimpleStateMachine.StructuralSearch
1212
public class FindParser : IFindParser
1313
{
1414
private SeriesParser Parser { get; }
15-
public FindParser(SeriesParser parser)
15+
public FindParser(SeriesParser parser)
1616
{
1717
Parser = parser;
1818
}
1919

20-
public string Parse(ref IParsingContext context, IInput input)
20+
public IEnumerable<FindParserMatch> Parse(ref IParsingContext context)
2121
{
22-
StringBuilder res = new StringBuilder();
22+
List<FindParserMatch> matches = new();
23+
StringBuilder res = new();
2324
Parser.SetContext(ref context);
24-
var parser = Parser.Select(x => string.Join(string.Empty, x)).Match().Try();
25-
var empty = Pidgin.Parser<char>.Any.Select(x=>
26-
{
27-
res.Append(x);
28-
return string.Empty;
29-
}).ThenReturn(Match.EmptyMatchString);
30-
var parse = Pidgin.Parser.OneOf(parser, empty)
31-
.Many();
32-
33-
var result = input.Parse(parse);
34-
var t = result.Value.Where(x => !x.IsEmpty());
35-
// return result.Success ? result.Value.JoinToString() : string.Empty;
36-
return string.Empty;
25+
26+
var parsingContext = context;
27+
var parser = Parser.Select(x => string.Join(string.Empty, x))
28+
.Match()
29+
.ThenInvoke(match =>
30+
{
31+
var placeholders= parsingContext.Switch();
32+
matches.Add(new FindParserMatch(match, placeholders));
33+
})
34+
.ThenReturn(Unit.Value)
35+
.Try();
36+
37+
var empty = Parser<char>.Any
38+
.ThenInvoke(x =>
39+
{
40+
res.Append(x);
41+
parsingContext.Switch();
42+
})
43+
.ThenReturn(Unit.Value);
44+
45+
context.Input.ParseBy(Pidgin.Parser.OneOf(parser, empty).Many());
46+
47+
return matches.OrderBy(x=> x.Match.Offset.Start);
3748
}
3849
}
3950
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
using System.Collections.Generic;
2+
3+
namespace SimpleStateMachine.StructuralSearch;
4+
5+
public readonly record struct FindParserMatch(Match<string> Match, IReadOnlyDictionary<string, Placeholder> Placeholders);

src/SimpleStateMachine.StructuralSearch/IFindParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ namespace SimpleStateMachine.StructuralSearch
77
{
88
public interface IFindParser
99
{
10-
string Parse(ref IParsingContext context, IInput input);
10+
IEnumerable<FindParserMatch> Parse(ref IParsingContext context);
1111
}
1212
}

src/SimpleStateMachine.StructuralSearch/IInput.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace SimpleStateMachine.StructuralSearch
44
{
55
public interface IInput
66
{
7-
Result<char, T> Parse<T>(Parser<char, T> parser);
7+
Result<char, T> ParseBy<T>(Parser<char, T> parser);
88

99
string Extension { get; }
1010
string Path { get; }

0 commit comments

Comments
 (0)