rupkl 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rupkl/node/amend_expression.rb +2 -2
- data/lib/rupkl/node/any.rb +15 -4
- data/lib/rupkl/node/base.rb +32 -2
- data/lib/rupkl/node/boolean.rb +26 -9
- data/lib/rupkl/node/collection.rb +176 -0
- data/lib/rupkl/node/data_size.rb +254 -0
- data/lib/rupkl/node/duration.rb +266 -0
- data/lib/rupkl/node/dynamic.rb +19 -15
- data/lib/rupkl/node/identifier.rb +5 -1
- data/lib/rupkl/node/if_expression.rb +45 -0
- data/lib/rupkl/node/intseq.rb +84 -0
- data/lib/rupkl/node/listing.rb +11 -4
- data/lib/rupkl/node/map.rb +120 -0
- data/lib/rupkl/node/mapping.rb +13 -6
- data/lib/rupkl/node/member_finder.rb +4 -10
- data/lib/rupkl/node/member_reference.rb +5 -3
- data/lib/rupkl/node/method_call.rb +2 -3
- data/lib/rupkl/node/method_definition.rb +74 -18
- data/lib/rupkl/node/node_common.rb +1 -1
- data/lib/rupkl/node/null.rb +1 -4
- data/lib/rupkl/node/number.rb +133 -45
- data/lib/rupkl/node/object.rb +322 -66
- data/lib/rupkl/node/operation.rb +123 -100
- data/lib/rupkl/node/pair.rb +58 -0
- data/lib/rupkl/node/pkl_module.rb +4 -4
- data/lib/rupkl/node/regex.rb +196 -0
- data/lib/rupkl/node/string.rb +155 -133
- data/lib/rupkl/node/struct_common.rb +70 -35
- data/lib/rupkl/node/value_common.rb +1 -5
- data/lib/rupkl/parser/expression.rb +43 -6
- data/lib/rupkl/parser/misc.rb +20 -0
- data/lib/rupkl/parser/object.rb +96 -13
- data/lib/rupkl/parser/pkl_class.rb +12 -5
- data/lib/rupkl/pkl_object.rb +2 -18
- data/lib/rupkl/version.rb +1 -1
- data/lib/rupkl.rb +10 -2
- metadata +17 -9
@@ -28,17 +28,13 @@ module RuPkl
|
|
28
28
|
to_string(context)
|
29
29
|
end
|
30
30
|
|
31
|
-
def copy(parent = nil)
|
31
|
+
def copy(parent = nil, position = @position)
|
32
32
|
self.class.new(parent, @value, position)
|
33
33
|
end
|
34
34
|
|
35
35
|
def ==(other)
|
36
36
|
other.instance_of?(self.class) && value == other.value
|
37
37
|
end
|
38
|
-
|
39
|
-
def coerce(_operator, r_operand)
|
40
|
-
[value, r_operand.value]
|
41
|
-
end
|
42
38
|
end
|
43
39
|
end
|
44
40
|
end
|
@@ -41,11 +41,21 @@ module RuPkl
|
|
41
41
|
).as(:amend_expression)
|
42
42
|
end
|
43
43
|
|
44
|
+
rule(:if_expression) do
|
45
|
+
(
|
46
|
+
kw_if.as(:kw_if) >> ws? >>
|
47
|
+
bracketed(expression.as(:condition), '(', ')') >> ws? >>
|
48
|
+
expression.as(:if_expression) >> ws >>
|
49
|
+
kw_else.ignore >> ws >>
|
50
|
+
expression.as(:else_expression)
|
51
|
+
).as(:if_expression)
|
52
|
+
end
|
53
|
+
|
44
54
|
rule(:primary) do
|
45
55
|
[
|
46
56
|
float_literal, int_literal, boolean_literal, string_literal,
|
47
57
|
this_expression, null_expression, new_expression, amend_expression,
|
48
|
-
unqualified_member_ref, parenthesized_expression
|
58
|
+
if_expression, unqualified_member_ref, parenthesized_expression
|
49
59
|
].inject(:|)
|
50
60
|
end
|
51
61
|
|
@@ -83,11 +93,15 @@ module RuPkl
|
|
83
93
|
) | qualified_member_ref_or_subscript_operation
|
84
94
|
end
|
85
95
|
|
96
|
+
rule(:unary_operator) do
|
97
|
+
(str('-') | str('!')).as(:unary_operator)
|
98
|
+
end
|
99
|
+
|
86
100
|
rule(:unary_operation) do
|
87
101
|
(
|
88
|
-
(
|
89
|
-
|
90
|
-
) | non_null_operation
|
102
|
+
(unary_operator >> ws?).repeat(1).as(:operators) >>
|
103
|
+
non_null_operation.as(:operand)
|
104
|
+
).as(:unary_operation) | non_null_operation
|
91
105
|
end
|
92
106
|
|
93
107
|
rule(:binary_operation) do
|
@@ -213,12 +227,35 @@ module RuPkl
|
|
213
227
|
Node::AmendExpression.new(nil, t, Array(b), t.position)
|
214
228
|
end
|
215
229
|
|
230
|
+
rule(
|
231
|
+
if_expression:
|
232
|
+
{
|
233
|
+
kw_if: simple(:kw), condition: simple(:condition),
|
234
|
+
if_expression: simple(:if_expression),
|
235
|
+
else_expression: simple(:else_expression)
|
236
|
+
}
|
237
|
+
) do
|
238
|
+
Node::IfExpression.new(
|
239
|
+
nil, condition, if_expression, else_expression, node_position(kw)
|
240
|
+
)
|
241
|
+
end
|
242
|
+
|
216
243
|
rule(operand: simple(:operand), non_null_operator: simple(:operator)) do
|
217
244
|
Node::NonNullOperation.new(nil, operator.to_sym, operand, operand.position)
|
218
245
|
end
|
219
246
|
|
220
|
-
rule(unary_operator: simple(:
|
221
|
-
|
247
|
+
rule(unary_operator: simple(:op)) do
|
248
|
+
op
|
249
|
+
end
|
250
|
+
|
251
|
+
rule(
|
252
|
+
unary_operation: {
|
253
|
+
operators: sequence(:operators), operand: simple(:operand)
|
254
|
+
}
|
255
|
+
) do
|
256
|
+
operators.reverse.inject(operand) do |result, operator|
|
257
|
+
Node::UnaryOperation.new(nil, operator.to_sym, result, node_position(operator))
|
258
|
+
end
|
222
259
|
end
|
223
260
|
|
224
261
|
rule(
|
data/lib/rupkl/parser/misc.rb
CHANGED
@@ -50,5 +50,25 @@ module RuPkl
|
|
50
50
|
atom >> (ws? >> str(delimiter).ignore >> ws? >> atom).repeat
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
define_parser do
|
55
|
+
rule(:modifier) do
|
56
|
+
kw_local.as(:modifier)
|
57
|
+
end
|
58
|
+
|
59
|
+
rule(:modifiers) do
|
60
|
+
(modifier >> ws).repeat(1).as(:modifiers)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
define_transform do
|
65
|
+
rule(modifier: simple(:modifier)) do
|
66
|
+
modifier.to_sym
|
67
|
+
end
|
68
|
+
|
69
|
+
rule(modifiers: sequence(:modifiers)) do
|
70
|
+
modifiers.to_h { |m| [m.to_sym, true] }
|
71
|
+
end
|
72
|
+
end
|
53
73
|
end
|
54
74
|
end
|
data/lib/rupkl/parser/object.rb
CHANGED
@@ -8,15 +8,19 @@ module RuPkl
|
|
8
8
|
end
|
9
9
|
|
10
10
|
rule(:object_body) do
|
11
|
-
members = object_member >> (ws >> object_member).repeat
|
12
11
|
bracketed(
|
13
|
-
|
12
|
+
object_items.as(:items).maybe,
|
14
13
|
str('{').as(:body_begin), '}'
|
15
14
|
).as(:object_body)
|
16
15
|
end
|
17
16
|
|
18
|
-
rule(:
|
17
|
+
rule(:object_items) do
|
18
|
+
object_item >> (ws >> object_item).repeat
|
19
|
+
end
|
20
|
+
|
21
|
+
rule(:object_item) do
|
19
22
|
[
|
23
|
+
when_generator, for_generator,
|
20
24
|
object_method, object_element,
|
21
25
|
object_property, object_entry
|
22
26
|
].inject(:|)
|
@@ -24,10 +28,8 @@ module RuPkl
|
|
24
28
|
|
25
29
|
rule(:object_property) do
|
26
30
|
(
|
27
|
-
id.as(:name) >> ws? >>
|
28
|
-
(
|
29
|
-
(str('=').ignore >> ws? >> expression) | object
|
30
|
-
).as(:value)
|
31
|
+
modifiers.as(:modifiers).maybe >> id.as(:name) >> ws? >>
|
32
|
+
((str('=').ignore >> ws? >> expression) | object).as(:value)
|
31
33
|
).as(:object_property)
|
32
34
|
end
|
33
35
|
|
@@ -42,7 +44,7 @@ module RuPkl
|
|
42
44
|
|
43
45
|
rule(:object_element) do
|
44
46
|
(
|
45
|
-
expression >> (ws? >> match('[={]')).absent?
|
47
|
+
modifiers.absent? >> expression >> (ws? >> match('[={]')).absent?
|
46
48
|
).as(:object_element)
|
47
49
|
end
|
48
50
|
|
@@ -52,6 +54,25 @@ module RuPkl
|
|
52
54
|
str('=').ignore >> ws? >> expression.as(:body)
|
53
55
|
).as(:object_method)
|
54
56
|
end
|
57
|
+
|
58
|
+
rule(:when_generator) do
|
59
|
+
(
|
60
|
+
kw_when.as(:kw_when) >> ws? >>
|
61
|
+
bracketed(expression.as(:condition), '(', ')') >> ws? >>
|
62
|
+
object_body.as(:when_body) >>
|
63
|
+
(ws? >> kw_else.ignore >> ws? >> object_body.as(:else_body)).maybe
|
64
|
+
).as(:when_generator)
|
65
|
+
end
|
66
|
+
|
67
|
+
rule(:for_generator) do
|
68
|
+
(
|
69
|
+
header =
|
70
|
+
(id.as(:key_name) >> ws? >> str(',') >> ws?).maybe >>
|
71
|
+
id.as(:value_name) >> ws >> kw_in >> ws >> expression.as(:iterable)
|
72
|
+
kw_for.as(:kw_for) >> ws? >>
|
73
|
+
bracketed(header, '(', ')') >> ws? >> object_body.as(:body)
|
74
|
+
).as(:for_generator)
|
75
|
+
end
|
55
76
|
end
|
56
77
|
|
57
78
|
define_transform do
|
@@ -60,16 +81,29 @@ module RuPkl
|
|
60
81
|
Node::UnresolvedObject.new(nil, nil, bodies, bodies.first.position)
|
61
82
|
end
|
62
83
|
|
63
|
-
rule(object_body: { body_begin: simple(:
|
64
|
-
Node::ObjectBody.new(nil, nil, node_position(
|
84
|
+
rule(object_body: { body_begin: simple(:body_begin) }) do
|
85
|
+
Node::ObjectBody.new(nil, nil, node_position(body_begin))
|
65
86
|
end
|
66
87
|
|
67
|
-
rule(
|
68
|
-
|
88
|
+
rule(
|
89
|
+
object_body: {
|
90
|
+
body_begin: simple(:body_begin), items: subtree(:items)
|
91
|
+
}
|
92
|
+
) do
|
93
|
+
Node::ObjectBody.new(nil, Array(items), node_position(body_begin))
|
69
94
|
end
|
70
95
|
|
71
96
|
rule(object_property: { name: simple(:n), value: simple(:v) }) do
|
72
|
-
Node::ObjectProperty.new(nil, n, v, n.position)
|
97
|
+
Node::ObjectProperty.new(nil, n, v, nil, n.position)
|
98
|
+
end
|
99
|
+
|
100
|
+
rule(
|
101
|
+
object_property:
|
102
|
+
{
|
103
|
+
modifiers: subtree(:m), name: simple(:n), value: simple(:v)
|
104
|
+
}
|
105
|
+
) do
|
106
|
+
Node::ObjectProperty.new(nil, n, v, m, n.position)
|
73
107
|
end
|
74
108
|
|
75
109
|
rule(object_entry: { key: simple(:k), value: simple(:v) }) do
|
@@ -99,6 +133,55 @@ module RuPkl
|
|
99
133
|
) do
|
100
134
|
Node::MethodDefinition.new(nil, name, params, type, body, node_position(kw))
|
101
135
|
end
|
136
|
+
|
137
|
+
rule(
|
138
|
+
when_generator:
|
139
|
+
{
|
140
|
+
kw_when: simple(:kw), condition: simple(:condition),
|
141
|
+
when_body: simple(:when_body)
|
142
|
+
}
|
143
|
+
) do
|
144
|
+
Node::WhenGenerator.new(
|
145
|
+
nil, condition, when_body, nil, nil, node_position(kw)
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
rule(
|
150
|
+
when_generator:
|
151
|
+
{
|
152
|
+
kw_when: simple(:kw), condition: simple(:condition),
|
153
|
+
when_body: simple(:when_body), else_body: simple(:else_body)
|
154
|
+
}
|
155
|
+
) do
|
156
|
+
Node::WhenGenerator.new(
|
157
|
+
nil, condition, when_body, else_body, nil, node_position(kw)
|
158
|
+
)
|
159
|
+
end
|
160
|
+
|
161
|
+
rule(
|
162
|
+
for_generator:
|
163
|
+
{
|
164
|
+
kw_for: simple(:kw), value_name: simple(:value_name),
|
165
|
+
iterable: simple(:iterable), body: simple(:body)
|
166
|
+
}
|
167
|
+
) do
|
168
|
+
Node::ForGenerator.new(
|
169
|
+
nil, nil, value_name, iterable, body, nil, node_position(kw)
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
173
|
+
rule(
|
174
|
+
for_generator:
|
175
|
+
{
|
176
|
+
kw_for: simple(:kw),
|
177
|
+
key_name: simple(:key_name), value_name: simple(:value_name),
|
178
|
+
iterable: simple(:iterable), body: simple(:body)
|
179
|
+
}
|
180
|
+
) do
|
181
|
+
Node::ForGenerator.new(
|
182
|
+
nil, key_name, value_name, iterable, body, nil, node_position(kw)
|
183
|
+
)
|
184
|
+
end
|
102
185
|
end
|
103
186
|
end
|
104
187
|
end
|
@@ -5,10 +5,8 @@ module RuPkl
|
|
5
5
|
define_parser do
|
6
6
|
rule(:pkl_class_property) do
|
7
7
|
(
|
8
|
-
id.as(:name) >> ws? >>
|
9
|
-
|
10
|
-
(str('=').ignore >> ws? >> expression) | object
|
11
|
-
).as(:value)
|
8
|
+
modifiers.as(:modifiers).maybe >> id.as(:name) >> ws? >>
|
9
|
+
((str('=').ignore >> ws? >> expression) | object).as(:value)
|
12
10
|
).as(:class_property)
|
13
11
|
end
|
14
12
|
|
@@ -22,7 +20,16 @@ module RuPkl
|
|
22
20
|
|
23
21
|
define_transform do
|
24
22
|
rule(class_property: { name: simple(:n), value: simple(:v) }) do
|
25
|
-
Node::ObjectProperty.new(nil, n, v, n.position)
|
23
|
+
Node::ObjectProperty.new(nil, n, v, nil, n.position)
|
24
|
+
end
|
25
|
+
|
26
|
+
rule(
|
27
|
+
class_property:
|
28
|
+
{
|
29
|
+
modifiers: subtree(:m), name: simple(:n), value: simple(:v)
|
30
|
+
}
|
31
|
+
) do
|
32
|
+
Node::ObjectProperty.new(nil, n, v, m, n.position)
|
26
33
|
end
|
27
34
|
|
28
35
|
rule(
|
data/lib/rupkl/pkl_object.rb
CHANGED
@@ -4,12 +4,8 @@ module RuPkl
|
|
4
4
|
class PklObject
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(properties, entries, elements)
|
10
|
-
@properties = replace_self_hash(properties)
|
11
|
-
@entries = replace_self_hash(entries)
|
12
|
-
@elements = replace_self_array(elements)
|
7
|
+
def initialize
|
8
|
+
@properties, @entries, @elements = yield(self)
|
13
9
|
define_property_accessors
|
14
10
|
end
|
15
11
|
|
@@ -96,18 +92,6 @@ module RuPkl
|
|
96
92
|
|
97
93
|
private
|
98
94
|
|
99
|
-
def replace_self_hash(hash)
|
100
|
-
hash&.each do |(key, value)|
|
101
|
-
hash[key] = self if value.equal?(SELF)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def replace_self_array(array)
|
106
|
-
array&.each_with_index do |value, i|
|
107
|
-
array[i] = self if value.equal?(SELF)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
95
|
def define_property_accessors
|
112
96
|
@properties&.each_key do |name|
|
113
97
|
singleton_class.class_eval(<<~M, __FILE__, __LINE__ + 1)
|
data/lib/rupkl/version.rb
CHANGED
data/lib/rupkl.rb
CHANGED
@@ -7,7 +7,7 @@ require 'digest/sha2'
|
|
7
7
|
require 'singleton'
|
8
8
|
require 'stringio'
|
9
9
|
require 'parslet'
|
10
|
-
require '
|
10
|
+
require 'regexp_parser'
|
11
11
|
|
12
12
|
require_relative 'rupkl/version'
|
13
13
|
require_relative 'rupkl/exception'
|
@@ -25,6 +25,7 @@ require_relative 'rupkl/node/member_reference'
|
|
25
25
|
require_relative 'rupkl/node/method_definition'
|
26
26
|
require_relative 'rupkl/node/method_call'
|
27
27
|
require_relative 'rupkl/node/amend_expression'
|
28
|
+
require_relative 'rupkl/node/if_expression'
|
28
29
|
require_relative 'rupkl/node/operation'
|
29
30
|
require_relative 'rupkl/node/this'
|
30
31
|
require_relative 'rupkl/node/any'
|
@@ -32,10 +33,17 @@ require_relative 'rupkl/node/null'
|
|
32
33
|
require_relative 'rupkl/node/boolean'
|
33
34
|
require_relative 'rupkl/node/number'
|
34
35
|
require_relative 'rupkl/node/string'
|
35
|
-
require_relative 'rupkl/node/
|
36
|
+
require_relative 'rupkl/node/regex'
|
37
|
+
require_relative 'rupkl/node/data_size'
|
38
|
+
require_relative 'rupkl/node/duration'
|
39
|
+
require_relative 'rupkl/node/pair'
|
40
|
+
require_relative 'rupkl/node/collection'
|
41
|
+
require_relative 'rupkl/node/map'
|
42
|
+
require_relative 'rupkl/node/intseq'
|
36
43
|
require_relative 'rupkl/node/dynamic'
|
37
44
|
require_relative 'rupkl/node/mapping'
|
38
45
|
require_relative 'rupkl/node/listing'
|
46
|
+
require_relative 'rupkl/node/object'
|
39
47
|
require_relative 'rupkl/node/pkl_module'
|
40
48
|
require_relative 'rupkl/node/base'
|
41
49
|
require_relative 'rupkl/parser'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rupkl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taichi Ishitani
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base64
|
@@ -25,33 +25,33 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: parslet
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 2.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: regexp_parser
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2.
|
47
|
+
version: 2.9.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.
|
54
|
+
version: 2.9.2
|
55
55
|
description: Pkl parser for Ruby
|
56
56
|
email:
|
57
57
|
- taichi730@gmail.com
|
@@ -68,11 +68,17 @@ files:
|
|
68
68
|
- lib/rupkl/node/any.rb
|
69
69
|
- lib/rupkl/node/base.rb
|
70
70
|
- lib/rupkl/node/boolean.rb
|
71
|
+
- lib/rupkl/node/collection.rb
|
71
72
|
- lib/rupkl/node/context.rb
|
73
|
+
- lib/rupkl/node/data_size.rb
|
72
74
|
- lib/rupkl/node/declared_type.rb
|
75
|
+
- lib/rupkl/node/duration.rb
|
73
76
|
- lib/rupkl/node/dynamic.rb
|
74
77
|
- lib/rupkl/node/identifier.rb
|
78
|
+
- lib/rupkl/node/if_expression.rb
|
79
|
+
- lib/rupkl/node/intseq.rb
|
75
80
|
- lib/rupkl/node/listing.rb
|
81
|
+
- lib/rupkl/node/map.rb
|
76
82
|
- lib/rupkl/node/mapping.rb
|
77
83
|
- lib/rupkl/node/member_finder.rb
|
78
84
|
- lib/rupkl/node/member_reference.rb
|
@@ -83,8 +89,10 @@ files:
|
|
83
89
|
- lib/rupkl/node/number.rb
|
84
90
|
- lib/rupkl/node/object.rb
|
85
91
|
- lib/rupkl/node/operation.rb
|
92
|
+
- lib/rupkl/node/pair.rb
|
86
93
|
- lib/rupkl/node/pkl_module.rb
|
87
94
|
- lib/rupkl/node/reference_resolver.rb
|
95
|
+
- lib/rupkl/node/regex.rb
|
88
96
|
- lib/rupkl/node/string.rb
|
89
97
|
- lib/rupkl/node/struct_common.rb
|
90
98
|
- lib/rupkl/node/this.rb
|
@@ -124,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
132
|
- !ruby/object:Gem::Version
|
125
133
|
version: '0'
|
126
134
|
requirements: []
|
127
|
-
rubygems_version: 3.5.
|
135
|
+
rubygems_version: 3.5.16
|
128
136
|
signing_key:
|
129
137
|
specification_version: 4
|
130
138
|
summary: Pkl parser for Ruby
|