rupkl 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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