l43_peg 0.1.2 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -1
- data/lib/l43_peg/combinators/many.rb +6 -1
- data/lib/l43_peg/combinators.rb +2 -2
- data/lib/l43_peg/helper.rb +2 -2
- data/lib/l43_peg/parsers/tokens_parser.rb +5 -3
- data/lib/l43_peg/parsers.rb +2 -1
- data/lib/l43_peg/stop.rb +10 -0
- data/lib/l43_peg.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 733dffa78d9d7b41f75297f5d9f3b2d8e77212df079cd0643d39fc876b87f91d
|
4
|
+
data.tar.gz: c392f1ece61f72a537f673ec9f4f0b235eb6319ea0a90cf553ce11415f396d7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 518b0be6499f49df9ec63c334e4067f1b679d592eed92150b17057f71b4eaa54527339e30e2c48f1a7dbd2538cffc2b9c1df16de318857309b097be7ce475c4e
|
7
|
+
data.tar.gz: 3be2dfb70569649ae360192b0fca8f6beb923127a8020992881b158cc11fc2954848a424ba7ee8801410a4882c4b3246a9ec9716e31eaf482c1ba5b98d2b8326
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# L43Peg
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/l43_peg.svg)](https://badge.fury.io/rb/l43_peg)
|
4
|
+
|
3
5
|
## A Parse Expression Grammar library for Ruby
|
4
6
|
|
5
7
|
### This Version (v0.1.x) is Alpha Quality (many PEG features are missing, like recursion and even alternatives.
|
@@ -68,9 +70,36 @@ When we map the parser
|
|
68
70
|
Then we can convert the string valus
|
69
71
|
|
70
72
|
```ruby
|
71
|
-
assert_parse_success(
|
73
|
+
assert_parse_success(int_arg_parser, %w[--start=42 --end=44 --inc=2], ast: {start: 42, end: 44, inc: 2}, rest: [])
|
74
|
+
```
|
75
|
+
|
76
|
+
#### Context: Knowing When To Stop
|
77
|
+
|
78
|
+
An argument parser that respects itself provides a means to _end_ argument parsing even if more matches follow.
|
79
|
+
An exmaple for that is the posix argument `--`
|
80
|
+
|
81
|
+
We can use whatever we want in `args_parser`, here is a variation:
|
82
|
+
|
83
|
+
Given the specification
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
let :args do
|
87
|
+
{
|
88
|
+
width: "w:(\\d+)",
|
89
|
+
height: "h:(\\d+)",
|
90
|
+
__stop: "(::)"
|
91
|
+
}
|
92
|
+
end
|
93
|
+
let(:wh_parser) {args_parser(args, stop: :__stop, &:to_i)}
|
72
94
|
```
|
73
95
|
|
96
|
+
Then parsing the following input
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
input = %w[h:42 w:73 :: w:74]
|
100
|
+
ast = {height: 42, width: 73}
|
101
|
+
assert_parse_success(wh_parser, input, ast:, rest: %w[w:74])
|
102
|
+
```
|
74
103
|
|
75
104
|
## Author
|
76
105
|
|
@@ -24,9 +24,14 @@ module L43Peg
|
|
24
24
|
count += 1
|
25
25
|
in L43Peg::Failure
|
26
26
|
if count < min
|
27
|
-
return fail_parser("many #{name} should match at least #{min} times but did only #{count} times")
|
27
|
+
return fail_parser("many #{name} should match at least #{min} times but did only #{count} times", input:)
|
28
28
|
end
|
29
29
|
return succeed_parser(ast, curr_input, cache: curr_cache)
|
30
|
+
in L43Peg::Stop
|
31
|
+
if count < min
|
32
|
+
return fail_parser("many #{name} should match at least #{min} times but did only #{count} times", input:)
|
33
|
+
end
|
34
|
+
return succeed_parser(ast, curr_input.drop, cache: curr_cache)
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|
data/lib/l43_peg/combinators.rb
CHANGED
@@ -13,8 +13,8 @@ module L43Peg
|
|
13
13
|
include L43Peg::Mappers
|
14
14
|
include L43Peg::Parsers
|
15
15
|
|
16
|
-
def args_parser(definitions, name: nil, &block)
|
17
|
-
parser = tokens_parser(definitions, &block)
|
16
|
+
def args_parser(definitions, name: nil, stop: nil, &block)
|
17
|
+
parser = tokens_parser(definitions, stop:, &block)
|
18
18
|
name = name || "args_parser(#{definitions.inspect})"
|
19
19
|
inner = many(parser)
|
20
20
|
map(inner, name:, fn: join_maps)
|
data/lib/l43_peg/helper.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module L43Peg
|
4
4
|
module Helper
|
5
|
-
def fail_parser(reason)
|
6
|
-
L43Peg::Failure.new(reason:)
|
5
|
+
def fail_parser(reason, input: nil)
|
6
|
+
L43Peg::Failure.new(reason:, input:)
|
7
7
|
end
|
8
8
|
def succeed_parser(ast, input, cache: nil)
|
9
9
|
L43Peg::Success.new(ast:, rest: input, cache: cache || input.cache)
|
@@ -6,13 +6,13 @@ module L43Peg
|
|
6
6
|
|
7
7
|
private
|
8
8
|
|
9
|
-
def initialize(map, name: nil, &blk)
|
9
|
+
def initialize(map, name: nil, stop: nil, &blk)
|
10
10
|
map = _check_arg!(map)
|
11
11
|
name = name || "tokens_parser(#{map.inspect})"
|
12
12
|
super(name) do |tokens, cache, _name|
|
13
13
|
case _find_matching(map, tokens)
|
14
14
|
in [token, success]
|
15
|
-
_succeed(tokens:, token:, success:, &blk)
|
15
|
+
_succeed(tokens:, token:, stop:, success:, &blk)
|
16
16
|
else
|
17
17
|
reason = "no token matches (in #{name})"
|
18
18
|
L43Peg::Failure.new(cache:, input: tokens, parsed_by: self, reason:)
|
@@ -47,7 +47,9 @@ module L43Peg
|
|
47
47
|
end.to_h
|
48
48
|
end
|
49
49
|
|
50
|
-
def _succeed(success:, token:, tokens:, &blk)
|
50
|
+
def _succeed(stop:, success:, token:, tokens:, &blk)
|
51
|
+
return L43Peg::Stop.new if token == stop
|
52
|
+
|
51
53
|
result = if blk
|
52
54
|
blk.(success.ast)
|
53
55
|
else
|
data/lib/l43_peg/parsers.rb
CHANGED
@@ -12,7 +12,8 @@ module L43Peg
|
|
12
12
|
def int_parser = L43Peg::Parsers::IntParser.instance
|
13
13
|
def rgx_parser(rgx, name: nil, **o) = L43Peg::Parsers::RgxParser.new(rgx, name:, **o)
|
14
14
|
def token_parser(spc, name: nil, **o) = L43Peg::Parsers::TokenParser.new(spc, name:, **o)
|
15
|
-
def tokens_parser(map, name: nil, &b) =
|
15
|
+
def tokens_parser(map, name: nil, stop: nil, &b) =
|
16
|
+
L43Peg::Parsers::TokensParser.new(map, name:, stop:, &b)
|
16
17
|
def verb_parser(verb, name: nil) = L43Peg::Parsers::VerbParser.new(verb, name:)
|
17
18
|
end
|
18
19
|
end
|
data/lib/l43_peg/stop.rb
ADDED
data/lib/l43_peg.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: l43_peg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
A (still incomplete) PEG Library
|
@@ -43,9 +43,10 @@ files:
|
|
43
43
|
- lib/l43_peg/parsers/token_parser.rb
|
44
44
|
- lib/l43_peg/parsers/tokens_parser.rb
|
45
45
|
- lib/l43_peg/parsers/verb_parser.rb
|
46
|
+
- lib/l43_peg/stop.rb
|
46
47
|
- lib/l43_peg/success.rb
|
47
48
|
- lib/l43_peg/tokens.rb
|
48
|
-
homepage: https://
|
49
|
+
homepage: https://codeberg.org/lab419/l43_peg
|
49
50
|
licenses:
|
50
51
|
- AGPL-3.0-or-later
|
51
52
|
metadata: {}
|