Skip to content

Commit d5d6d1c

Browse files
committed
push
1 parent 7a7cd1e commit d5d6d1c

File tree

20 files changed

+155
-310
lines changed

20 files changed

+155
-310
lines changed

src/SimpleStateMachine.StructuralSearch.Tests/ExamplesInput/NullUnionOperator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public static void Test1()
99
int? temp2 = 5;
1010

1111
if (temp1 is null)
12-
result = temp2;
12+
result = temp1 ?? temp2;
1313
else
1414
result = temp1;
1515
}

src/SimpleStateMachine.StructuralSearch/Constant.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@ namespace SimpleStateMachine.StructuralSearch;
55

66
internal static class Constant
77
{
8-
/// <summary>
9-
/// Parenthesis empty string
10-
/// </summary>
11-
public static readonly string EmptyString = string.Empty;
12-
13-
/// <summary>
14-
/// String: "Not"
15-
/// </summary>
16-
public const string Not = "Not";
17-
188
/// <summary>
199
/// String: "Then"
2010
/// </summary>
@@ -75,11 +65,6 @@ internal static class Constant
7565
/// </summary>
7666
public const char Comma = ',';
7767

78-
/// <summary>
79-
/// Char: '\''
80-
/// </summary>
81-
public const char SingleQuotes = '\'';
82-
8368
/// <summary>
8469
/// Char: '\"'
8570
/// </summary>
@@ -110,11 +95,6 @@ internal static class Constant
11095
/// </summary>
11196
public const char Underscore = '_';
11297

113-
/// <summary>
114-
/// Char: ':'
115-
/// </summary>
116-
public const char Colon = ':';
117-
11898
/// <summary>
11999
/// String: "=>"
120100
/// </summary>
@@ -160,11 +140,6 @@ internal static class Constant
160140
Space
161141
};
162142

163-
public static readonly IReadOnlySet<char> All = new HashSet<char>(InvalidStringLiteralChars)
164-
{
165-
PlaceholderSeparator,
166-
};
167-
168143
public static readonly IReadOnlySet<char> CharsToEscape = new HashSet<char>
169144
{
170145
DoubleQuotes,

src/SimpleStateMachine.StructuralSearch/Extensions/ParserExtensions.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ public static Parser<TToken, T> Try<TToken, T>(this Parser<TToken, T> parser)
1111
=> Parser.Try(parser);
1212

1313
public static Parser<TToken, IEnumerable<T>> AsMany<TToken, T>(this Parser<TToken, T> parser)
14-
=> parser.Select(IEnumerable<T> (x) => new List<T> { x });
14+
=> parser.Select(IEnumerable<T> (x) => [x]);
1515

1616
public static Parser<TToken, T> AsLazy<TToken, T>(this Func<Parser<TToken, T>> parser)
1717
=> Parser.Rec(() => parser() ?? throw new ArgumentNullException(nameof(parser)));
1818

19-
public static Parser<TToken, IEnumerable<T>> AtLeastOnceUntilNot<TToken, T, U>(this Parser<TToken, T> parser, Parser<TToken, U> terminator) =>
19+
public static Parser<TToken, IEnumerable<T>> AtLeastOnceUntilNot<TToken, T, U>(this Parser<TToken, T> parser,
20+
Parser<TToken, U> terminator) =>
2021
parser != null
2122
? parser.AtLeastOnceUntil(Parser.Not(terminator))
2223
: throw new ArgumentNullException(nameof(parser));
2324

24-
public static Parser<TToken, IEnumerable<T>> UntilNot<TToken, T, U>(this Parser<TToken, T> parser, Parser<TToken, U> terminator)
25+
public static Parser<TToken, IEnumerable<T>> UntilNot<TToken, T, U>(this Parser<TToken, T> parser,
26+
Parser<TToken, U> terminator)
2527
{
2628
ArgumentNullException.ThrowIfNull(parser);
2729

@@ -79,10 +81,16 @@ public static Parser<TToken, T> WithDebug<TToken, T>(this Parser<TToken, T> pars
7981
public static Parser<TToken, TInterface> As<TToken, TClass, TInterface>(this Parser<TToken, TClass> parser)
8082
where TClass : TInterface => parser.Select(x => (TInterface)x);
8183

82-
public static Parser<TToken, T> After<TToken, T, TNextToken>(this Parser<TToken, T> parser, Parser<TToken, TNextToken> parserAfter)
84+
public static Parser<TToken, T> After<TToken, T, TNextToken>(this Parser<TToken, T> parser,
85+
Parser<TToken, TNextToken> parserAfter)
8386
=> parserAfter.Then(parser, (_, t) => t);
8487

8588
// TODO optimization
86-
public static Parser<char, T> ParenthesisedOptional<T, TResult>(this Parser<char, T> parser, Func<char, Parser<char, TResult>> custom)
89+
public static Parser<char, T> ParenthesisedOptional<T, TResult>(this Parser<char, T> parser,
90+
Func<char, Parser<char, TResult>> custom)
8791
=> Parser.OneOf(CommonParser.Parenthesised(parser, custom).Try(), parser);
92+
93+
public static Parser<TToken, Parser<TToken, T>> SelectToParser<TToken, T>(this Parser<TToken, T> parser,
94+
Func<T, Parser<TToken, T>, Parser<TToken, T>> selectFunc)
95+
=> parser.Select(value => selectFunc(value, parser));
8896
}

src/SimpleStateMachine.StructuralSearch/Extensions/StringParserExtensions.cs

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,12 @@ namespace SimpleStateMachine.StructuralSearch.Extensions;
66

77
internal static class StringParserExtensions
88
{
9-
public static Parser<TToken, string> BetweenAsThen<TToken>(this Parser<TToken, string> parser,
10-
Parser<TToken, char> parser1,
11-
Parser<TToken, char> parser2)
12-
{
13-
if (parser1 == null)
14-
throw new ArgumentNullException(nameof(parser1));
15-
if (parser2 == null)
16-
throw new ArgumentNullException(nameof(parser2));
17-
18-
return Parser.Map<TToken, char, string, char, string>(
19-
(before, str, after) => before + str + after,
20-
parser1, parser, parser2);
21-
}
22-
23-
public static Parser<TToken, string> BetweenAsThen<TToken>(this Parser<TToken, string> parser,
24-
Parser<TToken, string> parser1,
25-
Parser<TToken, string> parser2)
26-
{
27-
if (parser1 == null)
28-
throw new ArgumentNullException(nameof(parser1));
29-
if (parser2 == null)
30-
throw new ArgumentNullException(nameof(parser2));
31-
32-
return Parser.Map<TToken, string, string, string, string>(
33-
(before, str, after) => before + str + after,
34-
parser1, parser, parser2);
35-
}
36-
37-
// public static Parser<TToken, IEnumerable<string>> ToMany<TToken>(this Parser<TToken, string> parser)
38-
// => parser.Select(x => new List<string> { x }).As<TToken, List<string>, IEnumerable<string>>();
39-
public static Parser<TToken, IEnumerable<string>> ToMany<TToken>(this Parser<TToken, string> parser)
40-
=> parser.Select(x => new List<string>() { x }).ToIEnumerable();
41-
429
public static Parser<TToken, string> JoinToString<TToken>(this Parser<TToken, IEnumerable<string>> parser, string? separator = null)
4310
{
4411
separator ??= string.Empty;
4512
return parser.Select(x => string.Join(separator, x));
4613
}
4714

48-
public static Parser<TToken, string> JoinToString<TToken>(this Parser<TToken, List<string>> parser, string? separator = null)
49-
{
50-
separator ??= string.Empty;
51-
return parser.Select(x => string.Join(separator, x));
52-
}
53-
5415
public static Parser<TToken, SourceMatch> AsMatch<TToken>(this Parser<TToken, string> parser)
5516
=> parser.Then(Parser<TToken>.CurrentOffset, (s, offset) => new SourceMatch(s, offset - s.Length, offset));
5617

@@ -65,5 +26,5 @@ public static Parser<char, T> Trim<T>(this Parser<char, T> parser)
6526

6627
public static Parser<char, TEnum> AsEnum<TEnum>(this Parser<char, string> parser, bool ignoreCase)
6728
where TEnum : struct, Enum
68-
=> parser.Select(value => System.Enum.Parse<TEnum>(value, ignoreCase));
29+
=> parser.Select(value => Enum.Parse<TEnum>(value, ignoreCase));
6930
}

src/SimpleStateMachine.StructuralSearch/Parsers/EnumParser.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/SimpleStateMachine.StructuralSearch/Parsers/FindParser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ namespace SimpleStateMachine.StructuralSearch.Parsers;
1111

1212
internal class FindParser : IFindParser
1313
{
14-
private SeriesParser Parser { get; }
14+
private FindTemplateParser Parser { get; }
1515

16-
public FindParser(SeriesParser parser)
16+
public FindParser(FindTemplateParser parser)
1717
{
1818
Parser = parser;
1919
}

src/SimpleStateMachine.StructuralSearch/Parsers/SeriesParser.cs renamed to src/SimpleStateMachine.StructuralSearch/Parsers/FindTemplateParser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
namespace SimpleStateMachine.StructuralSearch.Parsers;
77

8-
internal class SeriesParser : Parser<char, IEnumerable<string>>, IContextDependent
8+
internal class FindTemplateParser : Parser<char, IEnumerable<string>>, IContextDependent
99
{
1010
private readonly IEnumerable<Parser<char, string>> _parsers;
1111

12-
public SeriesParser(IEnumerable<Parser<char, string>> parsers)
12+
public FindTemplateParser(IEnumerable<Parser<char, string>> parsers)
1313
{
1414
_parsers = parsers;
1515

src/SimpleStateMachine.StructuralSearch/Parsers/Parsers.cs

Lines changed: 39 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -8,86 +8,48 @@ namespace SimpleStateMachine.StructuralSearch.Parsers;
88

99
internal static class Parsers
1010
{
11-
public static Parser<char, string> String(string value, bool ignoreCase)
12-
=> ignoreCase ? Parser.CIString(value): Parser.String(value);
13-
14-
public static Parser<char, TEnum> After<TEnum>(TEnum value, bool ignoreCase = false)
15-
where TEnum : struct, Enum
16-
=> String(value.ToString(), ignoreCase).AsEnum<TEnum>(ignoreCase);
17-
18-
private static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1,
19-
Parser<TToken, T> parser2, Parser<TToken, T> parser3)
11+
// private static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1,
12+
// Parser<TToken, T> parser2, Parser<TToken, T> parser3)
13+
// {
14+
// ArgumentNullException.ThrowIfNull(parser1);
15+
// ArgumentNullException.ThrowIfNull(parser2);
16+
// ArgumentNullException.ThrowIfNull(parser3);
17+
//
18+
// return Parser.Map((arg1, arg2, arg3) => (IEnumerable<T>)new List<T> { arg1, arg2, arg3 }, parser1, parser2, parser3);
19+
// }
20+
//
21+
// private static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1,
22+
// Parser<TToken, IEnumerable<T>> parser2, Parser<TToken, T> parser3)
23+
// {
24+
// ArgumentNullException.ThrowIfNull(parser1);
25+
// ArgumentNullException.ThrowIfNull(parser2);
26+
// ArgumentNullException.ThrowIfNull(parser3);
27+
//
28+
// return Parser.Map((arg1, arg2, arg3) =>
29+
// {
30+
// var result = arg2.ToList();
31+
// result.Insert(0, arg1);
32+
// result.Add(arg3);
33+
// return (IEnumerable<T>)result;
34+
// }, parser1, parser2, parser3);
35+
// }
36+
37+
public static Parser<char, TResult> BetweenParentheses<T, TResult>(Parser<char, T> expr, Func<char, T, char, TResult> mapFunc)
2038
{
21-
ArgumentNullException.ThrowIfNull(parser1);
22-
ArgumentNullException.ThrowIfNull(parser2);
23-
ArgumentNullException.ThrowIfNull(parser3);
24-
25-
return Parser.Map((arg1, arg2, arg3) => (IEnumerable<T>)new List<T> { arg1, arg2, arg3 }, parser1, parser2, parser3);
39+
var parsers = Constant.AllParentheses.Select(pair => Parser.Map(mapFunc, Parser.Char(pair.Item1), expr, Parser.Char(pair.Item1)));
40+
return Parser.OneOf(parsers);
2641
}
2742

28-
private static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1,
29-
Parser<TToken, IEnumerable<T>> parser2, Parser<TToken, T> parser3)
30-
{
31-
ArgumentNullException.ThrowIfNull(parser1);
32-
ArgumentNullException.ThrowIfNull(parser2);
33-
ArgumentNullException.ThrowIfNull(parser3);
34-
35-
return Parser.Map((arg1, arg2, arg3) =>
36-
{
37-
var result = arg2.ToList();
38-
result.Insert(0, arg1);
39-
result.Add(arg3);
40-
return (IEnumerable<T>)result;
41-
}, parser1, parser2, parser3);
42-
}
43-
44-
public static Parser<TToken, IEnumerable<T>> MapToMany<TToken, T>(Parser<TToken, T> parser1,
45-
Parser<TToken, T> parser2)
46-
{
47-
if (parser1 == null)
48-
throw new ArgumentNullException(nameof(parser1));
49-
if (parser2 == null)
50-
throw new ArgumentNullException(nameof(parser2));
43+
// public static Parser<char, IEnumerable<T>> BetweenOneOfChars<T>(Func<char, Parser<char, T>> leftRight, Parser<char, IEnumerable<T>> expr, params (char, char)[] values)
44+
// => Parser.OneOf(values.Select(x => MapToMany(leftRight(x.Item1), expr, leftRight(x.Item2))));
45+
//
46+
// public static Parser<char, IEnumerable<T>> BetweenOneOfChars<T>(Func<char, Parser<char, T>> leftRight, Parser<char, T> expr, params (char, char)[] values)
47+
// => Parser.OneOf(values.Select(x => MapToMany(leftRight(x.Item1), expr, leftRight(x.Item2))));
48+
//
49+
// public static Parser<char, (TResult, T)> BetweenOneOfChars<T, TResult>(Func<char, char, TResult> resultFunc, Parser<char, T> expr, params (char, char)[] values)
50+
// => Parser.OneOf(values.Select(x => Parser.Map((c1, res, c2) => (resultFunc(c1, c2), res), Parser.Char(x.Item1).Try(), expr, Parser.Char(x.Item2).Try())));
5151

52-
return Parser.Map((arg1, arg2) =>
53-
{
54-
var result = new List<T> { arg1, arg2 };
55-
return (IEnumerable<T>)result;
56-
}, parser1, parser2);
57-
}
58-
59-
public static Parser<char, IEnumerable<T>> BetweenChars<T>(char left, char right,
60-
Func<char, Parser<char, T>> leftRight,
61-
Parser<char, IEnumerable<T>> expr)
62-
=> MapToMany(leftRight(left), expr, leftRight(right));
63-
64-
public static Parser<char, IEnumerable<T>> BetweenOneOfChars<T>(Func<char, Parser<char, T>> leftRight, Parser<char, IEnumerable<T>> expr, params (char, char)[] values)
65-
=> Parser.OneOf(values.Select(x => MapToMany(leftRight(x.Item1), expr, leftRight(x.Item2))));
66-
67-
public static Parser<char, IEnumerable<T>> BetweenOneOfChars<T>(Func<char, Parser<char, T>> leftRight, Parser<char, T> expr, params (char, char)[] values)
68-
=> Parser.OneOf(values.Select(x => MapToMany(leftRight(x.Item1), expr, leftRight(x.Item2))));
69-
70-
public static Parser<char, (TResult, T)> BetweenOneOfChars<T, TResult>(Func<char, char, TResult> resultFunc, Parser<char, T> expr, params (char, char)[] values)
71-
=> Parser.OneOf(values.Select(x => Parser.Map((c1, res, c2) => (resultFunc(c1, c2), res), Parser.Char(x.Item1).Try(), expr, Parser.Char(x.Item2).Try())));
72-
73-
public static Parser<char, TEnum> EnumExcept<TEnum>(bool ignoreCase = false, params TEnum[] excluded)
74-
where TEnum : struct, Enum
75-
=> new EnumParser<TEnum>(ignoreCase, excluded);
76-
77-
public static Parser<char, TEnum> EnumValue<TEnum>(TEnum value, bool ignoreCase = false)
52+
public static Parser<char, TEnum> EnumValue<TEnum>(TEnum value)
7853
where TEnum : struct, Enum
79-
=> String(value.ToString(), ignoreCase).AsEnum<TEnum>(ignoreCase);
80-
81-
public static Parser<char, Match<T>> Match<T>(Parser<char, T> parser)
82-
=> Parser.Map((oldPos, oldOffset, result, newPos, newOffset) =>
83-
{
84-
var line = new LinePosition(oldPos.Line, newPos.Line);
85-
var column = new ColumnPosition(oldPos.Col, newPos.Col);
86-
var offset = new OffsetPosition(oldOffset, newOffset);
87-
var lenght = newOffset - oldOffset;
88-
return new Match<T>(result, lenght, column, line, offset);
89-
},
90-
Parser<char>.CurrentPos, Parser<char>.CurrentOffset,
91-
parser,
92-
Parser<char>.CurrentPos, Parser<char>.CurrentOffset);
54+
=> Parser.CIString(value.ToString()).AsEnum<TEnum>(true);
9355
}

src/SimpleStateMachine.StructuralSearch/Parsers/PlaceholderParser.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,18 @@ protected override Parser<char, string> BuildParser(Func<Parser<char, string>?>
5353
}).Try());
5454
}
5555

56-
var anyString = CommonTemplateParser.StringLiteralChar
56+
var anyString = Grammar.StringLiteralChar
5757
.AtLeastOnceAsStringUntil(lookahead);
5858

59-
var simpleString = CommonTemplateParser.StringLiteral;
60-
var token = Parser.OneOf(simpleString, CommonParser.WhiteSpaces).Try();
59+
var simpleString = Grammar.StringLiteral;
60+
var token = Parser.OneOf(simpleString, Grammar.WhiteSpaces).Try();
6161
Parser<char, string>? term = null;
6262

63-
var parenthesised = Parsers.BetweenOneOfChars
63+
var parenthesised = Parsers.BetweenParentheses
6464
(
65-
leftRight: x => Parser.Char(x).AsString(),
6665
expr: Parser.Rec(() => term ?? throw new ArgumentNullException(nameof(term))),
67-
values: Constant.AllParentheses
68-
).JoinToString();
66+
mapFunc: (c1, s, c2) => $"{c1}{s}{c2}"
67+
);
6968

7069
term = Parser.OneOf(parenthesised, token).Many().JoinToString();
7170

src/SimpleStateMachine.StructuralSearch/Rules/FindRules/IsSubRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public bool Execute(ref IParsingContext context)
2828

2929
return _argument switch
3030
{
31-
PlaceholderType.Var => CommonParser.Identifier.Before(CommonParser.Eof).TryParse(value, out _),
31+
PlaceholderType.Var => Grammar.Identifier.Before(CommonParser.Eof).TryParse(value, out _),
3232
PlaceholderType.Int => int.TryParse(value, out _),
3333
PlaceholderType.Double => double.TryParse(value, out _),
3434
PlaceholderType.DateTime => DateTime.TryParse(value, out _),

0 commit comments

Comments
 (0)