Skip to content

Commit 10ebcbe

Browse files
committed
Some for expression
1 parent d58fe26 commit 10ebcbe

File tree

6 files changed

+162
-50
lines changed

6 files changed

+162
-50
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using static Pidgin.Parser;
5+
using static Pidgin.Parser<char>;
6+
using Pidgin;
7+
8+
namespace SimpleStateMachine.StructuralSearch.Sandbox.Extensions
9+
{
10+
public static class EnumerableCharExtensions
11+
{
12+
public static Parser<Ttoken, string> AsString<Ttoken>(this Parser<Ttoken, IEnumerable<char>> parser)
13+
{
14+
return parser.Select(x => new string(x.ToArray()));
15+
}
16+
}
17+
}

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,33 @@ public static class ParserExtensions
1313
// return this.Select<U>((Func<T, U>)(_ => result));
1414
// }
1515

16-
public static Parser<TToken, T> Test<TToken, T, U, V>(this Parser<TToken, T> parser, Parser<TToken, U> parser1, Parser<TToken, V> parser2)
16+
// public static Parser<TToken, T> BetweenWithLookahead<TToken, T, U, V>(this Parser<TToken, T> parser, Parser<TToken, U> parser1, Parser<TToken, V> parser2)
17+
// {
18+
// if (parser1 == null)
19+
// throw new ArgumentNullException(nameof (parser1));
20+
// if (parser2 == null)
21+
// throw new ArgumentNullException(nameof (parser2));
22+
//
23+
// return Parser.Map((Func<U, T, V, T>) ((_, t, _) => t), parser1, parser, parser2);
24+
// }
25+
26+
public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser)
1727
{
18-
if (parser1 == null)
19-
throw new ArgumentNullException(nameof (parser1));
20-
if (parser2 == null)
21-
throw new ArgumentNullException(nameof (parser2));
22-
return Parser.Map((Func<U, T, V, T>) ((_, t, _) => t), parser1, parser, parser2);
28+
return Parser.Try(parser);
2329
}
2430

31+
32+
// public static Parser<TToken, T> Between<TToken, T, U,V>(this Parser<TToken, T> parser,
33+
// Parser<TToken, U> parser1,
34+
// Parser<TToken, V> parser2)
35+
// {
36+
// if (parser1 == null)
37+
// throw new ArgumentNullException(nameof (parser1));
38+
// if (parser2 == null)
39+
// throw new ArgumentNullException(nameof (parser2));
40+
// return Parser.Map<TToken, U, T, V, T>((Func<U, T, V, T>) ((u, t, v) => t), parser1, this, parser2);
41+
// }
42+
2543
// public static T ParseOrThrow<T>(this Parser<char, T> parser,
2644
// string input,
2745
// IConfiguration<char>? configuration = null)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+

2+
using System.Collections.Generic;
3+
using System.Collections.Immutable;
4+
using System.Linq;
5+
using Pidgin;
6+
using static Pidgin.Parser;
7+
using static Pidgin.Parser<char>;
8+
9+
namespace SimpleStateMachine.StructuralSearch.Sandbox
10+
{
11+
public interface IJson
12+
{
13+
}
14+
15+
public class JsonArray : IJson
16+
{
17+
public ImmutableArray<IJson> Elements { get; }
18+
public JsonArray(ImmutableArray<IJson> elements)
19+
{
20+
Elements = elements;
21+
}
22+
public override string ToString()
23+
=> $"[{string.Join(",", Elements.Select(e => e.ToString()))}]";
24+
}
25+
26+
public class JsonObject : IJson
27+
{
28+
public IImmutableDictionary<string, IJson> Members { get; }
29+
public JsonObject(IImmutableDictionary<string, IJson> members)
30+
{
31+
Members = members;
32+
}
33+
public override string ToString()
34+
=> $"{{{string.Join(",", Members.Select(kvp => $"\"{kvp.Key}\":{kvp.Value.ToString()}"))}}}";
35+
}
36+
37+
public class JsonString : IJson
38+
{
39+
public string Value { get; }
40+
public JsonString(string value)
41+
{
42+
Value = value;
43+
}
44+
45+
public override string ToString()
46+
=> $"\"{Value}\"";
47+
}
48+
49+
public static class JsonParser
50+
{
51+
private static readonly Parser<char, char> LBrace = Char('{');
52+
private static readonly Parser<char, char> RBrace = Char('}');
53+
private static readonly Parser<char, char> LBracket = Char('[');
54+
private static readonly Parser<char, char> RBracket = Char(']');
55+
private static readonly Parser<char, char> Quote = Char('"');
56+
private static readonly Parser<char, char> Colon = Char(':');
57+
private static readonly Parser<char, char> ColonWhitespace =
58+
Colon.Between(SkipWhitespaces);
59+
private static readonly Parser<char, char> Comma = Char(',');
60+
61+
private static readonly Parser<char, string> String =
62+
Token(c => c != '"')
63+
.ManyString()
64+
.Between(Quote);
65+
private static readonly Parser<char, IJson> JsonString =
66+
String.Select<IJson>(s => new JsonString(s));
67+
68+
private static readonly Parser<char, IJson> Json =
69+
JsonString.Or(Rec(() => JsonArray!)).Or(Rec(() => JsonObject!));
70+
71+
private static readonly Parser<char, IJson> JsonArray =
72+
Json.Between(SkipWhitespaces)
73+
.Separated(Comma)
74+
.Between(LBracket, RBracket)
75+
.Select<IJson>(els => new JsonArray(els.ToImmutableArray()));
76+
77+
private static readonly Parser<char, KeyValuePair<string, IJson>> JsonMember =
78+
String
79+
.Before(ColonWhitespace)
80+
.Then(Json, (name, val) => new KeyValuePair<string, IJson>(name, val));
81+
82+
private static readonly Parser<char, IJson> JsonObject =
83+
JsonMember.Between(SkipWhitespaces)
84+
.Separated(Comma)
85+
.Between(LBrace, RBrace)
86+
.Select<IJson>(kvps => new JsonObject(kvps.ToImmutableDictionary()));
87+
88+
public static Result<char, IJson> Parse(string input) => Json.Parse(input);
89+
}
90+
}

src/SimpleStateMachine.StructuralSearch.Sandbox/PlaceholderParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static class PlaceholderParser
1010

1111

1212
public static readonly Parser<char, string> Identifier
13-
= Letter.Then(Symbol.ManyString(), (h, t) => h + t);
13+
= Letter.Then(Common.Symbol.ManyString(), (h, t) => h + t);
1414

1515
private static Parser<char, T> PlaceholderSeparator<T>(Parser<char, T> parser)
1616
=> parser.Between(String(Common._placeholderSeparator), String(Common._placeholderSeparator));

src/SimpleStateMachine.StructuralSearch.Sandbox/Program.cs

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
using SimpleStateMachine.StructuralSearch.Sandbox.Extensions;
77
using static Pidgin.Parser;
88
using static Pidgin.Parser<char>;
9+
using String = System.String;
910

1011
namespace SimpleStateMachine.StructuralSearch.Sandbox
1112
{
1213
internal static class Program
1314
{
15+
private static Parser<char, T> Parenthesised<T>(Parser<char, T> parser)
16+
=> parser.Between(String("("), String(")"));
1417
public class Placeholder
1518
{
1619
public Placeholder(bool isCorrect, string value)
@@ -24,58 +27,35 @@ public Placeholder(bool isCorrect, string value)
2427
}
2528
static void Main(string[] args)
2629
{
27-
//Test
28-
// var abv = Common.Symbol.ManyString();
29-
// // AnyCharExcept(' ', '$')
30-
// // var any = Parser<TToken>.Token((Func<TToken, bool>) (_ => true)).Labelled("any character")
31-
// var any = Common.Symbol.ManyString();
32-
// var placeholder = PlaceholderParser.Identifier.Between(Char('$'));
33-
// // var token = Char("$").Then(AnyCharExcept(' ', '$').Many())
34-
// // var parser = placeholder.Separated(any).Many();
35-
//
36-
// var parser = Common.Tok(placeholder).Or(Common.Tok(any));
30+
var placeholder = PlaceholderParser.Identifier.Between(Char('$'));
31+
32+
//expressions parser
33+
Parser<char, string> expr = null;
34+
Parser<char, string> parenthesised = Rec(() => expr).Between(Char('('), Char(')'));
35+
expr = AnyCharExcept('(', ')').ManyString().Or(parenthesised);
3736

38-
var any = AnyCharExcept('$').ManyString();
39-
var token = Try(PlaceholderParser.Identifier.Between(Char('$')));
40-
var testpar = token.Or(any).Many();
4137

38+
var t = "((test > 25) && (test < 50))";
39+
40+
//template parser
41+
var separator = Whitespaces.AsString().Or(EndOfLine);
42+
var any = AnyCharExcept('$', ' ', '\n').AtLeastOnceString();
43+
var token = PlaceholderParser.Identifier.Between(Char('$')).Try();
44+
var templateParser = token.Or(any).Separated(separator);
45+
46+
//if with lookahead parser
47+
var test341 = String("if")
48+
.Then(Char('('))
49+
.Then(Any.Until(Lookahead(Char(')').Then(End).Try())))
50+
.AsString();
4251

43-
44-
// var str = Any.Many().Select(x => new string(x.ToArray()));
45-
// var parser = placeholder.Or(str);
46-
4752
var template =
4853
"if($condition$)\n" +
4954
"return $value1$;\n" +
5055
"else\n" +
5156
"return $value2$;";
57+
var test = templateParser.ParseOrThrow(template);
5258

53-
var test = testpar.Parse("abdsfdasf $ 2323");
54-
55-
56-
// // var token = Try(PlaceholderParser.Identifier.Between(Char('$').Then(Digit));
57-
// // var testpar = token.Or(Any).Then.Many();
58-
//
59-
// var token = Try(PlaceholderParser.Identifier.Between(Char('$').Then(Digit)));
60-
// Parser<char, string> expr = null;
61-
// var parenthesised = Any
62-
// .Then(Rec(() => expr), (c, c1) =>c + c1 );
63-
//
64-
//
65-
// expr = Real.Select(x=>x.ToString()).Or(parenthesised);
66-
//
67-
// // var any = Any.Select(x=> new string(x.ToArray()));
68-
// // var token = Try(PlaceholderParser.Identifier.Between(Char('$')).Then(Digit, (s, c) => s + c).Select(x=> ));
69-
// // var testpar = token.Or(any).Select().Many();
70-
//
71-
// var test = Any.Then(CurrentPos, (c, pos) => (c, pos.Col)).Many();
72-
//
73-
// var teest2 = PlaceholderParser.Identifier.Test(Char('$'), Char('$'));
74-
//
75-
//
76-
// // var gh = Any.Many().Then(String("from")).ParseOrThrow("fsdkfdsfkJFLDKJFfrom");
77-
//
78-
// var gf = expr.Many().ParseOrThrow("$test$ 4 52");
7959
}
8060
}
8161
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SimpleStateMachine.StructuralSearch.Sandbox
2+
{
3+
public static class TemplateParser
4+
{
5+
6+
}
7+
}

0 commit comments

Comments
 (0)