Skip to content

Commit f4f65bd

Browse files
authored
Merge pull request #4 from rameel/enhancement
Enhancements * Rename Before parser to ThenIgnore * Add Tiny-C parser to Samples
2 parents 441b97c + 58528c1 commit f4f65bd

23 files changed

Lines changed: 938 additions & 155 deletions

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,40 +22,40 @@ private static Parser<double> CreateParser()
2222
{
2323
// Grammar:
2424
// ----------------------------------------
25-
// Start : Sum $
26-
// Sum : Product (S [+-] Product)*
27-
// Product : Unary (S [*/] Unary)*
28-
// Unary : S '-'? Primary
25+
// Start : S Sum $
26+
// Sum : Product ([+-] S Product)*
27+
// Product : Unary ([*/] S Unary)*
28+
// Unary : '-'? S Primary
2929
// Primary : Parenthesis / Value
30-
// Parenthesis : S '(' Sum S ')'
31-
// Value : S Number
32-
// S : Whitespace*
30+
// Parenthesis : '(' S Sum ')' S
31+
// Value : Number S
32+
// S : [ \r\n\t]*
3333
3434
var sum = Deferred<double>();
35-
var value = S.Then(Literal.Number<double>());
35+
var value = Literal.Number<double>().ThenIgnore(S);
3636

3737
var parenthesis = sum.Between(
38-
Seq(S, L('(')),
39-
Seq(S, L(')'))
38+
Seq(L('('), S),
39+
Seq(L(')'), S)
4040
);
4141

4242
var primary = parenthesis.Or(value);
4343

4444
var unary = Seq(
45-
S,
4645
L('-').Optional(),
46+
S,
4747
primary
48-
).Do((_, u, d) => u.HasValue ? -d : d);
48+
).Do((u, _, d) => u.HasValue ? -d : d);
4949

5050
var product = unary.Fold(
51-
S.Then(OneOf("*/")),
51+
OneOf("*/").ThenIgnore(S),
5252
(l, r, op) => op == '*' ? l * r : l / r);
5353

5454
sum.Parser = product.Fold(
55-
S.Then(OneOf("+-")),
55+
OneOf("+-").ThenIgnore(S),
5656
(l, r, op) => op == '+' ? l + r : l - r);
5757

58-
return sum.Before(Eof);
58+
return sum.Between(S, Eof);
5959
}
6060
```
6161

benchmarks/Parsers/RamstackParsers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ public static class RamstackParsers
77
{
88
public static readonly Parser<string> EmailParser = CreateEmailParser();
99
public static readonly Parser<Unit> EmailVoidParser = EmailParser.Void();
10-
public static readonly Parser<double> ExpressionParser = Samples.ExpressionParser.Parser;
11-
public static readonly Parser<object?> JsonParser = Samples.JsonParser.Parser;
10+
public static readonly Parser<double> ExpressionParser = Samples.CalcExpr.ExpressionParser.Parser;
11+
public static readonly Parser<object?> JsonParser = Samples.Json.JsonParser.Parser;
1212

1313
private static Parser<string> CreateEmailParser()
1414
{
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
3+
using Ramstack.Parsing;
4+
5+
using static Ramstack.Parsing.Parser;
6+
7+
namespace Samples.CalcExpr;
8+
9+
public static class ExpressionParser
10+
{
11+
public static readonly Parser<double> Parser = CreateExpressionParser();
12+
13+
[SuppressMessage("ReSharper", "InconsistentNaming")]
14+
private static Parser<double> CreateExpressionParser()
15+
{
16+
var sum_expr =
17+
Deferred<double>();
18+
19+
var number_expr =
20+
Literal.Number<double>("number").ThenIgnore(S);
21+
22+
var parenthesis_expr =
23+
sum_expr.Between(
24+
Seq(L('('), S),
25+
Seq(L(')'), S));
26+
27+
var primary_expr =
28+
parenthesis_expr.Or(number_expr);
29+
30+
var unary_expr =
31+
Seq(
32+
L('-').Optional(),
33+
S,
34+
primary_expr
35+
).Do((u, _, d) => u.HasValue ? -d : d);
36+
37+
var mul_expr =
38+
unary_expr.Fold(
39+
OneOf("*/").ThenIgnore(S),
40+
(l, r, o) => o == '*' ? l * r : l / r);
41+
42+
sum_expr.Parser =
43+
mul_expr.Fold(
44+
OneOf("+-").ThenIgnore(S),
45+
(l, r, o) => o == '+' ? l + r : l - r);
46+
47+
return sum_expr.Between(S, Eof);
48+
}
49+
}

samples/CalcExpr/README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Simple Calc
2+
3+
This project implements a simple mathematical expression parser.
4+
5+
## Simple Expression Grammar
6+
7+
```sh
8+
start
9+
= sum_expr EOF
10+
;
11+
12+
sum_expr
13+
= mul_expr (S [+-] mul_expr)*
14+
;
15+
16+
mul_expr
17+
= unary_expr (S [*/] unary_expr)*
18+
;
19+
20+
unary_expr
21+
= S "-"? primary_expr
22+
;
23+
24+
primary_expr
25+
= parenthesis_expr / number_expr
26+
;
27+
28+
parenthesis_expr
29+
= S "(" Sum S ")"
30+
;
31+
32+
number_expr
33+
= S [0-9]+
34+
;
35+
36+
S
37+
= [ \t\r\n]*
38+
;
39+
40+
EOF:
41+
= $
42+
;
43+
```

samples/ExpressionParser.cs

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

samples/Json/JsonParser.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using Ramstack.Parsing;
2+
3+
using static Ramstack.Parsing.Literal;
4+
using static Ramstack.Parsing.Parser;
5+
6+
namespace Samples.Json;
7+
8+
public static class JsonParser
9+
{
10+
public static readonly Parser<object?> Parser = CreateJsonParser();
11+
12+
private static Parser<object?> CreateJsonParser()
13+
{
14+
var value =
15+
Deferred<object?>();
16+
17+
var @string =
18+
DoubleQuotedString.Do(object? (s) => s);
19+
20+
var number =
21+
Number<double>().Do(object? (n) => n);
22+
23+
var primitive = OneOf(["true", "false", "null"]).Do(s =>
24+
{
25+
object? r = null;
26+
if (s.Length != 0 && s[0] != 'n')
27+
r = s[0] == 't';
28+
return r;
29+
});
30+
31+
var array = value
32+
.Separated(Seq(L(','), S))
33+
.Between(
34+
Seq(L('['), S),
35+
Seq(L(']'), S))
36+
.Do(object? (list) => list);
37+
38+
var member = Seq(
39+
DoubleQuotedString, S, L(':'), S, value
40+
).Do((name, _, _, _, v) => KeyValuePair.Create(name, v));
41+
42+
var @object = member
43+
.Separated(Seq(L(','), S))
44+
.Between(
45+
Seq(L('{'), S),
46+
Seq(L('}'), S))
47+
.Do(object? (members) => new Dictionary<string, object?>(members));
48+
49+
value.Parser =
50+
Choice(
51+
@string,
52+
number,
53+
primitive,
54+
array,
55+
@object
56+
).ThenIgnore(S);
57+
58+
return S.Then(value);
59+
}
60+
}

samples/Json/README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# JSON Parser
2+
3+
This project implements a simple JSON parser.
4+
5+
## JSON Grammar
6+
7+
```sh
8+
start
9+
= value $
10+
;
11+
12+
value
13+
= (object / array / string / number / "true" / "false" / "null") S
14+
;
15+
16+
object
17+
= "{" S (member ("," S member)*)? "}" S
18+
;
19+
20+
member
21+
= string ":" S value
22+
;
23+
24+
array
25+
= "[" S (value ("," S value)*)? "]" S
26+
;
27+
28+
S
29+
= [ \t\r\n]*
30+
;
31+
```

samples/JsonParser.cs

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

0 commit comments

Comments
 (0)