l43_peg 0.1.8 → 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.
- checksums.yaml +4 -4
- data/README.md +34 -279
- data/lib/l43_peg/box.rb +27 -0
- data/lib/l43_peg/combinators/boxed.rb +16 -0
- data/lib/l43_peg/combinators/choice.rb +30 -0
- data/lib/l43_peg/combinators/debug_parser.rb +5 -5
- data/lib/l43_peg/combinators/ignore.rb +12 -0
- data/lib/l43_peg/combinators/lazy.rb +20 -0
- data/lib/l43_peg/combinators/many.rb +26 -21
- data/lib/l43_peg/combinators/map.rb +26 -0
- data/lib/l43_peg/combinators/map_error.rb +24 -0
- data/lib/l43_peg/combinators/satisfy.rb +36 -0
- data/lib/l43_peg/combinators/sequence.rb +41 -0
- data/lib/l43_peg/combinators.rb +62 -71
- data/lib/l43_peg/errors.rb +11 -0
- data/lib/l43_peg/failure.rb +17 -1
- data/lib/l43_peg/input.rb +12 -10
- data/lib/l43_peg/mappers.rb +21 -3
- data/lib/l43_peg/parser.rb +4 -4
- data/lib/l43_peg/parsers/char_parser.rb +48 -8
- data/lib/l43_peg/parsers/end_parser.rb +13 -12
- data/lib/l43_peg/parsers/eol_parser.rb +55 -0
- data/lib/l43_peg/parsers/escape_parser.rb +21 -0
- data/lib/l43_peg/parsers/failure_parser.rb +2 -2
- data/lib/l43_peg/parsers/int_parser.rb +9 -7
- data/lib/l43_peg/parsers/list_parser.rb +33 -0
- data/lib/l43_peg/parsers/literal_parser.rb +23 -0
- data/lib/l43_peg/parsers/name_parser.rb +13 -0
- data/lib/l43_peg/parsers/rgx_parser.rb +35 -20
- data/lib/l43_peg/parsers/string_parser.rb +26 -0
- data/lib/l43_peg/parsers/success_parser.rb +21 -0
- data/lib/l43_peg/parsers/symbol_parser.rb +19 -0
- data/lib/l43_peg/parsers/ws_parser.rb +20 -0
- data/lib/l43_peg/parsers.rb +51 -14
- data/lib/l43_peg/stop.rb +7 -7
- data/lib/l43_peg/success.rb +10 -12
- data/lib/l43_peg/version.rb +6 -0
- data/lib/l43_peg.rb +14 -22
- metadata +40 -19
- data/lib/l43/require_helper.rb +0 -8
- data/lib/l43_peg/cache.rb +0 -9
- data/lib/l43_peg/combinators/sel.rb +0 -24
- data/lib/l43_peg/combinators/seq.rb +0 -29
- data/lib/l43_peg/helper.rb +0 -13
- data/lib/l43_peg/parsers/rgx_tokenizer.rb +0 -24
- data/lib/l43_peg/parsers/sel_rgx_parser.rb +0 -25
- data/lib/l43_peg/parsers/token_parser.rb +0 -32
- data/lib/l43_peg/parsers/tokens_parser.rb +0 -63
- 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(
|
|
10
|
-
name
|
|
11
|
-
rgx =
|
|
12
|
-
|
|
13
|
-
super(name) do |input
|
|
14
|
-
case rgx.match(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,
|
|
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:,
|
|
20
|
+
L43Peg::Success.new(ast:, parsed: md[0], rest: input.drop(md[0]), position: input.position)
|
|
21
21
|
else
|
|
22
|
-
L43Peg::Failure.new(
|
|
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,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/l43_peg/parsers.rb
CHANGED
|
@@ -1,22 +1,59 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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'
|
|
5
17
|
|
|
6
18
|
module L43Peg
|
|
7
19
|
module Parsers extend self
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
|
|
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
|
+
|
|
20
57
|
end
|
|
21
58
|
end
|
|
22
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
data/lib/l43_peg/success.rb
CHANGED
|
@@ -4,31 +4,29 @@ module L43Peg
|
|
|
4
4
|
class Success
|
|
5
5
|
extend L43::OpenObject
|
|
6
6
|
|
|
7
|
-
attributes ast: nil,
|
|
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}", "
|
|
14
|
+
"ast:#{ast.inspect}", "parsed:#{parsed.inspect}", "rest:#{rest.src.inspect}"
|
|
15
15
|
].join(" ") + ">"
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
def map(box: nil, &mapper)
|
|
18
19
|
update_attribute(:ast, &mapper)
|
|
19
|
-
|
|
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
|
data/lib/l43_peg.rb
CHANGED
|
@@ -2,31 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
require 'l43/open_object'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
require 'l43_peg/errors'
|
|
6
|
+
require 'l43_peg/failure'
|
|
7
|
+
require 'l43_peg/input'
|
|
8
|
+
require 'l43_peg/mappers'
|
|
9
|
+
require 'l43_peg/parser'
|
|
10
|
+
require 'l43_peg/success'
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def parse_string(parser, input, lnb: 1, col: 1, context: {})
|
|
12
|
-
input = Input.new(input:, col:, lnb:, context:)
|
|
13
|
-
_parse(parser, input)
|
|
14
|
-
end
|
|
12
|
+
require 'l43_peg/combinators'
|
|
13
|
+
require 'l43_peg/parsers'
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
_parse(parser, tokens)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
private
|
|
15
|
+
module L43Peg extend self
|
|
16
|
+
include Combinators, Parsers
|
|
22
17
|
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
in Failure => failure
|
|
28
|
-
[:error, failure.reason]
|
|
29
|
-
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)
|
|
30
22
|
end
|
|
31
23
|
end
|
|
32
24
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
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.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Robert Dober
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2026-04-25 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: l43_open_object
|
|
@@ -16,14 +15,28 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.2.
|
|
18
|
+
version: 0.2.4
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.2.
|
|
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
|
|
27
40
|
description: |
|
|
28
41
|
A (still incomplete) PEG Library
|
|
29
42
|
|
|
@@ -36,38 +49,47 @@ files:
|
|
|
36
49
|
- LICENSE
|
|
37
50
|
- README.md
|
|
38
51
|
- lib/l43/match_data_extenstion.rb
|
|
39
|
-
- lib/l43/require_helper.rb
|
|
40
52
|
- lib/l43_peg.rb
|
|
41
|
-
- lib/l43_peg/
|
|
53
|
+
- lib/l43_peg/box.rb
|
|
42
54
|
- lib/l43_peg/combinators.rb
|
|
55
|
+
- lib/l43_peg/combinators/boxed.rb
|
|
56
|
+
- lib/l43_peg/combinators/choice.rb
|
|
43
57
|
- lib/l43_peg/combinators/debug_parser.rb
|
|
58
|
+
- lib/l43_peg/combinators/ignore.rb
|
|
59
|
+
- lib/l43_peg/combinators/lazy.rb
|
|
44
60
|
- lib/l43_peg/combinators/many.rb
|
|
45
|
-
- lib/l43_peg/combinators/
|
|
46
|
-
- lib/l43_peg/combinators/
|
|
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
|
|
47
66
|
- lib/l43_peg/failure.rb
|
|
48
|
-
- lib/l43_peg/helper.rb
|
|
49
67
|
- lib/l43_peg/input.rb
|
|
50
68
|
- lib/l43_peg/mappers.rb
|
|
51
69
|
- lib/l43_peg/parser.rb
|
|
52
70
|
- lib/l43_peg/parsers.rb
|
|
53
71
|
- lib/l43_peg/parsers/char_parser.rb
|
|
54
72
|
- lib/l43_peg/parsers/end_parser.rb
|
|
73
|
+
- lib/l43_peg/parsers/eol_parser.rb
|
|
74
|
+
- lib/l43_peg/parsers/escape_parser.rb
|
|
55
75
|
- lib/l43_peg/parsers/failure_parser.rb
|
|
56
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
|
|
57
80
|
- lib/l43_peg/parsers/rgx_parser.rb
|
|
58
|
-
- lib/l43_peg/parsers/
|
|
59
|
-
- lib/l43_peg/parsers/
|
|
60
|
-
- lib/l43_peg/parsers/
|
|
61
|
-
- lib/l43_peg/parsers/
|
|
62
|
-
- 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
|
|
63
85
|
- lib/l43_peg/stop.rb
|
|
64
86
|
- lib/l43_peg/success.rb
|
|
65
87
|
- lib/l43_peg/tokens.rb
|
|
88
|
+
- lib/l43_peg/version.rb
|
|
66
89
|
homepage: https://codeberg.org/lab419/l43_peg
|
|
67
90
|
licenses:
|
|
68
91
|
- AGPL-3.0-or-later
|
|
69
92
|
metadata: {}
|
|
70
|
-
post_install_message:
|
|
71
93
|
rdoc_options: []
|
|
72
94
|
require_paths:
|
|
73
95
|
- lib
|
|
@@ -75,15 +97,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
75
97
|
requirements:
|
|
76
98
|
- - ">="
|
|
77
99
|
- !ruby/object:Gem::Version
|
|
78
|
-
version:
|
|
100
|
+
version: 4.0.1
|
|
79
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
102
|
requirements:
|
|
81
103
|
- - ">="
|
|
82
104
|
- !ruby/object:Gem::Version
|
|
83
105
|
version: '0'
|
|
84
106
|
requirements: []
|
|
85
|
-
rubygems_version:
|
|
86
|
-
signing_key:
|
|
107
|
+
rubygems_version: 4.0.10
|
|
87
108
|
specification_version: 4
|
|
88
109
|
summary: A (still incomplete) PEG Library
|
|
89
110
|
test_files: []
|
data/lib/l43/require_helper.rb
DELETED
data/lib/l43_peg/cache.rb
DELETED
|
@@ -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
|
data/lib/l43_peg/helper.rb
DELETED
|
@@ -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
|