l43_peg 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -279
  3. data/lib/l43_peg/box.rb +27 -0
  4. data/lib/l43_peg/combinators/boxed.rb +16 -0
  5. data/lib/l43_peg/combinators/choice.rb +30 -0
  6. data/lib/l43_peg/combinators/debug_parser.rb +5 -5
  7. data/lib/l43_peg/combinators/ignore.rb +12 -0
  8. data/lib/l43_peg/combinators/lazy.rb +20 -0
  9. data/lib/l43_peg/combinators/many.rb +26 -21
  10. data/lib/l43_peg/combinators/map.rb +26 -0
  11. data/lib/l43_peg/combinators/map_error.rb +24 -0
  12. data/lib/l43_peg/combinators/satisfy.rb +36 -0
  13. data/lib/l43_peg/combinators/sequence.rb +41 -0
  14. data/lib/l43_peg/combinators.rb +62 -73
  15. data/lib/l43_peg/errors.rb +11 -0
  16. data/lib/l43_peg/failure.rb +17 -1
  17. data/lib/l43_peg/input.rb +12 -10
  18. data/lib/l43_peg/mappers.rb +21 -3
  19. data/lib/l43_peg/parser.rb +4 -8
  20. data/lib/l43_peg/parsers/char_parser.rb +48 -8
  21. data/lib/l43_peg/parsers/end_parser.rb +13 -12
  22. data/lib/l43_peg/parsers/eol_parser.rb +55 -0
  23. data/lib/l43_peg/parsers/escape_parser.rb +21 -0
  24. data/lib/l43_peg/parsers/failure_parser.rb +2 -2
  25. data/lib/l43_peg/parsers/int_parser.rb +9 -7
  26. data/lib/l43_peg/parsers/list_parser.rb +33 -0
  27. data/lib/l43_peg/parsers/literal_parser.rb +23 -0
  28. data/lib/l43_peg/parsers/name_parser.rb +13 -0
  29. data/lib/l43_peg/parsers/rgx_parser.rb +35 -20
  30. data/lib/l43_peg/parsers/string_parser.rb +26 -0
  31. data/lib/l43_peg/parsers/success_parser.rb +21 -0
  32. data/lib/l43_peg/parsers/symbol_parser.rb +19 -0
  33. data/lib/l43_peg/parsers/ws_parser.rb +20 -0
  34. data/lib/l43_peg/parsers.rb +50 -24
  35. data/lib/l43_peg/stop.rb +7 -7
  36. data/lib/l43_peg/success.rb +10 -12
  37. data/lib/l43_peg/version.rb +1 -1
  38. data/lib/l43_peg.rb +10 -29
  39. metadata +37 -13
  40. data/lib/l43_peg/cache.rb +0 -9
  41. data/lib/l43_peg/combinators/sel.rb +0 -24
  42. data/lib/l43_peg/combinators/seq.rb +0 -29
  43. data/lib/l43_peg/helper.rb +0 -13
  44. data/lib/l43_peg/parsers/rgx_tokenizer.rb +0 -24
  45. data/lib/l43_peg/parsers/sel_rgx_parser.rb +0 -25
  46. data/lib/l43_peg/parsers/token_parser.rb +0 -32
  47. data/lib/l43_peg/parsers/tokens_parser.rb +0 -63
  48. data/lib/l43_peg/parsers/verb_parser.rb +0 -23
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module L43Peg
4
- module Parsers
5
- class TokensParser < L43Peg::Parser
6
-
7
- private
8
-
9
- def initialize(map, name: nil, stop: nil, &blk)
10
- map = _check_arg!(map)
11
- name = name || "tokens_parser(#{map.inspect})"
12
- super(name) do |tokens, cache, _name|
13
- case _find_matching(map, tokens)
14
- in [token, success]
15
- _succeed(tokens:, token:, stop:, success:, &blk)
16
- else
17
- reason = "no token matches (in #{name})"
18
- L43Peg::Failure.new(cache:, input: tokens, parsed_by: self, reason:)
19
- end
20
- end
21
-
22
- end
23
-
24
- def _check_arg!(map)
25
- case map
26
- when Hash
27
- _mk_tokens(map)
28
- else
29
- raise ArgumentError, "#{map.inspect} must be a regular expression or a string"
30
- end
31
- end
32
-
33
- def _find_matching(map, tokens)
34
- map.each do |token, token_parser|
35
- case token_parser.(tokens)
36
- in L43Peg::Success => success
37
- return [token, success]
38
- else
39
- end
40
- end
41
- nil
42
- end
43
-
44
- def _mk_tokens(map)
45
- map.map do |token, spec|
46
- [token, TokenParser.new(Regexp.compile(spec), capture: 1)]
47
- end.to_h
48
- end
49
-
50
- def _succeed(stop:, success:, token:, tokens:, &blk)
51
- return L43Peg::Stop.new if token == stop
52
-
53
- result = if blk
54
- blk.(success.ast)
55
- else
56
- success.ast
57
- end
58
- L43Peg::Success.new(ast: {token => result}, cache: success.cache, rest: success.rest, position: tokens.position)
59
- end
60
- end
61
- end
62
- end
63
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module L43Peg
4
- module Parsers
5
- class VerbParser < L43Peg::Parser
6
-
7
- private
8
-
9
- def initialize(verb, name: nil)
10
- name = name || "verb_parser(#{verb.inspect})"
11
- super(name) do |input, cache, _name|
12
- if input.input.start_with?(verb)
13
- L43Peg::Success.new(ast: verb, cache:, rest: input.drop(verb), position: input.position)
14
- else
15
- L43Peg::Failure.new(cache:, input:, parsed_by: self, reason: "input does not start with #{verb.inspect} (in #{name})")
16
- end
17
- end
18
- end
19
-
20
- end
21
- end
22
- end
23
- # SPDX-License-Identifier: AGPL-3.0-or-later