@@ -45,19 +45,28 @@ def initialize( current_behavior = nil )
45
45
end
46
46
end
47
47
48
- def self . evaluate_array_rule jcr , rule_atom , data , econs , behavior = nil
48
+ def self . evaluate_array_rule jcr , rule_atom , data , econs , behavior = nil , target_annotations = nil
49
49
50
50
push_trace_stack ( econs , jcr )
51
- trace ( econs , "Evaluating array rule starting at #{ slice_to_s ( jcr ) } against" , data )
52
- trace_def ( econs , "array" , jcr , data )
53
- retval = evaluate_array ( jcr , rule_atom , data , econs , behavior )
54
- trace_eval ( econs , "Array" , retval , jcr , data , "array" )
51
+ if behavior
52
+ trace ( econs , "Evaluating group in array rule starting at #{ slice_to_s ( jcr ) } against" , data )
53
+ trace_def ( econs , "array group" , jcr , data )
54
+ else
55
+ trace ( econs , "Evaluating array rule starting at #{ slice_to_s ( jcr ) } against" , data )
56
+ trace_def ( econs , "array" , jcr , data )
57
+ end
58
+ retval = evaluate_array ( jcr , rule_atom , data , econs , behavior , target_annotations )
59
+ if behavior
60
+ trace_eval ( econs , "Array group" , retval , jcr , data , "array" )
61
+ else
62
+ trace_eval ( econs , "Array" , retval , jcr , data , "array" )
63
+ end
55
64
pop_trace_stack ( econs )
56
65
return retval
57
66
58
67
end
59
68
60
- def self . evaluate_array jcr , rule_atom , data , econs , behavior = nil
69
+ def self . evaluate_array jcr , rule_atom , data , econs , behavior = nil , target_annotations = nil
61
70
62
71
rules , annotations = get_rules_and_annotations ( jcr )
63
72
@@ -76,20 +85,24 @@ def self.evaluate_array jcr, rule_atom, data, econs, behavior = nil
76
85
77
86
# if the data is not an array
78
87
return evaluate_not ( annotations ,
79
- Evaluation . new ( false , "#{ data } is not an array #{ raised_rule ( jcr , rule_atom ) } " ) , econs ) unless data . is_a? Array
88
+ Evaluation . new ( false , "#{ data } is not an array #{ raised_rule ( jcr , rule_atom ) } " ) ,
89
+ econs , target_annotations ) unless data . is_a? Array
80
90
81
91
# if the array is zero length and there are zero sub-rules (it is suppose to be empty)
82
92
return evaluate_not ( annotations ,
83
- Evaluation . new ( true , nil ) , econs ) if rules . empty? && data . empty?
93
+ Evaluation . new ( true , nil ) , econs , target_annotations ) if rules . empty? && data . empty?
84
94
85
95
# if the array is not empty and there are zero sub-rules (it is suppose to be empty)
86
96
return evaluate_not ( annotations ,
87
- Evaluation . new ( false , "Non-empty array for #{ raised_rule ( jcr , rule_atom ) } " ) , econs ) if rules . empty? && data . length != 0
97
+ Evaluation . new ( false , "Non-empty array for #{ raised_rule ( jcr , rule_atom ) } " ) ,
98
+ econs , target_annotations ) if rules . empty? && data . length != 0
88
99
89
100
if ordered
90
- return evaluate_not ( annotations , evaluate_array_rule_ordered ( rules , rule_atom , data , econs , behavior ) , econs )
101
+ return evaluate_not ( annotations , evaluate_array_rule_ordered ( rules , rule_atom , data , econs , behavior ) ,
102
+ econs , target_annotations )
91
103
else
92
- return evaluate_not ( annotations , evaluate_array_rule_unordered ( rules , rule_atom , data , econs , behavior ) , econs )
104
+ return evaluate_not ( annotations , evaluate_array_rule_unordered ( rules , rule_atom , data , econs , behavior ) ,
105
+ econs , target_annotations )
93
106
end
94
107
end
95
108
@@ -115,7 +128,8 @@ def self.evaluate_array_rule_ordered jcr, rule_atom, data, econs, behavior = nil
115
128
# groups require the effects of the evaluation to be discarded if they are false
116
129
# groups must also be given the entire array
117
130
118
- if ( grule = get_group ( rule , econs ) )
131
+ grule , target_annotations = get_group ( rule , econs )
132
+ if grule
119
133
120
134
if repeat_min == 0
121
135
retval = Evaluation . new ( true , nil )
@@ -126,7 +140,7 @@ def self.evaluate_array_rule_ordered jcr, rule_atom, data, econs, behavior = nil
126
140
else
127
141
group_behavior = ArrayBehavior . new ( behavior )
128
142
group_behavior . last_index = array_index
129
- retval = evaluate_rule ( grule , rule_atom , data , econs , group_behavior )
143
+ retval = evaluate_rule ( grule , rule_atom , data , econs , group_behavior , target_annotations )
130
144
if retval . success
131
145
behavior . checked_hash . merge! ( group_behavior . checked_hash )
132
146
array_index = group_behavior . last_index
@@ -141,7 +155,7 @@ def self.evaluate_array_rule_ordered jcr, rule_atom, data, econs, behavior = nil
141
155
break if array_index == data . length
142
156
group_behavior = ArrayBehavior . new ( behavior )
143
157
group_behavior . last_index = array_index
144
- e = evaluate_rule ( grule , rule_atom , data , econs , group_behavior )
158
+ e = evaluate_rule ( grule , rule_atom , data , econs , group_behavior , target_annotations )
145
159
if e . success
146
160
behavior . checked_hash . merge! ( group_behavior . checked_hash )
147
161
array_index = group_behavior . last_index
@@ -187,7 +201,7 @@ def self.evaluate_array_rule_ordered jcr, rule_atom, data, econs, behavior = nil
187
201
behavior . last_index = array_index
188
202
189
203
if data . length > array_index && behavior . extra_prohibited
190
- retval = Evaluation . new ( false , "More itmes in array than specified for #{ raised_rule ( jcr , rule_atom ) } " )
204
+ retval = Evaluation . new ( false , "More items in array ( #{ data . length } ) than specified ( #{ array_index } ) for #{ raised_rule ( jcr , rule_atom ) } " )
191
205
end
192
206
193
207
return retval
@@ -218,14 +232,15 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
218
232
# groups require the effects of the evaluation to be discarded if they are false
219
233
# groups must also be given the entire array
220
234
221
- if ( grule = get_group ( rule , econs ) )
235
+ grule , target_annotations = get_group ( rule , econs )
236
+ if grule
222
237
223
238
successes = 0
224
239
for i in 0 ..repeat_max -1
225
240
group_behavior = ArrayBehavior . new ( behavior )
226
241
group_behavior . last_index = highest_index
227
242
group_behavior . ordered = false
228
- e = evaluate_rule ( grule , rule_atom , data , econs , group_behavior )
243
+ e = evaluate_rule ( grule , rule_atom , data , econs , group_behavior , target_annotations )
229
244
if e . success
230
245
highest_index = group_behavior . last_index
231
246
behavior . checked_hash . merge! ( group_behavior . checked_hash )
@@ -236,13 +251,13 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
236
251
end
237
252
238
253
if successes == 0 && repeat_min > 0
239
- retval = Evaluation . new ( false , "array does not contain #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
254
+ retval = Evaluation . new ( false , "array does not contain #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
240
255
elsif successes < repeat_min
241
- retval = Evaluation . new ( false , "array does not have enough #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
256
+ retval = Evaluation . new ( false , "array does not have enough #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
242
257
elsif successes > repeat_max
243
- retval = Evaluation . new ( false , "array has too many #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
258
+ retval = Evaluation . new ( false , "array has too many #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
244
259
elsif repeat_step && ( successes - repeat_min ) % repeat_step != 0
245
- retval = Evaluation . new ( false , "array matches (#{ successes } ) do not meet repetition step of #{ repeat_max } % #{ repeat_step } with #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
260
+ retval = Evaluation . new ( false , "array matches (#{ successes } ) do not meet repetition step of #{ repeat_max } % #{ repeat_step } with #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
246
261
else
247
262
retval = Evaluation . new ( true , nil )
248
263
end
@@ -263,13 +278,13 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
263
278
end
264
279
265
280
if successes == 0 && repeat_min > 0
266
- retval = Evaluation . new ( false , "array does not contain #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
281
+ retval = Evaluation . new ( false , "array does not contain #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
267
282
elsif successes < repeat_min
268
- retval = Evaluation . new ( false , "array does not have enough #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
283
+ retval = Evaluation . new ( false , "array does not have enough #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
269
284
elsif successes > repeat_max
270
- retval = Evaluation . new ( false , "array has too many #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
285
+ retval = Evaluation . new ( false , "array has too many #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
271
286
elsif repeat_step && ( successes - repeat_min ) % repeat_step != 0
272
- retval = Evaluation . new ( false , "array matches (#{ successes } ) do not meet repetition step of #{ repeat_max } % #{ repeat_step } with #{ rule } for #{ raised_rule ( jcr , rule_atom ) } " )
287
+ retval = Evaluation . new ( false , "array matches (#{ successes } ) do not meet repetition step of #{ repeat_max } % #{ repeat_step } with #{ jcr_to_s ( rule ) } for #{ raised_rule ( jcr , rule_atom ) } " )
273
288
else
274
289
retval = Evaluation . new ( true , nil )
275
290
end
@@ -281,7 +296,7 @@ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = n
281
296
behavior . last_index = highest_index
282
297
283
298
if data . length > behavior . checked_hash . length && behavior . extra_prohibited
284
- retval = Evaluation . new ( false , "More itmes in array than specified for #{ raised_rule ( jcr , rule_atom ) } " )
299
+ retval = Evaluation . new ( false , "More items in array than specified for #{ raised_rule ( jcr , rule_atom ) } " )
285
300
end
286
301
287
302
return retval
0 commit comments