language-ruby 0.5.6 → 0.6.0
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/Gemfile +1 -4
- data/language-ruby.gemspec +3 -3
- data/lib/language/atom/any.rb +8 -0
- data/lib/language/atom/repeat.rb +15 -0
- data/lib/language/atom.rb +25 -42
- data/lib/language/output.rb +13 -11
- data/lib/language/parser/absent/present.rb +2 -0
- data/lib/language/parser/absent.rb +2 -0
- data/lib/language/parser/end_of_input.rb +2 -0
- data/lib/language/parser/interuption.rb +2 -0
- data/lib/language/parser/not_end_of_input.rb +2 -0
- data/lib/language/parser/str/not_found.rb +2 -0
- data/lib/language/parser/str.rb +2 -0
- data/lib/language/parser.rb +10 -10
- data/lib/language/version.rb +3 -0
- data/lib/language-ruby.rb +0 -5
- data/lib/language.rb +9 -7
- data/spec/spec_helper.rb +1 -6
- metadata +7 -221
- data/.cherry.js +0 -21
- data/.editorconfig +0 -9
- data/.github/workflows/rspec.yml +0 -14
- data/.gitignore +0 -2
- data/.prettierrc +0 -3
- data/.rspec +0 -1
- data/.tool-versions +0 -1
- data/CHANGELOG.md +0 -55
- data/Gemfile.lock +0 -49
- data/LICENSE +0 -7
- data/README.md +0 -103
- data/TODO +0 -17
- data/bin/code +0 -76
- data/bin/format +0 -3
- data/bin/publish +0 -19
- data/bin/template +0 -85
- data/bin/test +0 -17
- data/code-ruby.gemspec +0 -17
- data/docs/class.code +0 -9
- data/docs/euler/1.template +0 -10
- data/docs/euler/2.template +0 -16
- data/docs/euler/3.template +0 -16
- data/docs/euler/4.template +0 -10
- data/docs/euler/5.template +0 -13
- data/docs/fibonnaci.template +0 -14
- data/docs/meetup.code +0 -12
- data/docs/precedence.template +0 -36
- data/docs/rain.code +0 -22
- data/docs/slack.code +0 -17
- data/docs/stripe.code +0 -7
- data/docs/twitter.code +0 -9
- data/lib/code/error.rb +0 -18
- data/lib/code/node/base_10.rb +0 -29
- data/lib/code/node/base_16.rb +0 -13
- data/lib/code/node/base_2.rb +0 -13
- data/lib/code/node/base_8.rb +0 -13
- data/lib/code/node/boolean.rb +0 -22
- data/lib/code/node/call.rb +0 -47
- data/lib/code/node/call_argument.rb +0 -21
- data/lib/code/node/chained_call.rb +0 -23
- data/lib/code/node/code.rb +0 -20
- data/lib/code/node/decimal.rb +0 -26
- data/lib/code/node/dictionnary.rb +0 -33
- data/lib/code/node/equal.rb +0 -34
- data/lib/code/node/function.rb +0 -20
- data/lib/code/node/function_parameter.rb +0 -31
- data/lib/code/node/if.rb +0 -59
- data/lib/code/node/if_modifier.rb +0 -47
- data/lib/code/node/list.rb +0 -16
- data/lib/code/node/negation.rb +0 -15
- data/lib/code/node/not.rb +0 -15
- data/lib/code/node/nothing.rb +0 -12
- data/lib/code/node/number.rb +0 -25
- data/lib/code/node/operation.rb +0 -38
- data/lib/code/node/power.rb +0 -20
- data/lib/code/node/rescue.rb +0 -17
- data/lib/code/node/splat.rb +0 -15
- data/lib/code/node/statement.rb +0 -59
- data/lib/code/node/string.rb +0 -53
- data/lib/code/node/ternary.rb +0 -24
- data/lib/code/node/unary_minus.rb +0 -15
- data/lib/code/node/while.rb +0 -35
- data/lib/code/node.rb +0 -13
- data/lib/code/object/argument.rb +0 -32
- data/lib/code/object/boolean.rb +0 -27
- data/lib/code/object/decimal.rb +0 -162
- data/lib/code/object/dictionnary.rb +0 -96
- data/lib/code/object/function.rb +0 -64
- data/lib/code/object/global.rb +0 -42
- data/lib/code/object/integer.rb +0 -221
- data/lib/code/object/list.rb +0 -207
- data/lib/code/object/nothing.rb +0 -23
- data/lib/code/object/number.rb +0 -6
- data/lib/code/object/range.rb +0 -146
- data/lib/code/object/ruby_function.rb +0 -31
- data/lib/code/object/string.rb +0 -102
- data/lib/code/object.rb +0 -197
- data/lib/code/parser/addition.rb +0 -21
- data/lib/code/parser/and_operator.rb +0 -17
- data/lib/code/parser/bitwise_and.rb +0 -17
- data/lib/code/parser/bitwise_or.rb +0 -21
- data/lib/code/parser/boolean.rb +0 -17
- data/lib/code/parser/call.rb +0 -122
- data/lib/code/parser/chained_call.rb +0 -47
- data/lib/code/parser/class.rb +0 -45
- data/lib/code/parser/code.rb +0 -25
- data/lib/code/parser/dictionnary.rb +0 -67
- data/lib/code/parser/equal.rb +0 -94
- data/lib/code/parser/equality.rb +0 -35
- data/lib/code/parser/equality_lower.rb +0 -9
- data/lib/code/parser/function.rb +0 -85
- data/lib/code/parser/greater.rb +0 -25
- data/lib/code/parser/group.rb +0 -22
- data/lib/code/parser/if.rb +0 -63
- data/lib/code/parser/if_modifier.rb +0 -55
- data/lib/code/parser/list.rb +0 -42
- data/lib/code/parser/multiplication.rb +0 -25
- data/lib/code/parser/name.rb +0 -107
- data/lib/code/parser/negation.rb +0 -30
- data/lib/code/parser/not_keyword.rb +0 -23
- data/lib/code/parser/nothing.rb +0 -22
- data/lib/code/parser/number.rb +0 -154
- data/lib/code/parser/operation.rb +0 -35
- data/lib/code/parser/or_keyword.rb +0 -21
- data/lib/code/parser/or_operator.rb +0 -17
- data/lib/code/parser/power.rb +0 -43
- data/lib/code/parser/range.rb +0 -17
- data/lib/code/parser/rescue.rb +0 -39
- data/lib/code/parser/shift.rb +0 -21
- data/lib/code/parser/splat.rb +0 -31
- data/lib/code/parser/statement.rb +0 -9
- data/lib/code/parser/string.rb +0 -78
- data/lib/code/parser/ternary.rb +0 -46
- data/lib/code/parser/unary_minus.rb +0 -31
- data/lib/code/parser/while.rb +0 -36
- data/lib/code/parser/whitespace.rb +0 -49
- data/lib/code/parser.rb +0 -19
- data/lib/code/ruby.rb +0 -174
- data/lib/code-ruby.rb +0 -10
- data/lib/code.rb +0 -47
- data/lib/template/node/code_part.rb +0 -13
- data/lib/template/node/part.rb +0 -19
- data/lib/template/node/template.rb +0 -15
- data/lib/template/node/text_part.rb +0 -13
- data/lib/template/node.rb +0 -4
- data/lib/template/parser/template.rb +0 -39
- data/lib/template/parser.rb +0 -19
- data/lib/template/version.rb +0 -3
- data/lib/template-ruby.rb +0 -10
- data/lib/template.rb +0 -50
- data/spec/code/addition_spec.rb +0 -13
- data/spec/code/and_operator_spec.rb +0 -13
- data/spec/code/bitwise_and_spec.rb +0 -13
- data/spec/code/bitwise_or_spec.rb +0 -13
- data/spec/code/boolean_spec.rb +0 -13
- data/spec/code/call_spec.rb +0 -21
- data/spec/code/chained_call_spec.rb +0 -16
- data/spec/code/code_spec.rb +0 -29
- data/spec/code/dictionnary_spec.rb +0 -17
- data/spec/code/equal_spec.rb +0 -26
- data/spec/code/equality_spec.rb +0 -13
- data/spec/code/function_spec.rb +0 -18
- data/spec/code/greater_spec.rb +0 -18
- data/spec/code/group_spec.rb +0 -12
- data/spec/code/if_modifier_spec.rb +0 -20
- data/spec/code/if_spec.rb +0 -25
- data/spec/code/list_spec.rb +0 -19
- data/spec/code/multiplication_spec.rb +0 -18
- data/spec/code/negation_spec.rb +0 -20
- data/spec/code/not_keyword_spec.rb +0 -13
- data/spec/code/nothing_spec.rb +0 -17
- data/spec/code/number_spec.rb +0 -22
- data/spec/code/or_keyword_spec.rb +0 -17
- data/spec/code/or_operator_spec.rb +0 -16
- data/spec/code/parser/boolean_spec.rb +0 -16
- data/spec/code/parser/call_spec.rb +0 -26
- data/spec/code/parser/chained_call.rb +0 -17
- data/spec/code/parser/dictionnary_spec.rb +0 -18
- data/spec/code/parser/function_spec.rb +0 -16
- data/spec/code/parser/group_spec.rb +0 -18
- data/spec/code/parser/list_spec.rb +0 -18
- data/spec/code/parser/number_spec.rb +0 -12
- data/spec/code/parser/string_spec.rb +0 -21
- data/spec/code/parser_spec.rb +0 -23
- data/spec/code/power_spec.rb +0 -13
- data/spec/code/range_spec.rb +0 -16
- data/spec/code/rescue_spec.rb +0 -13
- data/spec/code/shift_spec.rb +0 -13
- data/spec/code/splat_spec.rb +0 -13
- data/spec/code/string_spec.rb +0 -27
- data/spec/code/ternary_spec.rb +0 -18
- data/spec/code/unary_minus_spec.rb +0 -13
- data/spec/code/while_spec.rb +0 -18
- data/template-ruby.gemspec +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdf5e247df3ee0c287a560265c60107d161eb4b7cb71610f6f50c15c81c2e3aa
|
4
|
+
data.tar.gz: acfe4eea02eb399831fd378adb0bd69100efbdecaeead3c99a2faaec11e552cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 318d1dd9888a5aee6aec7fef5410b9092f169e6e12e1d4a0608c6a2e36b2ae4b3bfc6412052a8e331a9b1260bf4387ccfa6340e1ea74f7511da049ff222d4050
|
7
|
+
data.tar.gz: 5c0c443194c047a08c461f9b713fcf131ebd12ce479b81d344415202694106a7db00e19547c37319c6d69d4a0bc78a768b0a8aaf1d29e1b9a7ae1369d87c520e
|
data/Gemfile
CHANGED
data/language-ruby.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require_relative "lib/
|
1
|
+
require_relative "lib/language/version"
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "language-ruby"
|
5
|
-
s.version = ::
|
5
|
+
s.version = ::Language::Version
|
6
6
|
s.summary = "A Parsing Expression Grammar (PEG) for making parsers"
|
7
7
|
s.description = s.summary
|
8
8
|
s.authors = ["Dorian Marié"]
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.files = `git ls-files`.split($/)
|
11
11
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
12
12
|
s.require_paths = ["lib"]
|
13
|
-
s.homepage = "https://github.com/dorianmariefr/
|
13
|
+
s.homepage = "https://github.com/dorianmariefr/language-ruby"
|
14
14
|
s.license = "MIT"
|
15
15
|
|
16
16
|
s.add_dependency "zeitwerk", "~> 2"
|
data/lib/language/atom.rb
CHANGED
@@ -1,19 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Language
|
2
4
|
class Atom
|
3
|
-
class Rule < Atom
|
4
|
-
def initialize(name:)
|
5
|
-
@name = name
|
6
|
-
end
|
7
|
-
|
8
|
-
def parse(parser)
|
9
|
-
parser.find_rule!(@name).parse(parser)
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
"rule(#{@name.inspect})"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
5
|
class Any < Atom
|
18
6
|
def parse(parser)
|
19
7
|
parser.consume(1)
|
@@ -41,36 +29,34 @@ class Language
|
|
41
29
|
end
|
42
30
|
|
43
31
|
class Repeat < Atom
|
44
|
-
def initialize(parent: nil,
|
32
|
+
def initialize(parent: nil, minimum: 0, maximum: nil)
|
45
33
|
@parent = parent
|
46
|
-
@
|
47
|
-
@
|
34
|
+
@minimum = minimum
|
35
|
+
@maximum = maximum
|
48
36
|
end
|
49
37
|
|
50
38
|
def parse(parser)
|
51
39
|
return unless @parent
|
52
40
|
|
53
|
-
|
54
|
-
|
55
|
-
|
41
|
+
@minimum.times { match(parser) }
|
42
|
+
if @maximum.nil?
|
56
43
|
begin
|
57
44
|
loop { match(parser) }
|
58
45
|
rescue Parser::Interuption
|
59
46
|
end
|
60
47
|
else
|
61
|
-
@min.times { match(parser) }
|
62
|
-
|
63
48
|
begin
|
64
|
-
(@
|
49
|
+
(@maximum - @minimum).times { match(parser) }
|
65
50
|
rescue Parser::Interuption
|
66
51
|
end
|
67
52
|
end
|
68
53
|
end
|
69
54
|
|
70
55
|
def to_s
|
71
|
-
|
72
|
-
|
73
|
-
parenthesis =
|
56
|
+
minimum = @minimum.zero? ? "" : @minimum.to_s
|
57
|
+
maximum = @maximum.nil? ? "" : ", #{@maximum}"
|
58
|
+
parenthesis =
|
59
|
+
minimum.empty? && maximum.empty? ? "" : "(#{minimum}#{maximum})"
|
74
60
|
|
75
61
|
@parent ? "(#{@parent}).repeat#{parenthesis}" : "repeat#{parenthesis}"
|
76
62
|
end
|
@@ -100,11 +86,11 @@ class Language
|
|
100
86
|
end
|
101
87
|
|
102
88
|
def parse(parser)
|
103
|
-
|
104
|
-
parser.consume(@string.size)
|
105
|
-
else
|
89
|
+
unless parser.next?(@string)
|
106
90
|
raise Parser::Str::NotFound.new(parser, @string)
|
107
91
|
end
|
92
|
+
|
93
|
+
parser.consume(@string.size)
|
108
94
|
end
|
109
95
|
|
110
96
|
def to_s
|
@@ -125,7 +111,7 @@ class Language
|
|
125
111
|
cursor: parser.cursor,
|
126
112
|
buffer: parser.buffer
|
127
113
|
)
|
128
|
-
@parent
|
114
|
+
@parent&.parse(clone)
|
129
115
|
rescue Parser::Interuption
|
130
116
|
else
|
131
117
|
raise Parser::Interuption.new(parser, self)
|
@@ -149,7 +135,7 @@ class Language
|
|
149
135
|
cursor: parser.cursor,
|
150
136
|
buffer: parser.buffer
|
151
137
|
)
|
152
|
-
@parent
|
138
|
+
@parent&.parse(clone)
|
153
139
|
parser.cursor = clone.cursor
|
154
140
|
end
|
155
141
|
|
@@ -175,6 +161,7 @@ class Language
|
|
175
161
|
@parent.parse(clone)
|
176
162
|
rescue Parser::Interuption
|
177
163
|
else
|
164
|
+
parser.buffer = clone.buffer
|
178
165
|
parser.cursor = clone.cursor
|
179
166
|
parser.output = clone.output
|
180
167
|
end
|
@@ -284,7 +271,7 @@ class Language
|
|
284
271
|
end
|
285
272
|
|
286
273
|
def str(string)
|
287
|
-
Str.new(string:
|
274
|
+
Str.new(string:)
|
288
275
|
end
|
289
276
|
|
290
277
|
def absent
|
@@ -299,12 +286,12 @@ class Language
|
|
299
286
|
Maybe.new(parent: self)
|
300
287
|
end
|
301
288
|
|
302
|
-
def repeat(
|
303
|
-
Repeat.new(parent: self,
|
289
|
+
def repeat(minimum = 0, maximum = nil)
|
290
|
+
Repeat.new(parent: self, minimum:, maximum:)
|
304
291
|
end
|
305
292
|
|
306
293
|
def aka(name)
|
307
|
-
Aka.new(parent: self, name:
|
294
|
+
Aka.new(parent: self, name:)
|
308
295
|
end
|
309
296
|
|
310
297
|
def |(other)
|
@@ -320,15 +307,11 @@ class Language
|
|
320
307
|
end
|
321
308
|
|
322
309
|
def then(&block)
|
323
|
-
Then.new(parent: self, block:
|
324
|
-
end
|
325
|
-
|
326
|
-
def rule(name)
|
327
|
-
Rule.new(name: name)
|
310
|
+
Then.new(parent: self, block:)
|
328
311
|
end
|
329
312
|
|
330
|
-
def parse(
|
331
|
-
raise NotImplementedError
|
313
|
+
def parse(_parser)
|
314
|
+
raise NotImplementedError, "#{self.class}#parse"
|
332
315
|
end
|
333
316
|
|
334
317
|
def to_s
|
data/lib/language/output.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Language
|
2
4
|
class Output
|
3
5
|
attr_reader :raw
|
@@ -10,7 +12,7 @@ class Language
|
|
10
12
|
if raw.is_a?(Array)
|
11
13
|
new(raw.map { |element| from_raw(element) })
|
12
14
|
elsif raw.is_a?(Hash)
|
13
|
-
new(raw.
|
15
|
+
new(raw.transform_values { |value| from_raw(value) })
|
14
16
|
else
|
15
17
|
new(raw)
|
16
18
|
end
|
@@ -20,7 +22,7 @@ class Language
|
|
20
22
|
if raw.is_a?(Array)
|
21
23
|
raw.map(&:to_raw)
|
22
24
|
elsif raw.is_a?(Hash)
|
23
|
-
raw.
|
25
|
+
raw.transform_values(&:to_raw)
|
24
26
|
else
|
25
27
|
raw
|
26
28
|
end
|
@@ -35,7 +37,7 @@ class Language
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def ==(other)
|
38
|
-
other.is_a?(Output) ?
|
40
|
+
raw == (other.is_a?(Output) ? other.raw : other)
|
39
41
|
end
|
40
42
|
|
41
43
|
def to_s
|
@@ -66,7 +68,7 @@ class Language
|
|
66
68
|
when String
|
67
69
|
case other.raw
|
68
70
|
when String
|
69
|
-
@raw
|
71
|
+
@raw += other.raw
|
70
72
|
when Array
|
71
73
|
@raw = other.raw
|
72
74
|
when Hash
|
@@ -75,18 +77,18 @@ class Language
|
|
75
77
|
when Array
|
76
78
|
case other.raw
|
77
79
|
when String
|
78
|
-
|
80
|
+
nil
|
79
81
|
when Array
|
80
|
-
@raw
|
82
|
+
@raw += other.raw
|
81
83
|
when Hash
|
82
84
|
@raw << other
|
83
85
|
end
|
84
86
|
when Hash
|
85
87
|
case other.raw
|
86
88
|
when String
|
87
|
-
|
89
|
+
nil
|
88
90
|
when Array
|
89
|
-
|
91
|
+
nil
|
90
92
|
when Hash
|
91
93
|
@raw.merge!(other.raw)
|
92
94
|
end
|
@@ -107,7 +109,7 @@ class Language
|
|
107
109
|
when String
|
108
110
|
case other.raw
|
109
111
|
when String
|
110
|
-
@raw
|
112
|
+
@raw += other.raw
|
111
113
|
when Array
|
112
114
|
@raw = [other]
|
113
115
|
when Hash
|
@@ -118,9 +120,9 @@ class Language
|
|
118
120
|
when Hash
|
119
121
|
case other.raw
|
120
122
|
when String
|
121
|
-
|
123
|
+
nil
|
122
124
|
when Array
|
123
|
-
|
125
|
+
nil
|
124
126
|
when Hash
|
125
127
|
@raw.merge!(other.raw)
|
126
128
|
end
|
data/lib/language/parser/str.rb
CHANGED
data/lib/language/parser.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Language
|
2
4
|
class Parser
|
3
5
|
attr_accessor :input, :buffer, :output, :root, :cursor
|
@@ -13,20 +15,18 @@ class Language
|
|
13
15
|
def parse(check_end_of_input: true)
|
14
16
|
@root.parse(self)
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
else
|
19
|
-
raise NotEndOfInput.new(self)
|
18
|
+
unless @cursor == @input.size || !check_end_of_input
|
19
|
+
raise NotEndOfInput, self
|
20
20
|
end
|
21
|
+
|
22
|
+
@output.present? ? @output : Output.new(@buffer)
|
21
23
|
end
|
22
24
|
|
23
25
|
def consume(n)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
raise EndOfInput.new(self)
|
29
|
-
end
|
26
|
+
raise EndOfInput, self unless @cursor + n <= @input.size
|
27
|
+
|
28
|
+
@buffer += @input[@cursor, n]
|
29
|
+
@cursor += n
|
30
30
|
end
|
31
31
|
|
32
32
|
def aka(name)
|
data/lib/language-ruby.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
|
-
require "bigdecimal"
|
2
|
-
require "stringio"
|
3
|
-
require "timeout"
|
4
1
|
require "zeitwerk"
|
5
2
|
|
6
3
|
loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
|
7
|
-
loader.ignore("#{__dir__}/template-ruby.rb")
|
8
|
-
loader.ignore("#{__dir__}/code-ruby.rb")
|
9
4
|
loader.ignore("#{__dir__}/language-ruby.rb")
|
10
5
|
loader.setup
|
data/lib/language.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Language
|
2
4
|
def self.parse(input)
|
3
5
|
new.parse(input)
|
@@ -15,12 +17,12 @@ class Language
|
|
15
17
|
Atom::Maybe.new(parent: new)
|
16
18
|
end
|
17
19
|
|
18
|
-
def self.repeat(
|
19
|
-
Atom::Repeat.new(parent: new,
|
20
|
+
def self.repeat(minimum = 0, maximum = nil)
|
21
|
+
Atom::Repeat.new(parent: new, minimum:, maximum:)
|
20
22
|
end
|
21
23
|
|
22
24
|
def self.aka(name)
|
23
|
-
Atom::Aka.new(parent: new, name:
|
25
|
+
Atom::Aka.new(parent: new, name:)
|
24
26
|
end
|
25
27
|
|
26
28
|
def self.|(other)
|
@@ -36,7 +38,7 @@ class Language
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def self.then(&block)
|
39
|
-
Atom::Then.new(parent: new, block:
|
41
|
+
Atom::Then.new(parent: new, block:)
|
40
42
|
end
|
41
43
|
|
42
44
|
def parse(input_or_parser)
|
@@ -44,7 +46,7 @@ class Language
|
|
44
46
|
parser = input_or_parser
|
45
47
|
clone =
|
46
48
|
Parser.new(
|
47
|
-
root
|
49
|
+
root:,
|
48
50
|
input: parser.input,
|
49
51
|
cursor: parser.cursor,
|
50
52
|
buffer: parser.buffer,
|
@@ -58,12 +60,12 @@ class Language
|
|
58
60
|
parser.output = clone.output
|
59
61
|
else
|
60
62
|
input = input_or_parser
|
61
|
-
Parser.new(root
|
63
|
+
Parser.new(root:, input:).parse
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
65
67
|
def str(string)
|
66
|
-
Atom::Str.new(string:
|
68
|
+
Atom::Str.new(string:)
|
67
69
|
end
|
68
70
|
|
69
71
|
def any
|