Skip to content

Commit c720d93

Browse files
committed
some for parser
1 parent 6605208 commit c720d93

File tree

3 files changed

+51
-20
lines changed

3 files changed

+51
-20
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expec
2525
result = default (R);
2626
return false;
2727
}
28+
Console.WriteLine($"R: {_result}");
2829
results.Add(_result);
2930
}
3031

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,15 @@ public static Parser<TToken, T> WithDebug<TToken, T>(this Parser<TToken, T> pars
5656
return u;
5757
}, parser, Parser<TToken>.CurrentPos, Parser<TToken>.CurrentSourcePosDelta);
5858
}
59-
59+
60+
public static Parser<TToken, T> WithDebug<TToken, T>(this Parser<TToken, T> parser)
61+
{
62+
return Map((u, t, v) =>
63+
{
64+
Console.WriteLine($"({t.Col}) : {u} ");
65+
return u;
66+
}, parser, Parser<TToken>.CurrentPos, Parser<TToken>.CurrentSourcePosDelta);
67+
}
6068
public static Parser<TToken, T> BetweenAsThen<TToken, T, U, V>(this Parser<TToken, T> parser,
6169
Parser<TToken, U> parser1,
6270
Parser<TToken, V> parser2, Func<U, T, V, T> func)

src/SimpleStateMachine.StructuralSearch.Sandbox/Program.cs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -60,25 +60,22 @@ static void Main(string[] args)
6060
var spaces = Char(' ').AtLeastOnceString();
6161
var endOfLines = EndOfLine.AtLeastOnceString();
6262
var _whitespaces = OneOf(spaces, endOfLines);
63-
var _anyCharExcept = AnyCharExcept('(', ')', '[', ']', '{', '}', '$', ' ', '\n').AtLeastOnceString().Try()
64-
.WithDebug("anyCharExcept");
63+
var _anyCharExcept = AnyCharExcept('(', ')', '[', ']', '{', '}', '$', ' ', '\n').AtLeastOnceString().Try();
6564

6665
Parser<char, IEnumerable<string>> _expr = null;
6766

6867

69-
var _placeholder = PlaceholderParser.Identifier.Between(Char('$')).Try()
70-
.WithDebug("placeholder");
68+
var _placeholder = PlaceholderParser.Identifier.Between(Char('$')).Try();
7169

7270
// var parenthesised1 = Rec(() => expr).Between(Char('('), Char(')')).WithDebug("parenthesised1");
73-
var _parenthesised1 = MapToMany(Stringc('('), Rec(() => _expr), Stringc(')'))
74-
.WithDebug("parenthesised1");
71+
var _parenthesised1 = MapToMany(Stringc('('), Rec(() => _expr), Stringc(')'));
7572
// var parenthesised2 = Rec(() => expr).Between(Char('['), Char(']')).WithDebug("parenthesised1");
76-
var _parenthesised2 = MapToMany(Stringc('['), Rec(() => _expr), Stringc(']'))
77-
.WithDebug("parenthesised2");
73+
var _parenthesised2 = MapToMany(Stringc('['), Rec(() => _expr), Stringc(']'));
7874
// var parenthesised3 = Rec(() => expr).Between(Char('{'), Char('}')).WithDebug("parenthesised1");
79-
var _parenthesised3 = MapToMany(Stringc('{'), Rec(() => _expr), Stringc('}'))
80-
.WithDebug("parenthesised3");
75+
var _parenthesised3 = MapToMany(Stringc('{'), Rec(() => _expr), Stringc('}'));
8176

77+
78+
8279
//don't work
8380
var _token = OneOf(_anyCharExcept, _placeholder, _whitespaces);
8481
var _tokens = _token.AtLeastOnce();
@@ -89,19 +86,36 @@ static void Main(string[] args)
8986
Parser<char, IEnumerable<Parser<char, string>>> expr = null;
9087

9188

89+
var _anyCharPlace = AnyCharExcept('(', ')', '[', ']', '{', '}', ' ', '\n').AtLeastOnceString().Try();
90+
var placeTokens = OneOf(_anyCharPlace, _whitespaces).AtLeastOnce();
91+
Parser<char, IEnumerable<string>> onPlace = null;
92+
var placeParenthesised = MapToMany(Stringc('('), Rec(() => onPlace), Stringc(')'));
93+
onPlace = placeTokens.Or(placeParenthesised).AtLeastOnce().Select(x=>
94+
95+
96+
97+
x).MergerMany();
98+
99+
92100
var parenthesised1 = MapToMany(ParserToParser.Stringc('('), Rec(() => expr), ParserToParser.Stringc(')'));
93101
var parenthesised2 = MapToMany(ParserToParser.Stringc('['), Rec(() => expr), ParserToParser.Stringc(']'));
94102
var parenthesised3 = MapToMany(ParserToParser.Stringc('{'), Rec(() => expr), ParserToParser.Stringc('}'));
95103
var parenthesised = OneOf(parenthesised1, parenthesised2, parenthesised3);
96-
var anyCharExcept = _anyCharExcept.Select(x => String(x));
104+
var anyCharExcept = _anyCharExcept.Select(x =>
105+
{
106+
107+
Console.WriteLine($" Parse {x} => String(\"{x}\")");
108+
return String(x);
109+
});
97110
var whitespaces = _whitespaces.Select(_ => WhitespaceString);
98-
var placeholder = _placeholder.Select(x => _expr.Select(x => string.Join("", x)));
111+
var placeholder = _placeholder.Select(x => onPlace.Select(x => string.Join("", x)));
99112
var token = OneOf(anyCharExcept, placeholder, whitespaces);
100113
var tokens = token.AtLeastOnce();
101114

102115
expr = OneOf(tokens, parenthesised).AtLeastOnce().MergerMany();
103116
var parser = expr.Select(x => Series(x, enumerable => string.Join("", enumerable)));
104117

118+
var test125 = Map((u, v)=> string.Join("", u) + v,onPlace, Stringc(';'));
105119
//
106120
//
107121
//
@@ -124,14 +138,14 @@ static void Main(string[] args)
124138
// .AsString();
125139

126140
var template1 =
127-
"if(($condition$) = ($test$))\n" +
141+
"if($condition$)\n" +
128142
"return $value1$;\n" +
129143
"else\n" +
130144
"return $value2$;";
131145

132146

133147
var example1 =
134-
"if(value == 5)\n" +
148+
"if((value) = (5))\n" +
135149
"return \"Result1\";\n" +
136150
"else\n" +
137151
"return \"Result2\";";
@@ -152,19 +166,27 @@ static void Main(string[] args)
152166
"$var$ = $value2$;\n" +
153167
"}";
154168

155-
169+
// var g = test125.ParseOrThrow("\"Result1\";");
156170

157171
var testTempalte = "if($test$)";
158-
var testText = "if((value1) && (value2))";
172+
var testText = "if((value1)&&(value2))";
159173

160-
var test = _expr.ParseOrThrow(testTempalte);
174+
// var test = _expr.ParseOrThrow(template1);
161175

162176
var resParser = parser.ParseOrThrow(testTempalte);
177+
Console.WriteLine("___________________________________________________________");
163178
var res = resParser.ParseOrThrow(testText);
164179

165180

166-
167-
// var templateResult = test.ParseOrThrow("test");
181+
// OneOf (
182+
// Try ( foo ),
183+
// Try ( bar ),
184+
// Any . ThenReturn ( " " ) // отбрасываем символ
185+
// )
186+
// . Многие ()
187+
// . Select ( xs => string . Join ( " " , xs ));
188+
189+
//var templateResult = test.ParseOrThrow("test");
168190
}
169191
}
170192
}

0 commit comments

Comments
 (0)