rupkl 0.2.0 → 0.3.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.
@@ -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
- (str(:-) | str(:!)).as(:unary_operator) >>
89
- ws? >> non_null_operation.as(:operand)
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(:operator), operand: simple(:operand)) do
221
- Node::UnaryOperation.new(nil, operator.to_sym, operand, node_position(operator))
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(
@@ -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
@@ -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
- members.as(:members).maybe,
12
+ object_items.as(:items).maybe,
14
13
  str('{').as(:body_begin), '}'
15
14
  ).as(:object_body)
16
15
  end
17
16
 
18
- rule(:object_member) do
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(:b) }) do
64
- Node::ObjectBody.new(nil, nil, node_position(b))
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(object_body: { body_begin: simple(:b), members: subtree(:m) }) do
68
- Node::ObjectBody.new(nil, Array(m), node_position(b))
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(
@@ -4,12 +4,8 @@ module RuPkl
4
4
  class PklObject
5
5
  include Enumerable
6
6
 
7
- SELF = Object.new.freeze
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RuPkl
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
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 'facets/module/basename'
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/object'
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.2.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-07-18 00:00:00.000000000 Z
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: facets
28
+ name: parslet
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.1.0
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: 3.1.0
40
+ version: 2.0.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: parslet
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.0.0
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.0.0
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.5
135
+ rubygems_version: 3.5.16
128
136
  signing_key:
129
137
  specification_version: 4
130
138
  summary: Pkl parser for Ruby