Skip to content

Commit f4735e5

Browse files
committed
ReplaceTemplate
1 parent f5a4c4e commit f4735e5

File tree

8 files changed

+171
-3
lines changed

8 files changed

+171
-3
lines changed

src/SimpleStateMachine.StructuralSearch.Sandbox/Program.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,18 @@ internal static class Program
1010
{
1111
static void Main(string[] args)
1212
{
13-
var template = StructuralSearch.ParseTemplate("");
14-
var test = Parser.OneOf(String("Test"), CommonParser.Empty);
15-
var res = test.ParseOrThrow("");
13+
14+
var test = String("return ")
15+
.Then(AnyCharExcept(';').ManyString())
16+
.Then(Char(';').AtLeastOnceString())
17+
.Before(Char(';'));
18+
19+
20+
// var template = StructuralSearch.ParseTemplate("");
21+
// var test = Parser.OneOf(String("Test"), CommonParser.Empty);
22+
var res = test.ParseOrThrow("return 125;;;;");
23+
24+
1625
// var lookahead = Parser.Lookahead(Char(';').Then(End).Try());
1726
// var t = Parser.String("return ").Then(Any.AtLeastOnceAsStringUntilNot(lookahead));
1827
// var res = t.ParseOrThrow("return 124;;");
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
3+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
4+
{
5+
public interface IReplaceBuilder
6+
{
7+
IEnumerable<IReplaceStep> Steps { get; }
8+
string Build();
9+
}
10+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
2+
{
3+
public interface IReplaceStep
4+
{
5+
string GetValue();
6+
}
7+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Pidgin;
2+
using SimpleStateMachine.StructuralSearch.Extensions;
3+
4+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
5+
{
6+
public static class ParserToReplace
7+
{
8+
public static Parser<char, IReplaceStep> ResultAsReplace(Parser<char, string> parser)
9+
{
10+
return parser.Select(result => new TokenReplace(result))
11+
.As<char, TokenReplace, IReplaceStep>();
12+
}
13+
14+
public static Parser<char, IReplaceStep> Stringc(char token)
15+
{
16+
var _token = token.ToString();
17+
18+
return ResultAsReplace(Parser.String(_token));
19+
}
20+
}
21+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
2+
{
3+
public class PlaceholderReplace:IReplaceStep
4+
{
5+
public string Name { get; }
6+
7+
public PlaceholderReplace(string name)
8+
{
9+
Name = name;
10+
}
11+
12+
public string GetValue()
13+
{
14+
return Name;
15+
}
16+
}
17+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Collections.Generic;
2+
using System.Text;
3+
using Pidgin;
4+
5+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
6+
{
7+
public class ReplaceBuilder : IReplaceBuilder
8+
{
9+
public IEnumerable<IReplaceStep> Steps { get; }
10+
11+
public ReplaceBuilder(IEnumerable<IReplaceStep> steps)
12+
{
13+
Steps = steps;
14+
}
15+
16+
public string Build()
17+
{
18+
StringBuilder stringBuilder = new StringBuilder();
19+
20+
foreach (var step in Steps)
21+
{
22+
stringBuilder.Append(step.GetValue());
23+
}
24+
25+
var result = stringBuilder.ToString();
26+
return result;
27+
}
28+
}
29+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace SimpleStateMachine.StructuralSearch.ReplaceTemplate
2+
{
3+
public class TokenReplace : IReplaceStep
4+
{
5+
public string Token { get; }
6+
public TokenReplace(string token)
7+
{
8+
Token = token;
9+
}
10+
11+
public string GetValue()
12+
{
13+
return Token;
14+
}
15+
}
16+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Pidgin;
4+
using SimpleStateMachine.StructuralSearch.Extensions;
5+
using SimpleStateMachine.StructuralSearch.ReplaceTemplate;
6+
7+
namespace SimpleStateMachine.StructuralSearch
8+
{
9+
public class ReplaceTemplateParser
10+
{
11+
static ReplaceTemplateParser()
12+
{
13+
Parenthesised = Parsers.BetweenOneOfChars(ParserToReplace.Stringc,
14+
Parser.Rec(() => Term),
15+
Constant.AllParenthesised);
16+
17+
Term = Parser.OneOf(Parenthesised, Token)
18+
.Many()
19+
.MergerMany();
20+
21+
TemplateParser = Parser.OneOf(Parenthesised, Token)
22+
.AtLeastOnce()
23+
.MergerMany();
24+
}
25+
26+
public static readonly Parser<char, IReplaceStep> Empty =
27+
ParserToReplace.ResultAsReplace(CommonParser.Empty);
28+
29+
public static readonly Parser<char, IReplaceStep> AnyString =
30+
ParserToReplace.ResultAsReplace(CommonParser.AnyString)
31+
.Try();
32+
33+
public static readonly Parser<char, IReplaceStep> WhiteSpaces =
34+
ParserToReplace.ResultAsReplace(CommonParser.WhiteSpaces)
35+
.Try();
36+
37+
public static readonly Parser<char, IReplaceStep> Placeholder =
38+
CommonTemplateParser.Placeholder.Select(name=> new PlaceholderReplace(name))
39+
.As<char, PlaceholderReplace, IReplaceStep>()
40+
.Try();
41+
42+
public static readonly Parser<char, IEnumerable<IReplaceStep>> Token =
43+
Parser.OneOf(AnyString, Placeholder, WhiteSpaces)
44+
.AsMany();
45+
46+
public static readonly Parser<char, IEnumerable<IReplaceStep>> Term;
47+
48+
public static readonly Parser<char, IEnumerable<IReplaceStep>> Parenthesised;
49+
50+
private static readonly Parser<char, IEnumerable<IReplaceStep>> TemplateParser;
51+
52+
internal static IReplaceBuilder ParseTemplate(string str)
53+
{
54+
return TemplateParser
55+
.Select(steps => new ReplaceBuilder(steps))
56+
.ParseOrThrow(str);
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)