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
@@ -6,41 +6,56 @@ module L43Peg
6
6
 
7
7
  private
8
8
 
9
- def initialize(rgx, name: nil, **options)
10
- name = name || "rgx_parser(#{rgx.inspect})"
11
- rgx = _mk_rgx(rgx)
12
- warn_on_empty = options.fetch(:warn_on_empty, true)
13
- super(name) do |input, cache, _name|
14
- case rgx.match(input.input)
9
+ def initialize(*regexen, name: nil, capture: nil, warn_on_empty: true, grouped: false)
10
+ name ||= "rgx_parser(#{regexen.inspect})"
11
+ rgx = _mk_regexen(regexen.flatten, grouped:)
12
+
13
+ super(name) do |input|
14
+ case rgx.match(input.src)
15
15
  in MatchData => md
16
- ast = _from_match(md, options)
16
+ ast = _from_match(md, capture:, grouped:)
17
17
  if ast.empty? && warn_on_empty
18
18
  $stderr.puts("Warning, parser #{name} succeeds with empty match")
19
19
  end
20
- L43Peg::Success.new(ast:, cache:, rest: input.drop(md[0]), position: input.position)
20
+ L43Peg::Success.new(ast:, parsed: md[0], rest: input.drop(md[0]), position: input.position)
21
21
  else
22
- L43Peg::Failure.new(cache:, input:, parsed_by: self, reason: "input does not match #{rgx.inspect} (in #{name})")
22
+ L43Peg::Failure.new(parsed_by: self, reason: "input does not match", name:)
23
23
  end
24
24
  end
25
25
  end
26
26
 
27
- def _from_match(md, options)
28
- case options[:capture]
29
- in NilClass
30
- md[1] || md[0]
31
- in Integer => n
32
- md[n]
33
- in :all
34
- md.to_a
27
+ def _from_match(md, capture:, grouped:)
28
+ if grouped
29
+ md.captures
30
+ else
31
+ case capture
32
+ in NilClass
33
+ md[1] || md[0]
34
+ in Integer => n
35
+ md[n]
36
+ in :all
37
+ md.to_a
38
+ end
35
39
  end
36
40
  end
37
41
 
38
- def _mk_rgx(rgx)
42
+ def _maybe_grouped(src, grouped:) = grouped ? "(#{src})" : src
43
+
44
+ def _mk_regexen(regexen, grouped:)
45
+ src = ["\\A", *regexen.map { _mk_rgx(it, grouped:) }].join
46
+ Regexp.compile(src)
47
+ end
48
+
49
+ def _mk_rgx(rgx, grouped:)
39
50
  case rgx
40
51
  when String
41
- Regexp.compile("\\A#{rgx}")
52
+ _maybe_grouped rgx, grouped:
53
+ when Symbol
54
+ _maybe_grouped "[[:#{rgx}:]]+", grouped:
55
+ when Regexp
56
+ _maybe_grouped rgx.source, grouped:
42
57
  else
43
- rgx
58
+ raise ArgumentError, "#[rgx.inspect} is not a Regexp, String or Symbol"
44
59
  end
45
60
  end
46
61
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43Peg
4
+ module Parsers
5
+ module StringParser extend self
6
+ include Combinators
7
+ include Parsers
8
+ def string_parser(name: nil, escape: "\\", double_escape: false, quote: '"')
9
+ name = name || "string_parser(escape: #{escape}, double_escape: #{double_escape})"
10
+ choices = [
11
+ (literal_parser(quote + quote).map { quote } if double_escape),
12
+ escape_parser(escape),
13
+ char_parser.satisfy { |ast| ast != quote }
14
+ ].compact
15
+
16
+ parser = sequence(
17
+ char_parser(quote).ignore,
18
+ many(
19
+ choice(choices)
20
+ ),
21
+ char_parser(quote).ignore).map(&:join)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43Peg
4
+ module Parsers
5
+ class SuccessParser < L43Peg::Parser
6
+
7
+ def self.instance
8
+ @__instance__ ||= new
9
+ end
10
+
11
+ private
12
+
13
+ def initialize
14
+ super('success_parser') do |input|
15
+ L43Peg::Success.new(ast: nil, parsed: '', rest: input)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43Peg
4
+ module Parsers
5
+ module SymbolParser extend self
6
+ include Combinators
7
+ include Parsers
8
+ def symbol_parser(name: nil, symbol_head: ':')
9
+ name = name || "symbole_parser(symbol_head: #{symbol_head})"
10
+ sequence(
11
+ char_parser(symbol_head).ignore,
12
+ name_parser,
13
+ name:)
14
+ .boxed('Sym', &:first)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43Peg
4
+ module Parsers
5
+ module WsParser extend self
6
+ def ws_parser(name:, min:, skip_lines: false, ignore: true)
7
+ name = name || "ws_parser(min: #{min})"
8
+ charset = " \t"
9
+ charset << "\n" if skip_lines
10
+ parser = Combinators.many(Parsers.char_parser(charset), min:, name:)
11
+ if ignore
12
+ parser.ignore
13
+ else
14
+ parser
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,33 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'l43_peg/parsers/char_parser'
4
+ require 'l43_peg/parsers/eol_parser'
5
+ require 'l43_peg/parsers/end_parser'
6
+ require 'l43_peg/parsers/escape_parser'
7
+ require 'l43_peg/parsers/failure_parser'
8
+ require 'l43_peg/parsers/int_parser'
9
+ require 'l43_peg/parsers/list_parser'
10
+ require 'l43_peg/parsers/literal_parser'
11
+ require 'l43_peg/parsers/name_parser'
12
+ require 'l43_peg/parsers/rgx_parser'
13
+ require 'l43_peg/parsers/string_parser'
14
+ require 'l43_peg/parsers/success_parser'
15
+ require 'l43_peg/parsers/symbol_parser'
16
+ require 'l43_peg/parsers/ws_parser'
3
17
 
4
18
  module L43Peg
5
19
  module Parsers extend self
6
20
 
7
- require 'l43_peg/combinators'
8
- require 'l43_peg/parsers/char_parser'
9
- require 'l43_peg/parsers/end_parser'
10
- require 'l43_peg/parsers/failure_parser'
11
- require 'l43_peg/parsers/int_parser'
12
- require 'l43_peg/parsers/rgx_parser'
13
- require 'l43_peg/parsers/rgx_tokenizer'
14
- require 'l43_peg/parsers/sel_rgx_parser'
15
- require 'l43_peg/parsers/token_parser'
16
- require 'l43_peg/parsers/tokens_parser'
17
- require 'l43_peg/parsers/verb_parser'
18
-
19
- def args_parser(args, name: nil, stop: nil, &blk) =
20
- L43Peg::Combinators.args_parser(args, name:, stop:, &blk)
21
- def char_parser(charset = nil) = L43Peg::Parsers::CharParser.new(charset)
22
- def end_parser = L43Peg::Parsers::EndParser.instance
23
- def failure_parser = L43Peg::Parsers::FailureParser.instance
24
- def int_parser = L43Peg::Parsers::IntParser.instance
25
- def rgx_parser(rgx, name: nil, **o) = L43Peg::Parsers::RgxParser.new(rgx, name:, **o)
26
- # def rgx_tokenizer(rgxn, name: nil, **o) = L43Peg::Parsers::RgxTokenizer.new(rgxn, name:, **o)
27
- def token_parser(spc, name: nil, **o) = L43Peg::Parsers::TokenParser.new(spc, name:, **o)
28
- def tokens_parser(map, name: nil, stop: nil, &b) =
29
- L43Peg::Parsers::TokensParser.new(map, name:, stop:, &b)
30
- def verb_parser(verb, name: nil) = L43Peg::Parsers::VerbParser.new(verb, name:)
21
+ def char_parser (charset=nil, name: nil, allow_eol: false) =
22
+ CharParser.new(charset, name:, allow_eol:)
23
+
24
+ def eol_parser(succeed_at_end: false) =
25
+ EolParser.eol_parser(succeed_at_end:)
26
+
27
+ def end_parser = EndParser.instance
28
+
29
+ def escape_parser(escape_char_set, escapees=nil, name: nil, with_box: nil) =
30
+ EscapeParser.escape_parser(escape_char_set, escapees, name:, with_box:)
31
+
32
+ def failure_parser = FailureParser.instance
33
+
34
+ def int_parser = IntParser.instance
35
+
36
+ def list_parser(**options) = ListParser.list_parser(**options)
37
+
38
+ def literal_parser(verb, name: nil) = LiteralParser.new(verb, name:)
39
+
40
+ def name_parser(name: nil, begin_rgx: :alpha, inner_rgx: /[_[:alnum:]]*/, with_box: nil) =
41
+ NameParser.name_parser(name:, begin_rgx:, inner_rgx:, with_box:)
42
+
43
+ def rgx_parser(*regexen, name: nil, capture: nil, warn_on_empty: true, grouped: false) =
44
+ RgxParser.new(*regexen, name:, capture:, warn_on_empty:, grouped:)
45
+
46
+ def string_parser(escape: "\\", double_escape: false, name: nil, quote: '"') =
47
+ StringParser.string_parser(escape:, double_escape:, name:, quote:)
48
+
49
+ def success_parser = SuccessParser.instance
50
+
51
+ def symbol_parser(name: nil, symbol_head: ':') =
52
+ SymbolParser.symbol_parser(name:, symbol_head:)
53
+
54
+ def ws_parser(name: nil, min: 0, skip_lines: false) =
55
+ WsParser.ws_parser(name:, min:, skip_lines:)
56
+
31
57
  end
32
58
  end
33
59
  # SPDX-License-Identifier: Apache-2.0
data/lib/l43_peg/stop.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module L43Peg
4
- class Stop
5
- extend L43::OpenObject
6
- attributes
7
- # A placeholder to halt many
8
- end
9
- end
3
+ # module L43Peg
4
+ # class Stop
5
+ # extend L43::OpenObject
6
+ # attributes
7
+ # # A placeholder to halt many
8
+ # end
9
+ # end
10
10
  # SPDX-License-Identifier: Apache-2.0
@@ -4,31 +4,29 @@ module L43Peg
4
4
  class Success
5
5
  extend L43::OpenObject
6
6
 
7
- attributes ast: nil, cache: nil, position: nil, rest: nil do
7
+ attributes ast: nil, parsed: '', position: nil, rest: nil, ok: true do
8
8
  @position ||= _position
9
9
  end
10
10
 
11
11
  def debug
12
12
  "Success<" +
13
13
  [
14
- "ast:#{ast.inspect}", "cache:#{cache.cache.inspect}", "rest:#{rest.input.inspect}"
14
+ "ast:#{ast.inspect}", "parsed:#{parsed.inspect}", "rest:#{rest.src.inspect}"
15
15
  ].join(" ") + ">"
16
16
  end
17
- def map(&mapper)
17
+
18
+ def map(box: nil, &mapper)
18
19
  update_attribute(:ast, &mapper)
19
- # self.class.new(ast: mapper.(ast), cache:, position:, rest:)
20
+ .update_attribute_if(:ast, box) do |ast|
21
+ Box.make(box).new(ast)
22
+ end
20
23
  end
21
24
 
25
+ def deconstruct(*) = [:ok, ast, rest]
26
+
22
27
  private
23
28
 
24
- def _position
25
- case @rest
26
- when Tokens
27
- 1
28
- else
29
- [1, 1]
30
- end
31
- end
29
+ def _position = [1, 1]
32
30
  end
33
31
  end
34
32
  # SPDX-License-Identifier: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module L43Peg
4
- VERSION = '0.1.9'
4
+ VERSION = '0.2.1'
5
5
  end
6
6
  # SPDX-License-Identifier: AGPL-3.0-or-later
data/lib/l43_peg.rb CHANGED
@@ -2,42 +2,23 @@
2
2
 
3
3
  require 'l43/open_object'
4
4
 
5
- require 'l43_peg/cache'
5
+ require 'l43_peg/errors'
6
6
  require 'l43_peg/failure'
7
- require 'l43_peg/success'
8
-
9
7
  require 'l43_peg/input'
10
- require 'l43_peg/stop'
11
- require 'l43_peg/tokens'
12
-
8
+ require 'l43_peg/mappers'
13
9
  require 'l43_peg/parser'
10
+ require 'l43_peg/success'
11
+
12
+ require 'l43_peg/combinators'
14
13
  require 'l43_peg/parsers'
15
14
 
16
- ##
17
- # The main namespace
18
15
  module L43Peg extend self
19
- ##
20
- #
21
- # A convenience function
22
- def parse_string(parser, input, lnb: 1, col: 1, context: {})
23
- input = Input.new(input:, col:, lnb:, context:)
24
- _parse(parser, input)
25
- end
26
-
27
- def parse_tokens(parser, tokens, tnb: 1, context: {})
28
- tokens = Tokens.new(tokens:, tnb:, context:)
29
- _parse(parser, tokens)
30
- end
31
-
32
- private
16
+ include Combinators, Parsers
33
17
 
34
- def _parse(parser, input)
35
- case parser.(input)
36
- in Success => success
37
- [:ok, success.ast]
38
- in Failure => failure
39
- [:error, failure.reason]
40
- end
18
+ def parse(input, with: parser, col: 1, lnb: 1)
19
+ input = Input.new(src: input, col:, lnb:) unless Input === input
20
+ with = Parsers.send with if Symbol === with
21
+ with.(input)
41
22
  end
42
23
  end
43
24
  # SPDX-License-Identifier: AGPL-3.0-or-later
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_peg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-04-15 00:00:00.000000000 Z
10
+ date: 2026-04-25 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: l43_open_object
@@ -15,14 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.9
18
+ version: 0.2.4
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.9
25
+ version: 0.2.4
26
+ - !ruby/object:Gem::Dependency
27
+ name: l43_core
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.2.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.2.0
26
40
  description: |
27
41
  A (still incomplete) PEG Library
28
42
 
@@ -36,28 +50,38 @@ files:
36
50
  - README.md
37
51
  - lib/l43/match_data_extenstion.rb
38
52
  - lib/l43_peg.rb
39
- - lib/l43_peg/cache.rb
53
+ - lib/l43_peg/box.rb
40
54
  - lib/l43_peg/combinators.rb
55
+ - lib/l43_peg/combinators/boxed.rb
56
+ - lib/l43_peg/combinators/choice.rb
41
57
  - lib/l43_peg/combinators/debug_parser.rb
58
+ - lib/l43_peg/combinators/ignore.rb
59
+ - lib/l43_peg/combinators/lazy.rb
42
60
  - lib/l43_peg/combinators/many.rb
43
- - lib/l43_peg/combinators/sel.rb
44
- - lib/l43_peg/combinators/seq.rb
61
+ - lib/l43_peg/combinators/map.rb
62
+ - lib/l43_peg/combinators/map_error.rb
63
+ - lib/l43_peg/combinators/satisfy.rb
64
+ - lib/l43_peg/combinators/sequence.rb
65
+ - lib/l43_peg/errors.rb
45
66
  - lib/l43_peg/failure.rb
46
- - lib/l43_peg/helper.rb
47
67
  - lib/l43_peg/input.rb
48
68
  - lib/l43_peg/mappers.rb
49
69
  - lib/l43_peg/parser.rb
50
70
  - lib/l43_peg/parsers.rb
51
71
  - lib/l43_peg/parsers/char_parser.rb
52
72
  - lib/l43_peg/parsers/end_parser.rb
73
+ - lib/l43_peg/parsers/eol_parser.rb
74
+ - lib/l43_peg/parsers/escape_parser.rb
53
75
  - lib/l43_peg/parsers/failure_parser.rb
54
76
  - lib/l43_peg/parsers/int_parser.rb
77
+ - lib/l43_peg/parsers/list_parser.rb
78
+ - lib/l43_peg/parsers/literal_parser.rb
79
+ - lib/l43_peg/parsers/name_parser.rb
55
80
  - lib/l43_peg/parsers/rgx_parser.rb
56
- - lib/l43_peg/parsers/rgx_tokenizer.rb
57
- - lib/l43_peg/parsers/sel_rgx_parser.rb
58
- - lib/l43_peg/parsers/token_parser.rb
59
- - lib/l43_peg/parsers/tokens_parser.rb
60
- - lib/l43_peg/parsers/verb_parser.rb
81
+ - lib/l43_peg/parsers/string_parser.rb
82
+ - lib/l43_peg/parsers/success_parser.rb
83
+ - lib/l43_peg/parsers/symbol_parser.rb
84
+ - lib/l43_peg/parsers/ws_parser.rb
61
85
  - lib/l43_peg/stop.rb
62
86
  - lib/l43_peg/success.rb
63
87
  - lib/l43_peg/tokens.rb
data/lib/l43_peg/cache.rb DELETED
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module L43Peg
4
- class Cache
5
- extend L43::OpenObject
6
- attributes cache: {}
7
- end
8
- end
9
- # SPDX-License-Identifier: Apache-2.0
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../helper"
4
- module L43Peg
5
- module Combinators
6
- module Sel extend self
7
- include L43Peg::Helper
8
-
9
- def sel(input:, cache:, name:, parsers:)
10
- parsers.each do |parser|
11
- case parser.(input, cache:)
12
- in L43Peg::Success => success
13
- return success
14
- else
15
- end
16
- end
17
-
18
- fail_parser("sel #{name} could not match any option", input:)
19
- end
20
-
21
- end
22
- end
23
- end
24
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../helper"
4
- module L43Peg
5
- module Combinators
6
- module Seq extend self
7
-
8
- include L43Peg::Helper
9
- def seq(input:, cache:, name:, parsers:)
10
- curr_input = input
11
- curr_cache = cache
12
- ast = []
13
- parsers.each do |parser|
14
- case parser.(curr_input, cache: curr_cache)
15
- in L43Peg::Failure => failure
16
- return L43Peg::Failure.new(reason: "#{failure.reason} in (#{name})", position: failure.position, input:)
17
- in L43Peg::Success => success
18
- ast.push(success.ast)
19
- curr_input = success.rest
20
- curr_cache = success.cache
21
- end
22
- end
23
- succeed_parser(ast, curr_input, cache: curr_cache)
24
- end
25
-
26
- end
27
- end
28
- end
29
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module L43Peg
4
- module Helper
5
- def fail_parser(reason, input: nil)
6
- L43Peg::Failure.new(reason:, input:)
7
- end
8
- def succeed_parser(ast, input, cache: nil)
9
- L43Peg::Success.new(ast:, rest: input, cache: cache || input.cache)
10
- end
11
- end
12
- end
13
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # module L43Peg
4
- # module Parsers
5
- # class RgxTokenizer < L43Peg::Parser
6
-
7
- # private
8
-
9
- # def initialize(rgxen, name: nil, **options)
10
- # name = name || "rgx_tokenizer(#{rgxen.inspect})"
11
- # parsers = rgxen.map(&_mk_rgx_parser)
12
- # Combinators.sel(parsers)
13
- # end
14
-
15
- # def _mk_rgx_parser
16
- # -> rgxspec do
17
- # name, rgx, capture = rgxspec
18
- # Combinators.map(Parsers.rgx_parser(rgx, capture:)) { |captures| [name, captures] }
19
- # end
20
- # end
21
- # end
22
- # end
23
- # end
24
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # module L43Peg
4
- # module Parsers
5
- # class SelRgxParser < L43Peg::Parser
6
-
7
- # private
8
-
9
- # def initialize(rgxen, name: nil)
10
- # name = name || "sel_rgx_parser(#{rgxen.inspect})"
11
- # parsers = rgxen.map(&_mk_rgx_parser)
12
- # Combinators.sel(parsers)
13
- # end
14
-
15
- # def _mk_rgx_parser
16
- # -> rgxspec do
17
- # name, rgx, capture, fn = rgxspec
18
- # fn ||= (-> (captures) { [name, captures] })
19
- # Combinators.map(Parsers.rgx_parser(rgx, capture:), &fn)
20
- # end
21
- # end
22
- # end
23
- # end
24
- # end
25
- # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module L43Peg
4
- module Parsers
5
- class TokenParser < L43Peg::Parser
6
-
7
- private
8
-
9
- def initialize(token_spec, name: nil, **options)
10
- _check_arg!(token_spec)
11
- name = name || "token_parser(#{token_spec.inspect})"
12
- super(name) do |tokens, cache, _name|
13
- if result = tokens.match(token_spec, options[:capture])
14
- L43Peg::Success.new(ast: result, cache:, rest: tokens.drop(1), position: tokens.position)
15
- else
16
- reason = "token #{tokens.head.inspect} does not match #{token_spec.inspect} (in #{name})"
17
- L43Peg::Failure.new(cache:, input: tokens, parsed_by: self, reason:)
18
- end
19
- end
20
- end
21
-
22
- def _check_arg!(token_spec)
23
- case token_spec
24
- when Regexp, String
25
- else
26
- raise ArgumentError, "#{token_spec.inspect} must be a regular expression or a string"
27
- end
28
- end
29
- end
30
- end
31
- end
32
- # SPDX-License-Identifier: AGPL-3.0-or-later