rupkl 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/rupkl/node/amend_expression.rb +48 -0
- data/lib/rupkl/node/any.rb +99 -0
- data/lib/rupkl/node/base.rb +45 -0
- data/lib/rupkl/node/boolean.rb +12 -4
- data/lib/rupkl/node/context.rb +27 -0
- data/lib/rupkl/node/declared_type.rb +32 -0
- data/lib/rupkl/node/dynamic.rb +28 -59
- data/lib/rupkl/node/identifier.rb +16 -6
- data/lib/rupkl/node/listing.rb +61 -0
- data/lib/rupkl/node/mapping.rb +47 -0
- data/lib/rupkl/node/member_finder.rb +55 -0
- data/lib/rupkl/node/member_reference.rb +44 -21
- data/lib/rupkl/node/method_call.rb +64 -0
- data/lib/rupkl/node/method_definition.rb +143 -0
- data/lib/rupkl/node/node_common.rb +76 -0
- data/lib/rupkl/node/null.rb +27 -0
- data/lib/rupkl/node/number.rb +136 -6
- data/lib/rupkl/node/object.rb +369 -73
- data/lib/rupkl/node/operation.rb +97 -60
- data/lib/rupkl/node/pkl_module.rb +16 -28
- data/lib/rupkl/node/reference_resolver.rb +79 -0
- data/lib/rupkl/node/string.rb +388 -18
- data/lib/rupkl/node/struct_common.rb +119 -57
- data/lib/rupkl/node/this.rb +17 -0
- data/lib/rupkl/node/type_common.rb +34 -0
- data/lib/rupkl/node/value_common.rb +18 -9
- data/lib/rupkl/parser/expression.rb +158 -41
- data/lib/rupkl/parser/identifier.rb +2 -2
- data/lib/rupkl/parser/literal.rb +18 -12
- data/lib/rupkl/parser/method.rb +41 -0
- data/lib/rupkl/parser/misc.rb +4 -0
- data/lib/rupkl/parser/object.rb +57 -25
- data/lib/rupkl/parser/pkl_class.rb +28 -8
- data/lib/rupkl/parser/pkl_module.rb +5 -3
- data/lib/rupkl/parser/type.rb +28 -0
- data/lib/rupkl/parser.rb +8 -0
- data/lib/rupkl/pkl_object.rb +26 -6
- data/lib/rupkl/version.rb +1 -1
- data/lib/rupkl.rb +25 -4
- metadata +33 -3
- data/lib/rupkl/node/pkl_class.rb +0 -30
@@ -3,24 +3,33 @@
|
|
3
3
|
module RuPkl
|
4
4
|
module Node
|
5
5
|
module ValueCommon
|
6
|
-
|
6
|
+
include NodeCommon
|
7
|
+
|
8
|
+
def initialize(parent, value, position)
|
9
|
+
super(parent, position)
|
7
10
|
@value = value
|
8
|
-
@position = position
|
9
11
|
end
|
10
12
|
|
11
13
|
attr_reader :value
|
12
|
-
attr_reader :position
|
13
14
|
|
14
|
-
def
|
15
|
-
|
15
|
+
def evaluate(_context = nil)
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_ruby(context = nil)
|
20
|
+
evaluate(context).value
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_string(context = nil)
|
24
|
+
to_ruby(context).to_s
|
16
25
|
end
|
17
26
|
|
18
|
-
def
|
19
|
-
|
27
|
+
def to_pkl_string(context = nil)
|
28
|
+
to_string(context)
|
20
29
|
end
|
21
30
|
|
22
|
-
def
|
23
|
-
|
31
|
+
def copy(parent = nil)
|
32
|
+
self.class.new(parent, @value, position)
|
24
33
|
end
|
25
34
|
|
26
35
|
def ==(other)
|
@@ -3,46 +3,98 @@
|
|
3
3
|
module RuPkl
|
4
4
|
class Parser
|
5
5
|
define_parser do
|
6
|
+
rule(:argument_list) do
|
7
|
+
bracketed(list(expression).maybe, '(', ')').as(:argument_list)
|
8
|
+
end
|
9
|
+
|
6
10
|
rule(:unqualified_member_ref) do
|
7
|
-
|
11
|
+
(
|
12
|
+
id.as(:name) >>
|
13
|
+
(pure_ws? >> argument_list.as(:arguments)).maybe
|
14
|
+
).as(:unqualified_member_ref)
|
15
|
+
end
|
16
|
+
|
17
|
+
rule(:parenthesized_expression) do
|
18
|
+
bracketed(expression)
|
19
|
+
end
|
20
|
+
|
21
|
+
rule(:this_expression) do
|
22
|
+
kw_this.as(:this_expression)
|
23
|
+
end
|
24
|
+
|
25
|
+
rule(:null_expression) do
|
26
|
+
kw_null.as(:null_expression)
|
27
|
+
end
|
28
|
+
|
29
|
+
rule(:new_expression) do
|
30
|
+
(
|
31
|
+
kw_new.as(:kw_new) >>
|
32
|
+
(ws? >> type.as(:type)).maybe >>
|
33
|
+
(ws? >> object_body).repeat(1).as(:bodies)
|
34
|
+
).as(:new_expression)
|
35
|
+
end
|
36
|
+
|
37
|
+
rule(:amend_expression) do
|
38
|
+
(
|
39
|
+
parenthesized_expression.as(:target) >>
|
40
|
+
(ws? >> object_body).repeat(1).as(:bodies)
|
41
|
+
).as(:amend_expression)
|
8
42
|
end
|
9
43
|
|
10
44
|
rule(:primary) do
|
11
45
|
[
|
12
|
-
float_literal,
|
13
|
-
|
46
|
+
float_literal, int_literal, boolean_literal, string_literal,
|
47
|
+
this_expression, null_expression, new_expression, amend_expression,
|
48
|
+
unqualified_member_ref, parenthesized_expression
|
14
49
|
].inject(:|)
|
15
50
|
end
|
16
51
|
|
52
|
+
rule(:qualifier) do
|
53
|
+
(str('?.') | str('.'))
|
54
|
+
end
|
55
|
+
|
17
56
|
rule(:qualified_member_ref) do
|
18
57
|
(
|
19
|
-
|
20
|
-
(
|
21
|
-
).as(:qualified_member_ref)
|
58
|
+
ws? >> qualifier.as(:qualifier) >> ws? >>
|
59
|
+
id.as(:member) >> (pure_ws? >> argument_list.as(:arguments)).maybe
|
60
|
+
).as(:qualified_member_ref)
|
61
|
+
end
|
62
|
+
|
63
|
+
rule(:subscript_key) do
|
64
|
+
(
|
65
|
+
pure_ws? >> bracketed(expression, '[', ']') >>
|
66
|
+
(ws? >> str('=')).absent?
|
67
|
+
).as(:subscript_key)
|
22
68
|
end
|
23
69
|
|
24
|
-
rule(:
|
70
|
+
rule(:qualified_member_ref_or_subscript_operation) do
|
25
71
|
(
|
26
|
-
|
72
|
+
primary.as(:receiver) >>
|
27
73
|
(
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
74
|
+
qualified_member_ref | subscript_key
|
75
|
+
).repeat(1).as(:member_ref_or_subscript_key)
|
76
|
+
).as(:qualified_member_ref_or_subscript_operation) | primary
|
77
|
+
end
|
78
|
+
|
79
|
+
rule(:non_null_operation) do
|
80
|
+
(
|
81
|
+
qualified_member_ref_or_subscript_operation.as(:operand) >>
|
82
|
+
ws? >> str(:'!!').as(:non_null_operator)
|
83
|
+
) | qualified_member_ref_or_subscript_operation
|
32
84
|
end
|
33
85
|
|
34
86
|
rule(:unary_operation) do
|
35
87
|
(
|
36
88
|
(str(:-) | str(:!)).as(:unary_operator) >>
|
37
|
-
ws? >>
|
38
|
-
) |
|
89
|
+
ws? >> non_null_operation.as(:operand)
|
90
|
+
) | non_null_operation
|
39
91
|
end
|
40
92
|
|
41
93
|
rule(:binary_operation) do
|
42
94
|
expression = unary_operation
|
43
95
|
operators = binary_operators
|
44
96
|
reducer = proc { |l, o, r| { binary_operator: o, l_operand: l, r_operand: r } }
|
45
|
-
infix_expression(expression, *operators, &reducer)
|
97
|
+
infix_expression(expression, *operators, &reducer)
|
46
98
|
end
|
47
99
|
|
48
100
|
rule(:expression) do
|
@@ -53,12 +105,13 @@ module RuPkl
|
|
53
105
|
|
54
106
|
def binary_operators
|
55
107
|
operators = {
|
56
|
-
'
|
57
|
-
'
|
58
|
-
'
|
59
|
-
'
|
60
|
-
'
|
61
|
-
'
|
108
|
+
'??': 1,
|
109
|
+
'||': 2, '&&': 3,
|
110
|
+
'==': 4, '!=': 4,
|
111
|
+
'<': 5, '>': 5, '<=': 5, '>=': 5,
|
112
|
+
'+': 6, '-': 6,
|
113
|
+
'*': 7, '/': 7, '~/': 7, '%': 7,
|
114
|
+
'**': 8
|
62
115
|
}
|
63
116
|
operators
|
64
117
|
.sort_by { |op, _| op.length }.reverse
|
@@ -72,48 +125,112 @@ module RuPkl
|
|
72
125
|
else
|
73
126
|
ws? >> str(operator) >> ws?
|
74
127
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
[atom, priority, :left]
|
79
|
-
end
|
128
|
+
associativity =
|
129
|
+
(operator in :** | :'??') && :right || :left
|
130
|
+
[atom, priority, associativity]
|
80
131
|
end
|
81
132
|
end
|
82
133
|
|
83
134
|
define_transform do
|
84
|
-
rule(
|
85
|
-
|
135
|
+
rule(argument_list: subtree(:arguments)) do
|
136
|
+
arguments == '' ? nil : Array(arguments)
|
86
137
|
end
|
87
138
|
|
88
139
|
rule(
|
89
|
-
|
90
|
-
{
|
140
|
+
unqualified_member_ref:
|
141
|
+
{ name: simple(:name) }
|
91
142
|
) do
|
92
|
-
|
93
|
-
Node::MemberReference.new(r, m, r.position)
|
94
|
-
end
|
143
|
+
Node::MemberReference.new(nil, nil, name, false, name.position)
|
95
144
|
end
|
96
145
|
|
97
146
|
rule(
|
98
|
-
|
99
|
-
{
|
147
|
+
unqualified_member_ref:
|
148
|
+
{ name: simple(:name), arguments: subtree(:arguments) }
|
100
149
|
) do
|
101
|
-
|
102
|
-
|
150
|
+
Node::MethodCall.new(nil, nil, name, arguments, false, name.position)
|
151
|
+
end
|
152
|
+
|
153
|
+
rule(
|
154
|
+
qualified_member_ref_or_subscript_operation:
|
155
|
+
{
|
156
|
+
receiver: simple(:receiver),
|
157
|
+
member_ref_or_subscript_key: subtree(:member_ref_or_subscript_key)
|
158
|
+
}
|
159
|
+
) do
|
160
|
+
member_ref_or_subscript_key.inject(receiver) do |r, ref_or_key|
|
161
|
+
if ref_or_key.key?(:subscript_key)
|
162
|
+
process_subscript_operation(r, ref_or_key[:subscript_key])
|
163
|
+
else
|
164
|
+
process_member_ref(r, ref_or_key[:qualified_member_ref])
|
165
|
+
end
|
103
166
|
end
|
104
167
|
end
|
105
168
|
|
169
|
+
define_helper(:process_subscript_operation) do |receiver, key|
|
170
|
+
Node::SubscriptOperation.new(nil, :[], receiver, key, receiver.position)
|
171
|
+
end
|
172
|
+
|
173
|
+
define_helper(:process_member_ref) do |receiver, member_ref|
|
174
|
+
nullable = member_ref[:qualifier] == '?.'
|
175
|
+
if member_ref.key?(:arguments)
|
176
|
+
Node::MethodCall.new(
|
177
|
+
nil, receiver, member_ref[:member], member_ref[:arguments],
|
178
|
+
nullable, receiver.position
|
179
|
+
)
|
180
|
+
else
|
181
|
+
Node::MemberReference.new(
|
182
|
+
nil, receiver, member_ref[:member], nullable, receiver.position
|
183
|
+
)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
rule(this_expression: simple(:this)) do
|
188
|
+
Node::This.new(nil, node_position(this))
|
189
|
+
end
|
190
|
+
|
191
|
+
rule(null_expression: simple(:null)) do
|
192
|
+
Node::Null.new(nil, node_position(null))
|
193
|
+
end
|
194
|
+
|
195
|
+
rule(
|
196
|
+
new_expression:
|
197
|
+
{ kw_new: simple(:n), bodies: subtree(:b) }
|
198
|
+
) do
|
199
|
+
Node::UnresolvedObject.new(nil, nil, b, node_position(n))
|
200
|
+
end
|
201
|
+
|
202
|
+
rule(
|
203
|
+
new_expression:
|
204
|
+
{ kw_new: simple(:n), type: simple(:t), bodies: subtree(:b) }
|
205
|
+
) do
|
206
|
+
Node::UnresolvedObject.new(nil, t, b, node_position(n))
|
207
|
+
end
|
208
|
+
|
209
|
+
rule(
|
210
|
+
amend_expression:
|
211
|
+
{ target: simple(:t), bodies: subtree(:b) }
|
212
|
+
) do
|
213
|
+
Node::AmendExpression.new(nil, t, Array(b), t.position)
|
214
|
+
end
|
215
|
+
|
216
|
+
rule(operand: simple(:operand), non_null_operator: simple(:operator)) do
|
217
|
+
Node::NonNullOperation.new(nil, operator.to_sym, operand, operand.position)
|
218
|
+
end
|
219
|
+
|
106
220
|
rule(unary_operator: simple(:operator), operand: simple(:operand)) do
|
107
|
-
Node::UnaryOperation.new(operator.to_sym, operand, node_position(operator))
|
221
|
+
Node::UnaryOperation.new(nil, operator.to_sym, operand, node_position(operator))
|
108
222
|
end
|
109
223
|
|
110
224
|
rule(
|
111
225
|
binary_operator: simple(:operator),
|
112
226
|
l_operand: simple(:l_operand), r_operand: simple(:r_operand)
|
113
227
|
) do
|
114
|
-
|
115
|
-
operator.to_sym
|
116
|
-
|
228
|
+
klass =
|
229
|
+
case operator.to_sym
|
230
|
+
when :'??' then Node::NullCoalescingOperation
|
231
|
+
else Node::BinaryOperation
|
232
|
+
end
|
233
|
+
klass.new(nil, operator.to_sym, l_operand, r_operand, l_operand.position)
|
117
234
|
end
|
118
235
|
end
|
119
236
|
end
|
@@ -41,11 +41,11 @@ module RuPkl
|
|
41
41
|
parse_error(message, node_position(id))
|
42
42
|
end
|
43
43
|
|
44
|
-
Node::Identifier.new(id.to_sym, node_position(id))
|
44
|
+
Node::Identifier.new(nil, id.to_sym, node_position(id))
|
45
45
|
end
|
46
46
|
|
47
47
|
rule(quoted_id: simple(:id)) do
|
48
|
-
Node::Identifier.new(id.to_s[1..-2].to_sym, node_position(id))
|
48
|
+
Node::Identifier.new(nil, id.to_s[1..-2].to_sym, node_position(id))
|
49
49
|
end
|
50
50
|
|
51
51
|
private
|
data/lib/rupkl/parser/literal.rb
CHANGED
@@ -13,16 +13,16 @@ module RuPkl
|
|
13
13
|
|
14
14
|
define_transform do
|
15
15
|
rule(true_value: simple(:v)) do
|
16
|
-
Node::Boolean.new(true, node_position(v))
|
16
|
+
Node::Boolean.new(nil, true, node_position(v))
|
17
17
|
end
|
18
18
|
|
19
19
|
rule(false_value: simple(:v)) do
|
20
|
-
Node::Boolean.new(false, node_position(v))
|
20
|
+
Node::Boolean.new(nil, false, node_position(v))
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
#
|
25
|
-
#
|
25
|
+
# Int literal
|
26
26
|
#
|
27
27
|
define_parser do
|
28
28
|
rule(:bin_literal) do
|
@@ -41,18 +41,18 @@ module RuPkl
|
|
41
41
|
str('0x') >> match('[\h]') >> match('[_\h]').repeat
|
42
42
|
end
|
43
43
|
|
44
|
-
rule(:
|
44
|
+
rule(:int_literal) do
|
45
45
|
(
|
46
46
|
bin_literal | oct_literal | hex_literal | dec_literal
|
47
|
-
).as(:
|
47
|
+
).as(:int_literal)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
define_transform do
|
52
|
-
rule(
|
52
|
+
rule(int_literal: simple(:v)) do
|
53
53
|
base = { 'b' => 2, 'o' => 8, 'x' => 16 }.fetch(v.to_s[1], 10)
|
54
54
|
value = v.to_s.tr('_', '').to_i(base)
|
55
|
-
Node::
|
55
|
+
Node::Int.new(nil, value, node_position(v))
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -75,7 +75,7 @@ module RuPkl
|
|
75
75
|
define_transform do
|
76
76
|
rule(float_literal: simple(:f)) do
|
77
77
|
v = f.to_s.tr('_', '').to_f
|
78
|
-
Node::Float.new(v, node_position(f))
|
78
|
+
Node::Float.new(nil, v, node_position(f))
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -225,19 +225,25 @@ module RuPkl
|
|
225
225
|
|
226
226
|
define_transform do
|
227
227
|
rule(ss_bq: simple(:bq), ss_eq: simple(:eq)) do
|
228
|
-
Node::String.new(nil, nil, node_position(bq))
|
228
|
+
Node::String.new(nil, nil, nil, node_position(bq))
|
229
229
|
end
|
230
230
|
|
231
231
|
rule(ss_bq: simple(:bq), ss_portions: subtree(:portions), ss_eq: simple(:eq)) do
|
232
|
-
Node::String.new(
|
232
|
+
Node::String.new(
|
233
|
+
nil, nil, process_ss_portions(portions, bq),
|
234
|
+
node_position(bq)
|
235
|
+
)
|
233
236
|
end
|
234
237
|
|
235
238
|
rule(ms_bq: simple(:bq), ms_eq: simple(:eq)) do
|
236
|
-
Node::String.new(nil, nil, node_position(bq))
|
239
|
+
Node::String.new(nil, nil, nil, node_position(bq))
|
237
240
|
end
|
238
241
|
|
239
242
|
rule(ms_bq: simple(:bq), ms_portions: subtree(:portions), ms_eq: simple(:eq)) do
|
240
|
-
Node::String.new(
|
243
|
+
Node::String.new(
|
244
|
+
nil, nil, process_ms_portions(portions, bq, eq),
|
245
|
+
node_position(bq)
|
246
|
+
)
|
241
247
|
end
|
242
248
|
|
243
249
|
private
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuPkl
|
4
|
+
class Parser
|
5
|
+
define_parser do
|
6
|
+
rule(:method_header) do
|
7
|
+
kw_function.as(:kw_function) >> ws >>
|
8
|
+
id.as(:name) >> ws? >> method_params.as(:params) >>
|
9
|
+
(ws? >> type_annotation.as(:type)).maybe
|
10
|
+
end
|
11
|
+
|
12
|
+
rule(:method_params) do
|
13
|
+
bracketed(list(method_param).maybe, '(', ')').as(:method_params)
|
14
|
+
end
|
15
|
+
|
16
|
+
rule(:method_param) do
|
17
|
+
(
|
18
|
+
id.as(:name) >> (ws? >> type_annotation.as(:type)).maybe
|
19
|
+
).as(:method_param)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
define_transform do
|
24
|
+
rule(method_params: subtree(:params)) do
|
25
|
+
params == '' ? nil : Array(params)
|
26
|
+
end
|
27
|
+
|
28
|
+
rule(
|
29
|
+
method_param: { name: simple(:name) }
|
30
|
+
) do
|
31
|
+
Node::MethodParam.new(nil, name, nil, name.position)
|
32
|
+
end
|
33
|
+
|
34
|
+
rule(
|
35
|
+
method_param: { name: simple(:name), type: simple(:type) }
|
36
|
+
) do
|
37
|
+
Node::MethodParam.new(nil, name, type, name.position)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/rupkl/parser/misc.rb
CHANGED
@@ -45,6 +45,10 @@ module RuPkl
|
|
45
45
|
.map { _1.is_a?(String) && str(_1).ignore || _1 }
|
46
46
|
bra_matcher >> ws? >> atom >> ws? >> cket_matcher
|
47
47
|
end
|
48
|
+
|
49
|
+
def list(atom, delimiter = ',')
|
50
|
+
atom >> (ws? >> str(delimiter).ignore >> ws? >> atom).repeat
|
51
|
+
end
|
48
52
|
end
|
49
53
|
end
|
50
54
|
end
|
data/lib/rupkl/parser/object.rb
CHANGED
@@ -4,27 +4,30 @@ module RuPkl
|
|
4
4
|
class Parser
|
5
5
|
define_parser do
|
6
6
|
rule(:object) do
|
7
|
-
|
8
|
-
object_members.as(:members).maybe,
|
9
|
-
str('{').as(:start), '}'
|
10
|
-
).as(:object)
|
7
|
+
(object_body >> (ws? >> object_body).repeat).as(:bodies).as(:object)
|
11
8
|
end
|
12
9
|
|
13
|
-
rule(:
|
14
|
-
object_member >> (ws >> object_member).repeat
|
10
|
+
rule(:object_body) do
|
11
|
+
members = object_member >> (ws >> object_member).repeat
|
12
|
+
bracketed(
|
13
|
+
members.as(:members).maybe,
|
14
|
+
str('{').as(:body_begin), '}'
|
15
|
+
).as(:object_body)
|
15
16
|
end
|
16
17
|
|
17
18
|
rule(:object_member) do
|
18
|
-
|
19
|
+
[
|
20
|
+
object_method, object_element,
|
21
|
+
object_property, object_entry
|
22
|
+
].inject(:|)
|
19
23
|
end
|
20
24
|
|
21
25
|
rule(:object_property) do
|
22
26
|
(
|
23
27
|
id.as(:name) >> ws? >>
|
24
28
|
(
|
25
|
-
(str('=').ignore >> ws? >> expression
|
26
|
-
|
27
|
-
)
|
29
|
+
(str('=').ignore >> ws? >> expression) | object
|
30
|
+
).as(:value)
|
28
31
|
).as(:object_property)
|
29
32
|
end
|
30
33
|
|
@@ -32,40 +35,69 @@ module RuPkl
|
|
32
35
|
(
|
33
36
|
bracketed(expression.as(:key), '[', ']') >> ws? >>
|
34
37
|
(
|
35
|
-
(str('=').ignore >> ws? >> expression
|
36
|
-
|
37
|
-
)
|
38
|
+
(str('=').ignore >> ws? >> expression) | object
|
39
|
+
).as(:value)
|
38
40
|
).as(:object_entry)
|
39
41
|
end
|
40
42
|
|
41
43
|
rule(:object_element) do
|
42
|
-
|
44
|
+
(
|
45
|
+
expression >> (ws? >> match('[={]')).absent?
|
46
|
+
).as(:object_element)
|
47
|
+
end
|
48
|
+
|
49
|
+
rule(:object_method) do
|
50
|
+
(
|
51
|
+
method_header >> ws? >>
|
52
|
+
str('=').ignore >> ws? >> expression.as(:body)
|
53
|
+
).as(:object_method)
|
43
54
|
end
|
44
55
|
end
|
45
56
|
|
46
57
|
define_transform do
|
47
|
-
rule(object: {
|
48
|
-
|
58
|
+
rule(object: { bodies: subtree(:b) }) do
|
59
|
+
bodies = Array(b)
|
60
|
+
Node::UnresolvedObject.new(nil, nil, bodies, bodies.first.position)
|
49
61
|
end
|
50
62
|
|
51
|
-
rule(
|
52
|
-
Node::
|
63
|
+
rule(object_body: { body_begin: simple(:b) }) do
|
64
|
+
Node::ObjectBody.new(nil, nil, node_position(b))
|
53
65
|
end
|
54
66
|
|
55
|
-
rule(
|
56
|
-
Node::
|
67
|
+
rule(object_body: { body_begin: simple(:b), members: subtree(:m) }) do
|
68
|
+
Node::ObjectBody.new(nil, Array(m), node_position(b))
|
57
69
|
end
|
58
70
|
|
59
|
-
rule(object_property: { name: simple(:n),
|
60
|
-
Node::ObjectProperty.new(
|
71
|
+
rule(object_property: { name: simple(:n), value: simple(:v) }) do
|
72
|
+
Node::ObjectProperty.new(nil, n, v, n.position)
|
61
73
|
end
|
62
74
|
|
63
75
|
rule(object_entry: { key: simple(:k), value: simple(:v) }) do
|
64
|
-
Node::ObjectEntry.new(k, v,
|
76
|
+
Node::ObjectEntry.new(nil, k, v, k.position)
|
77
|
+
end
|
78
|
+
|
79
|
+
rule(object_element: simple(:e)) do
|
80
|
+
Node::ObjectElement.new(nil, e, e.position)
|
81
|
+
end
|
82
|
+
|
83
|
+
rule(
|
84
|
+
object_method:
|
85
|
+
{
|
86
|
+
kw_function: simple(:kw), name: simple(:name),
|
87
|
+
params: subtree(:params), body: simple(:body)
|
88
|
+
}
|
89
|
+
) do
|
90
|
+
Node::MethodDefinition.new(nil, name, params, nil, body, node_position(kw))
|
65
91
|
end
|
66
92
|
|
67
|
-
rule(
|
68
|
-
|
93
|
+
rule(
|
94
|
+
object_method:
|
95
|
+
{
|
96
|
+
kw_function: simple(:kw), name: simple(:name),
|
97
|
+
params: subtree(:params), type: simple(:type), body: simple(:body)
|
98
|
+
}
|
99
|
+
) do
|
100
|
+
Node::MethodDefinition.new(nil, name, params, type, body, node_position(kw))
|
69
101
|
end
|
70
102
|
end
|
71
103
|
end
|
@@ -7,22 +7,42 @@ module RuPkl
|
|
7
7
|
(
|
8
8
|
id.as(:name) >> ws? >>
|
9
9
|
(
|
10
|
-
(str('=').ignore >> ws? >> expression
|
11
|
-
|
12
|
-
)
|
10
|
+
(str('=').ignore >> ws? >> expression) | object
|
11
|
+
).as(:value)
|
13
12
|
).as(:class_property)
|
14
13
|
end
|
14
|
+
|
15
|
+
rule(:pkl_class_method) do
|
16
|
+
(
|
17
|
+
method_header >> ws? >>
|
18
|
+
str('=').ignore >> ws? >> expression.as(:body)
|
19
|
+
).as(:pkl_class_method)
|
20
|
+
end
|
15
21
|
end
|
16
22
|
|
17
23
|
define_transform do
|
18
24
|
rule(class_property: { name: simple(:n), value: simple(:v) }) do
|
19
|
-
Node::
|
25
|
+
Node::ObjectProperty.new(nil, n, v, n.position)
|
20
26
|
end
|
21
|
-
end
|
22
27
|
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
rule(
|
29
|
+
pkl_class_method:
|
30
|
+
{
|
31
|
+
kw_function: simple(:kw), name: simple(:name),
|
32
|
+
params: subtree(:params), body: simple(:body)
|
33
|
+
}
|
34
|
+
) do
|
35
|
+
Node::MethodDefinition.new(nil, name, params, nil, body, node_position(kw))
|
36
|
+
end
|
37
|
+
|
38
|
+
rule(
|
39
|
+
pkl_class_method:
|
40
|
+
{
|
41
|
+
kw_function: simple(:kw), name: simple(:name),
|
42
|
+
params: subtree(:params), type: simple(:type), body: simple(:body)
|
43
|
+
}
|
44
|
+
) do
|
45
|
+
Node::MethodDefinition.new(nil, name, params, type, body, node_position(kw))
|
26
46
|
end
|
27
47
|
end
|
28
48
|
end
|
@@ -14,18 +14,20 @@ module RuPkl
|
|
14
14
|
end
|
15
15
|
|
16
16
|
rule(:pkl_module_item) do
|
17
|
-
pkl_class_property
|
17
|
+
pkl_class_method | pkl_class_property
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
define_transform do
|
22
22
|
rule(pkl_module: simple(:_)) do
|
23
|
-
Node::
|
23
|
+
body = Node::ObjectBody.new(nil, nil, sof_position)
|
24
|
+
Node::PklModule.new(nil, body, sof_position)
|
24
25
|
end
|
25
26
|
|
26
27
|
rule(pkl_module: { items: subtree(:items) }) do
|
27
28
|
Array(items)
|
28
|
-
.then { Node::
|
29
|
+
.then { Node::ObjectBody.new(nil, _1, _1.first.position) }
|
30
|
+
.then { Node::PklModule.new(nil, _1, _1.position) }
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|