Skip to content

Commit 9060e62

Browse files
committed
lazy initialization for placeholder parser
1 parent 62e9e2d commit 9060e62

File tree

4 files changed

+30
-19
lines changed

4 files changed

+30
-19
lines changed

src/SimpleStateMachine.StructuralSearch/Parsers/ParserWithLookahead.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace SimpleStateMachine.StructuralSearch
66
{
77
public abstract class ParserWithLookahead<TToken, T> : Parser<TToken, T>
88
{
9-
private Parser<TToken, T> _parser { get; set; }
9+
private Func<Parser<TToken, T>> _parser { get; set; }
1010

1111
public Func<IEnumerable<LookaheadResult<TToken, T>>> OnLookahead { get; set; }
1212

@@ -15,13 +15,14 @@ public abstract Parser<TToken, T> BuildParser(Func<Parser<TToken, T>?> next,
1515

1616
public void Lookahead(Func<Parser<TToken, T>?> next, Func<Parser<TToken, T>?> nextNext)
1717
{
18-
_parser = BuildParser(next, nextNext);
18+
// lazy initialization
19+
_parser = () => BuildParser(next, nextNext);
1920
}
2021

2122
public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expected<TToken>> expected,
2223
out T result)
2324
{
24-
var res = _parser.TryParse(ref state, ref expected, out result);
25+
var res = _parser().TryParse(ref state, ref expected, out result);
2526
return res;
2627
}
2728
}

src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public override Parser<char, string> BuildParser(Func<Parser<char, string>> next
3434
var anyString = CommonTemplateParser.AnyCharWithPlshd
3535
.AtLeastOnceAsStringUntil(lookahead);
3636

37-
var simpleString = CommonTemplateParser.StringWithPlshd.Labelled("simpleString");
37+
var simpleString = CommonTemplateParser.StringWithPlshd;
3838
var token = Parser.OneOf(simpleString, CommonParser.WhiteSpaces).Try();
3939
Parser<char, string> term = null;
4040

@@ -57,11 +57,20 @@ public override Parser<char, string> BuildParser(Func<Parser<char, string>> next
5757
public override bool TryParse(ref ParseState<char> state, ref PooledList<Expected<char>> expected,
5858
out string result)
5959
{
60-
var res = base.TryParse(ref state, ref expected, out result);
61-
62-
if (res)
63-
res &= _context.TryAdd(Name, result);
64-
60+
bool res;
61+
62+
// No use look-ahead if placeholder is already defined
63+
if (_context.TryGet(Name, out var value))
64+
{
65+
res = Parser.String(value).TryParse(ref state, ref expected, out result);
66+
}
67+
else
68+
{
69+
res = base.TryParse(ref state, ref expected, out result);
70+
if (res)
71+
_context.AddPlaceholder(Name, result);
72+
}
73+
6574
return res;
6675
}
6776

src/SimpleStateMachine.StructuralSearch/Parsers/SeriesParser.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public override bool TryParse(ref ParseState<TToken> state, ref PooledList<Expec
3838

3939
void SkipLookedParsers(Parser<TToken, T> parser, ref ParseState<TToken> state)
4040
{
41-
if (parser is not ParserWithLookahead<TToken, T> lookaheadParser)
41+
if (parser is not ParserWithLookahead<TToken, T> lookaheadParser || lookaheadParser is { OnLookahead: null })
4242
return;
43-
43+
4444
var lookaheadResults = lookaheadParser.OnLookahead.Invoke();
4545

4646
foreach (var result in lookaheadResults)
@@ -49,7 +49,8 @@ void SkipLookedParsers(Parser<TToken, T> parser, ref ParseState<TToken> state)
4949
state.Advance(result.TokensCount);
5050
i++;
5151
}
52-
52+
53+
//recursion
5354
foreach (var result in lookaheadResults)
5455
{
5556
SkipLookedParsers(result.Parser, ref state);

src/SimpleStateMachine.StructuralSearch/ParsingContext.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ public class ParsingContext
66
{
77
public Dictionary<string, string> Placeholders { get; } = new();
88

9-
public bool TryAdd(string name, string value)
9+
public bool TryGet(string name, out string value)
1010
{
11-
if (Placeholders.ContainsKey(name))
12-
return Placeholders[name] == value;
13-
14-
Placeholders.Add(name, value);
15-
16-
return true;
11+
return Placeholders.TryGetValue(name, out value);
12+
}
13+
14+
public void AddPlaceholder(string name, string value)
15+
{
16+
Placeholders[name] = value;
1717
}
1818

1919
public string GetPlaceholder(string name)

0 commit comments

Comments
 (0)