Skip to content

Commit bdc83b8

Browse files
committed
fix parse with lookahead
1 parent d549739 commit bdc83b8

File tree

4 files changed

+90
-24
lines changed

4 files changed

+90
-24
lines changed

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
1-
using Pidgin;
1+
using System;
2+
using System.Collections.Generic;
3+
using Pidgin;
24

35
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
46
{
57
public class PlaceholderParser: Parser<char, SourceMatch>
68
{
7-
private Parser<char, SourceMatch> _parser;
8-
private string _name;
9-
public PlaceholderParser(string name, Parser<char, SourceMatch> parser)
9+
private Func<IEnumerable<Parser<char, SourceMatch>>, Parser<char, SourceMatch>> _parser;
10+
public string Name { get; }
11+
private IEnumerable<Parser<char, SourceMatch>> _parsers;
12+
public PlaceholderParser(string name, Func<IEnumerable<Parser<char, SourceMatch>>, Parser<char, SourceMatch>> parser)
1013
{
11-
_name = name;
14+
Name = name;
1215
_parser = parser;
1316
}
17+
18+
public void SetParsers(IEnumerable<Parser<char, SourceMatch>> parsers)
19+
{
20+
_parsers = parsers;
21+
}
1422
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expecteds, out SourceMatch result)
1523
{
16-
var isCorrect = _parser.TryParse(ref state, ref expecteds, out result);
24+
var isCorrect = _parser(_parsers).TryParse(ref state, ref expecteds, out result);
1725

1826
return isCorrect;
1927
}

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using Pidgin;
45

56
namespace SimpleStateMachine.StructuralSearch.Sandbox.Custom
@@ -37,17 +38,31 @@ public SeriesParser(IEnumerable<Parser<TToken, T>> parsers, Func<IEnumerable<T>,
3738
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expecteds, out R result)
3839
{
3940
var results = new List<T>();
40-
foreach (var parser in parsers)
41+
for (int i = 0; i < parsers.Count(); i++)
4142
{
43+
var parser = parsers.ElementAt(i);
44+
if (parser is PlaceholderParser placeholderParser)
45+
{
46+
var next = parsers.ElementAt(i + 1) as Parser<char, SourceMatch>;
47+
var end = Parser<char>.End.ThenReturn(SourceMatch.Empty);
48+
var test1 = parsers.ElementAtOrDefault(i + 2);
49+
var test2 = test1 as Parser<char, SourceMatch>;
50+
var nextNext = test2 ?? end;
51+
var list = new List<Parser<char, SourceMatch>>{next, nextNext };
52+
placeholderParser.SetParsers(list);
53+
parser = placeholderParser as Parser<TToken, T>;
54+
}
55+
4256
if (!parser.TryParse(ref state, ref expecteds, out var _result))
4357
{
4458
result = default (R);
4559
return false;
4660
}
47-
Console.WriteLine($"R: {_result}");
61+
62+
Console.WriteLine($"R: {_result.ToString()}");
4863
results.Add(_result);
64+
4965
}
50-
5166
result = _func(results);
5267
return true;
5368
}

src/SimpleStateMachine.StructuralSearch.Sandbox/Program.cs

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,22 @@ static void Main(string[] args)
9696
.Select(x => String(x).AsMatch());
9797

9898
var whitespaces = _whitespaces
99-
.Select(_ => WhitespaceString.AsMatch());
99+
.Select(_ => _whitespaces.AsMatch());
100100

101101
var placeholder = _placeholder
102-
.Select(name => new Custom.PlaceholderParser(name, onPlace.JoinToString().AsMatch()))
102+
.Select(name =>
103+
new Custom.PlaceholderParser(name, list =>
104+
{
105+
var next = list.First();
106+
var nextNext = list.Last();
107+
var _anyCharPlace2 = Any.AtLeastOnceUntil(Lookahead(next.Then(nextNext).Try())).AsString().Try();
108+
var placeTokens2 = OneOf(_anyCharPlace2, _whitespaces).AtLeastOnce();
109+
Parser<char, IEnumerable<string>> onPlace2 = null;
110+
onPlace2 = OneOf(placeTokens2, ManyParenthesised(Stringc, Rec(() => onPlace2), Constant.AllParenthesised))
111+
.AtLeastOnce().MergerMany();
112+
113+
return onPlace2.JoinToString().AsMatch();
114+
}))
103115
.Cast<Parser<char, SourceMatch>>();
104116

105117
var token = OneOf(anyCharExcept, placeholder, whitespaces);
@@ -130,18 +142,17 @@ static void Main(string[] args)
130142
// var templateParser = token.Or(any).Separated(separator);
131143

132144
//if with lookahead parser
133-
// var test341 = String("if")
134-
// .Then(Char('('))
135-
// .Then(Any.Until(Lookahead(Char(')').Then(End).Try())))
136-
// .AsString();
145+
var test341 = String("if")
146+
.Then(Char('('))
147+
.Then(Any.Until(Lookahead(Char(')').Then(End).Try())))
148+
.AsString();
137149

138150
var template1 =
139151
"if($condition$)\n" +
140152
"return $value1$;\n" +
141153
"else\n" +
142154
"return $value2$;";
143-
144-
155+
145156
var example1 =
146157
"if((value) = (5))\n" +
147158
"return \"Result1\";\n" +
@@ -176,7 +187,7 @@ static void Main(string[] args)
176187
var testText = "if((value1)&&(value2))";
177188
var testTextForMatch = "fdjkfnafdjankfjnafkajndaif((value1)&&(value2))";
178189
var testTempalte2 = "return $value$;";
179-
var testText2 = "return 125;;;;\n";
190+
var testText2 = "return 125;;;;";
180191

181192

182193
// var test = _expr.ParseOrThrow(template1);
@@ -207,12 +218,39 @@ static void Main(string[] args)
207218
// var match = String("test").Then(AnyCharExcept(';').AtLeastOnceString().AsMatch())
208219
// .ParseOrThrow(str);
209220

210-
var parser = templateParser.ParseOrThrow(testTempalte);
211-
var skip = Any.ThenReturn(SourceMatch.Empty);
212-
var result = OneOf(parser.Try(), skip)
213-
.Many()
214-
.Select(x => x.Where(match => !Equals(match, SourceMatch.Empty)))
215-
.ParseOrThrow(testTextForMatch);
221+
var _anyCharPlace2 = Any.Until(Lookahead(String(";").Then(End).Try())).AsString();
222+
//
223+
//
224+
// var placeTokens2 = OneOf(_anyCharPlace2, _whitespaces).AtLeastOnce();
225+
// Parser<char, IEnumerable<string>> onPlace2 = null;
226+
// onPlace2 = placeTokens.Or(ManyParenthesised(Stringc, Rec(() => onPlace2), Constant.AllParenthesised))
227+
// .AtLeastOnce().MergerMany();
228+
229+
// return onPlace2.JoinToString().AsMatch(_anyCharPlace2.As);
230+
231+
232+
233+
// var hm = String("return").Then(_whitespaces).Then(_anyCharPlace2);
234+
235+
// var next = String(";");
236+
// var nextNext = End;
237+
// var anyCharPlace2 = Any.AtLeastOnceUntil(Lookahead(next.Then(nextNext).Try())).AsString().Try();
238+
// var placeTokens2 = OneOf(anyCharPlace2, _whitespaces).AtLeastOnce();
239+
// Parser<char, IEnumerable<string>> onPlace2 = null;
240+
// onPlace2 = OneOf(ManyParenthesised(Stringc, Rec(() => onPlace2),
241+
// Constant.AllParenthesised), placeTokens2)
242+
// .AtLeastOnce().MergerMany();
243+
//
244+
// var hm = onPlace2;
245+
// var result = hm.ParseOrThrow("125;;;;");
246+
247+
var parser = templateParser.ParseOrThrow(template1);
248+
var result = parser.ParseOrThrow(example1);
249+
// var skip = Any.ThenReturn(SourceMatch.Empty);
250+
// var result = OneOf(parser.Try(), skip)
251+
// .Many()
252+
// .Select(x => x.Where(match => !Equals(match, SourceMatch.Empty)))
253+
// .ParseOrThrow(testTextForMatch);
216254
}
217255
}
218256
}

src/SimpleStateMachine.StructuralSearch.Sandbox/SourceMatch.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@ public SourceMatch(string value, int start, int end)
1616
public int End { get; }
1717

1818
public int Lenght { get; }
19+
20+
public override string ToString()
21+
{
22+
return Value;
23+
}
1924
}
2025
}

0 commit comments

Comments
 (0)