Skip to content

Commit 6605208

Browse files
committed
Parse template => create parser
1 parent 0f814a5 commit 6605208

File tree

5 files changed

+189
-48
lines changed

5 files changed

+189
-48
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Pidgin;
4+
5+
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
6+
{
7+
public class SeriesParser<TToken, T, R>: Parser<TToken, R>
8+
{
9+
private readonly Func<IEnumerable<T>, R> _func;
10+
private readonly IEnumerable<Parser<TToken, T>> parsers;
11+
12+
public SeriesParser(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>, R> func)
13+
{
14+
this._func = func;
15+
this.parsers = parsers;
16+
}
17+
18+
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expecteds, out R result)
19+
{
20+
var results = new List<T>();
21+
foreach (var parser in parsers)
22+
{
23+
if (!parser.TryParse(ref state, ref expecteds, out var _result))
24+
{
25+
result = default (R);
26+
return false;
27+
}
28+
results.Add(_result);
29+
}
30+
31+
result = _func(results);
32+
return true;
33+
}
34+
}
35+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Pidgin;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Sandbox
4+
{
5+
public static class ParserToParser
6+
{
7+
public static Parser<char, Parser<char, string>> String(string token)
8+
{
9+
return Parser.String(token).Select(x => Parser.String(token));
10+
}
11+
12+
public static Parser<char, Parser<char, string>> Stringc(char token)
13+
{
14+
var _token = token.ToString();
15+
return Parser.String(_token).Select(x => Parser.String(_token));
16+
}
17+
}
18+
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Parsers.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Pidgin;
5+
using Pidgin.TokenStreams;
6+
using SimpleStateMachine.StructuralSearch.Sandbox.Custom;
57
using static Pidgin.Parser;
68

79
namespace SimpleStateMachine.StructuralSearch.Sandbox
@@ -39,6 +41,17 @@ public static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken,
3941
return result as IEnumerable<T>;
4042
}, parser1, parser2, parser3);
4143
}
42-
44+
45+
46+
public static Parser<TToken, R> Series<TToken, T, R>(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>, R> func)
47+
{
48+
if (parsers == null)
49+
throw new ArgumentNullException(nameof (parsers));
50+
if (func == null)
51+
throw new ArgumentNullException(nameof (func));
52+
53+
return new SeriesParser<TToken, T, R>(parsers, func);
54+
}
55+
4356
}
4457
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Program.cs

Lines changed: 110 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,33 @@
1111

1212
namespace SimpleStateMachine.StructuralSearch.Sandbox
1313
{
14+
// var spaces = Char(' ').AtLeastOnceString();
15+
// var endOfLines = EndOfLine.AtLeastOnceString();
16+
// var whitespaces = OneOf(spaces, endOfLines);
17+
// var anyCharExcept = AnyCharExcept('(', ')', '[', ']', '{', '}', '$', ' ', '\n').AtLeastOnceString().Try()
18+
// .WithDebug("anyCharExcept");
19+
// Parser<char, IEnumerable<string>> expr = null;
20+
//
21+
//
22+
// var placeholder = PlaceholderParser.Identifier.Between(Char('$')).Try()
23+
// .WithDebug("placeholder");
24+
//
25+
// // var parenthesised1 = Rec(() => expr).Between(Char('('), Char(')')).WithDebug("parenthesised1");
26+
// var parenthesised1 = MapToMany(Stringc('('), Rec(() => expr), Stringc(')'))
27+
// .WithDebug("parenthesised1");
28+
// // var parenthesised2 = Rec(() => expr).Between(Char('['), Char(']')).WithDebug("parenthesised1");
29+
// var parenthesised2 = MapToMany(Stringc('['), Rec(() => expr), Stringc(']'))
30+
// .WithDebug("parenthesised2");
31+
// // var parenthesised3 = Rec(() => expr).Between(Char('{'), Char('}')).WithDebug("parenthesised1");
32+
// var parenthesised3 = MapToMany(Stringc('{'), Rec(() => expr), Stringc('}'))
33+
// .WithDebug("parenthesised3");
34+
//
35+
// var parenthesised = OneOf(parenthesised1, parenthesised2, parenthesised3);
36+
//
37+
//
38+
// //don't work
39+
// var tokens = OneOf(anyCharExcept, placeholder, whitespaces).AtLeastOnce();
40+
// expr = tokens.Or(parenthesised).AtLeastOnce().MergerMany();
1441
internal static class Program
1542
{
1643
private static Parser<char, T> Parenthesised<T>(Parser<char, T> parser)
@@ -32,76 +59,112 @@ static void Main(string[] args)
3259
{
3360
var spaces = Char(' ').AtLeastOnceString();
3461
var endOfLines = EndOfLine.AtLeastOnceString();
35-
var whitespaces = OneOf(spaces, endOfLines);
36-
var anyCharExcept = AnyCharExcept('(', ')', '[', ']', '{', '}', '$', ' ', '\n').AtLeastOnceString().Try()
62+
var _whitespaces = OneOf(spaces, endOfLines);
63+
var _anyCharExcept = AnyCharExcept('(', ')', '[', ']', '{', '}', '$', ' ', '\n').AtLeastOnceString().Try()
3764
.WithDebug("anyCharExcept");
38-
Parser<char, IEnumerable<string>> expr = null;
39-
4065

41-
var placeholder = PlaceholderParser.Identifier.Between(Char('$')).Try()
66+
Parser<char, IEnumerable<string>> _expr = null;
67+
68+
69+
var _placeholder = PlaceholderParser.Identifier.Between(Char('$')).Try()
4270
.WithDebug("placeholder");
43-
71+
4472
// var parenthesised1 = Rec(() => expr).Between(Char('('), Char(')')).WithDebug("parenthesised1");
45-
var parenthesised1 = MapToMany(Stringc('('), Rec(() => expr), Stringc(')'))
73+
var _parenthesised1 = MapToMany(Stringc('('), Rec(() => _expr), Stringc(')'))
4674
.WithDebug("parenthesised1");
4775
// var parenthesised2 = Rec(() => expr).Between(Char('['), Char(']')).WithDebug("parenthesised1");
48-
var parenthesised2 = MapToMany(Stringc('['), Rec(() => expr), Stringc(']'))
76+
var _parenthesised2 = MapToMany(Stringc('['), Rec(() => _expr), Stringc(']'))
4977
.WithDebug("parenthesised2");
5078
// var parenthesised3 = Rec(() => expr).Between(Char('{'), Char('}')).WithDebug("parenthesised1");
51-
var parenthesised3 = MapToMany(Stringc('{'), Rec(() => expr), Stringc('}'))
79+
var _parenthesised3 = MapToMany(Stringc('{'), Rec(() => _expr), Stringc('}'))
5280
.WithDebug("parenthesised3");
5381

54-
var parenthesised = OneOf(parenthesised1, parenthesised2, parenthesised3);
55-
56-
5782
//don't work
58-
var tokens = OneOf(anyCharExcept, placeholder, whitespaces).AtLeastOnce();
59-
expr = tokens.Or(parenthesised).AtLeastOnce().MergerMany();
60-
61-
//work
62-
// var parser = OneOf(anyCharExcept, placeholder).AtLeastOnce();
63-
// expr = parser.Or(parenthesised).Separated(Whitespaces).MergerMany();
64-
65-
66-
var t = "((test > 25) && (test < 50))";
67-
var t2 = "([test > 25] && {test < 50})";
68-
83+
var _token = OneOf(_anyCharExcept, _placeholder, _whitespaces);
84+
var _tokens = _token.AtLeastOnce();
85+
var _parenthesised = OneOf(_parenthesised1, _parenthesised2, _parenthesised3);
86+
87+
_expr = _tokens.Or(_parenthesised).AtLeastOnce().MergerMany();
88+
89+
Parser<char, IEnumerable<Parser<char, string>>> expr = null;
90+
91+
92+
var parenthesised1 = MapToMany(ParserToParser.Stringc('('), Rec(() => expr), ParserToParser.Stringc(')'));
93+
var parenthesised2 = MapToMany(ParserToParser.Stringc('['), Rec(() => expr), ParserToParser.Stringc(']'));
94+
var parenthesised3 = MapToMany(ParserToParser.Stringc('{'), Rec(() => expr), ParserToParser.Stringc('}'));
95+
var parenthesised = OneOf(parenthesised1, parenthesised2, parenthesised3);
96+
var anyCharExcept = _anyCharExcept.Select(x => String(x));
97+
var whitespaces = _whitespaces.Select(_ => WhitespaceString);
98+
var placeholder = _placeholder.Select(x => _expr.Select(x => string.Join("", x)));
99+
var token = OneOf(anyCharExcept, placeholder, whitespaces);
100+
var tokens = token.AtLeastOnce();
101+
102+
expr = OneOf(tokens, parenthesised).AtLeastOnce().MergerMany();
103+
var parser = expr.Select(x => Series(x, enumerable => string.Join("", enumerable)));
104+
105+
//
106+
//
107+
//
108+
// _expr = _tokens.Or(_parenthesised).AtLeastOnce().MergerMany();
109+
//
110+
// var t = "((test > 25) && (test < 50))";
111+
// var t2 = "([test > 25] && {test < 50})";
112+
113+
69114
//template parser
70-
var separator = Whitespaces.AsString().Or(EndOfLine);
71-
var any = AnyCharExcept('$', ' ', '\n').AtLeastOnceString();
72-
var token = PlaceholderParser.Identifier.Between(Char('$')).Try();
73-
var templateParser = token.Or(any).Separated(separator);
115+
// var separator = Whitespaces.AsString().Or(EndOfLine);
116+
// var any = AnyCharExcept('$', ' ', '\n').AtLeastOnceString();
117+
// var token = PlaceholderParser.Identifier.Between(Char('$')).Try();
118+
// var templateParser = token.Or(any).Separated(separator);
74119

75120
//if with lookahead parser
76-
var test341 = String("if")
77-
.Then(Char('('))
78-
.Then(Any.Until(Lookahead(Char(')').Then(End).Try())))
79-
.AsString();
121+
// var test341 = String("if")
122+
// .Then(Char('('))
123+
// .Then(Any.Until(Lookahead(Char(')').Then(End).Try())))
124+
// .AsString();
80125

81126
var template1 =
82127
"if(($condition$) = ($test$))\n" +
83128
"return $value1$;\n" +
84129
"else\n" +
85130
"return $value2$;";
86-
131+
132+
133+
var example1 =
134+
"if(value == 5)\n" +
135+
"return \"Result1\";\n" +
136+
"else\n" +
137+
"return \"Result2\";";
138+
87139
var template2 =
88-
"if($var$ $sign$ null)\n" +
89-
"{\n" +
90-
"$var$ = $value$;\n" +
91-
"}";
92-
93-
var template3 =
94-
"if($value1$ $sign$ null)\n"+
95-
"{\n" +
140+
"if($var$ $sign$ null)\n" +
141+
"{\n" +
142+
"$var$ = $value$;\n" +
143+
"}";
144+
145+
var template3 =
146+
"if($value1$ $sign$ null)\n" +
147+
"{\n" +
96148
"$var$ = $value1$;\n" +
97-
"}\n" +
98-
"else\n" +
99-
"{\n" +
149+
"}\n" +
150+
"else\n" +
151+
"{\n" +
100152
"$var$ = $value2$;\n" +
101-
"}";
102-
// var template2 = "((test)=(test2))";
103-
// var template3 = "$test1$ test test34";
104-
var test = expr.ParseOrThrow(template3);
153+
"}";
154+
155+
156+
157+
var testTempalte = "if($test$)";
158+
var testText = "if((value1) && (value2))";
159+
160+
var test = _expr.ParseOrThrow(testTempalte);
161+
162+
var resParser = parser.ParseOrThrow(testTempalte);
163+
var res = resParser.ParseOrThrow(testText);
164+
165+
166+
167+
// var templateResult = test.ParseOrThrow("test");
105168
}
106169
}
107170
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Pidgin;
2+
3+
namespace SimpleStateMachine.StructuralSearch.Sandbox
4+
{
5+
public class TestParser<TToken, T>:Parser<TToken, T>
6+
{
7+
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expecteds, out T result)
8+
{
9+
throw new System.NotImplementedException();
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)