jcrvalidator 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/jcr/parser.rb CHANGED
@@ -21,9 +21,8 @@ module JCR
21
21
 
22
22
  root(:jcr)
23
23
 
24
- rule(:jcr) { ( spcCmnt | directive ).repeat >> root_rule.maybe >> ( spcCmnt | directive | rule ).repeat }
25
- #! jcr = *( sp-cmt / directive ) [ root_rule ]
26
- #! *( sp-cmt / directive / rule )
24
+ rule(:jcr) { ( spcCmnt | directive | root_rule | rule ).repeat }
25
+ #! jcr = *( sp-cmt / directive / root_rule / rule )
27
26
  #!
28
27
 
29
28
  rule(:spcCmnt) { spaces | comment }
@@ -35,6 +34,8 @@ module JCR
35
34
  #! spaces = 1*( WSP / CR / LF )
36
35
  rule(:spaces?) { spaces.maybe }
37
36
  #/ spaces? -> [ spaces ]
37
+ rule(:wsp) { match('[\t ]') }
38
+ # WSP is a standard ABNF production so is not expanded here
38
39
  rule(:comment) { str(';') >> ( str('\;') | match('[^\r\n;]') ).repeat >> match('[\r\n;]') }
39
40
  #! comment = ";" *( "\;" / comment-char ) comment-end-char
40
41
  #! comment-char = HTAB / %x20-3A / %x3C-10FFFF
@@ -42,16 +43,21 @@ module JCR
42
43
  #! comment-end-char = CR / LF / ";"
43
44
  #!
44
45
 
45
- rule(:directive) { ( str('#') >> spaces? >> directive_def >> match('[\r\n]') ).as(:directive) }
46
- #! directive = "#" spaces? directive_def *WSP eol
47
- rule(:directive_def) { jcr_version_d | ruleset_id_d | import_d | tbd_directive_d }
48
- #! directive_def = jcr_version_d / ruleset_id_d / import_d /
49
- #! tbd_directive_d
50
- rule(:jcr_version_d) { (str('jcr-version') >> spaces >> p_integer.as(:major_version) >> str('.') >> p_integer.as(:minor_version)).as(:jcr_version_d) }
46
+ rule(:directive) { ( str('#') >> (one_line_directive | multi_line_directive) ).as(:directive) }
47
+ #! directive = "#" (one_line_directive / multi_line_directive)
48
+ rule(:one_line_directive) { ( spaces? >> ( directive_def | one_line_tbd_directive_d ) >> wsp.repeat >> match('[\r\n]') ) }
49
+ #! one_line_directive = spaces?
50
+ #! (directive_def / one_line_tbd_directive_d) *WSP eol
51
+ rule(:multi_line_directive) { str('{') >> spcCmnt? >> (directive_def | multi_line_tbd_directive_d) >> spcCmnt? >> str('}') }
52
+ #! multi_line_directive = "{" spcCmnt?
53
+ #! (directive_def / multi_line_tbd_directive_d) spcCmnt? "}"
54
+ rule(:directive_def) { jcr_version_d | ruleset_id_d | import_d }
55
+ #! directive_def = jcr_version_d / ruleset_id_d / import_d
56
+ rule(:jcr_version_d) { (str('jcr-version') >> spaces >> non_neg_integer.as(:major_version) >> str('.') >> non_neg_integer.as(:minor_version)).as(:jcr_version_d) }
51
57
  #! jcr_version_d = jcr-version-kw spaces major_version "." minor_version
52
58
  #> jcr-version-kw = "jcr-version"
53
- #! major_version = p_integer
54
- #! minor_version = p_integer
59
+ #! major_version = non_neg_integer
60
+ #! minor_version = non_neg_integer
55
61
  rule(:ruleset_id_d) { (str('ruleset-id') >> spaces >> ruleset_id.as(:ruleset_id)).as(:ruleset_id_d) }
56
62
  #! ruleset_id_d = ruleset-id-kw spaces ruleset_id
57
63
  #> ruleset-id-kw = "ruleset-id"
@@ -65,92 +71,113 @@ module JCR
65
71
  #! not-space = %x21-10FFFF
66
72
  rule(:ruleset_id_alias) { name.as(:ruleset_id_alias) }
67
73
  #! ruleset_id_alias = name
68
- rule(:tbd_directive_d) { name.as(:directive_name) >> ( spaces >> match('[^\r\n]').repeat.as(:directive_parameters) ).maybe }
69
- #! tbd_directive_d = directive_name [ spaces directive_parameters ]
74
+ rule(:one_line_tbd_directive_d) { name.as(:directive_name) >> ( wsp >> match('[^\r\n]').repeat.as(:directive_parameters) ).maybe }
75
+ #! one_line_tbd_directive_d = directive_name [ WSP one_line_directive_parameters ]
70
76
  #! directive_name = name
71
- #! directive_parameters = *not_eol
77
+ #! one_line_directive_parameters = *not_eol
72
78
  #! not_eol = HTAB / %x20-10FFFF
73
79
  #! eol = CR / LF
80
+ rule(:multi_line_tbd_directive_d) { name.as(:directive_name) >> ( spaces >> multi_line_directive_parameters.as(:directive_parameters) ).maybe }
81
+ #! multi_line_tbd_directive_d = directive_name
82
+ #! [ spaces multi_line_directive_parameters ]
83
+ rule(:multi_line_directive_parameters) { multi_line_parameters }
84
+ #! multi_line_directive_parameters = multi_line_parameters
85
+ rule(:multi_line_parameters) { (comment | q_string | regex | match('[^"/;}]')).repeat }
86
+ #! multi_line_parameters = *(comment / q_string / regex /
87
+ #! not_multi_line_special)
88
+ #! not_multi_line_special = spaces / %x21 / %x23-2E / %x30-3A / %x3C-7C /
89
+ #! %x7E-10FFFF ; not ", /, ; or }
74
90
  #!
75
91
 
76
92
  rule(:root_rule) { value_rule | group_rule } # N.B. Not target_rule_name
77
93
  #! root_rule = value_rule / group_rule
78
94
  #!
79
95
 
80
- rule(:rule) { ( rule_name >> spcCmnt? >> rule_def ).as(:rule) }
81
- #! rule = rule_name spcCmnt? rule_def
96
+ rule(:rule) { ( annotations.as(:annotations) >> str('$') >> rule_name >> spcCmnt? >> str('=') >> spcCmnt? >> rule_def ).as(:rule) }
97
+ #! rule = annotations "$" rule_name spcCmnt? "=" spcCmnt? rule_def
82
98
  #!
83
99
 
84
100
  rule(:rule_name) { name.as(:rule_name) }
85
101
  #! rule_name = name
86
- rule(:target_rule_name) { ((ruleset_id_alias >> str('.')).maybe >> rule_name).as(:target_rule_name) }
87
- #! target_rule_name = [ ruleset_id_alias "." ] rule_name
102
+ rule(:target_rule_name) { (annotations.as(:annotations) >> str('$') >> (ruleset_id_alias >> str('.')).maybe >> rule_name).as(:target_rule_name) }
103
+ #! target_rule_name = annotations "$" [ ruleset_id_alias "." ] rule_name
88
104
  rule(:name) { match('[a-zA-Z]') >> match('[a-zA-Z0-9\-_]').repeat }
89
105
  #! name = ALPHA *( ALPHA / DIGIT / "-" / "_" )
90
106
  #!
91
107
 
92
- rule(:rule_def) { type_rule | member_rule | group_rule }
93
- #! rule_def = type_rule / member_rule / group_rule
94
- rule(:type_rule) { value_rule | type_choice_rule | target_rule_name }
95
- #! type_rule = value_rule / type_choice_rule / target_rule_name
108
+ rule(:rule_def) { member_rule | (type_designator >> rule_def_type_rule) |
109
+ array_rule | object_rule | group_rule | target_rule_name }
110
+ #! rule_def = member_rule / type_designator rule_def_type_rule /
111
+ #! array_rule / object_rule / group_rule / target_rule_name
112
+ rule(:type_designator) { str('type') >> spcCmnt.repeat(1) | str(':') >> spcCmnt? }
113
+ #! type_designator = type-kw 1*spcCmnt / ":" spcCmnt?
114
+ #> type-kw = "type"
115
+ rule(:rule_def_type_rule) { value_rule | type_choice }
116
+ #! rule_def_type_rule = value_rule / type_choice
96
117
  rule(:value_rule) { primitive_rule | array_rule | object_rule }
97
118
  #! value_rule = primitive_rule / array_rule / object_rule
98
- rule(:member_rule) { ( annotations >> member_name_spec >> spcCmnt? >> type_rule ).as(:member_rule) }
119
+ rule(:member_rule) { ( annotations >> member_name_spec >> spcCmnt? >> str(':') >> spcCmnt? >> type_rule ).as(:member_rule) }
99
120
  #! member_rule = annotations
100
- #! member_name_spec spcCmnt? type_rule
121
+ #! member_name_spec spcCmnt? ":" spcCmnt? type_rule
101
122
  rule(:member_name_spec) { regex.as(:member_regex) | q_string.as(:member_name) }
102
123
  #! member_name_spec = regex / q_string
103
- rule(:type_choice_rule) { str(':').as(:type_choice_signifier) >> spcCmnt? >> type_choice }
104
- #! type_choice_rule = ":" spcCmnt? type_choice
124
+ rule(:type_rule) { value_rule | type_choice | target_rule_name }
125
+ #! type_rule = value_rule / type_choice / target_rule_name
105
126
  rule(:type_choice) { ( annotations >> str('(') >> type_choice_items >> ( choice_combiner >> type_choice_items ).repeat >> str(')') ).as(:group_rule) }
106
127
  #! type_choice = annotations "(" type_choice_items
107
128
  #! *( choice_combiner type_choice_items ) ")"
129
+ rule(:explicit_type_choice) { type_designator >> type_choice }
130
+ #! explicit_type_choice = type_designator type_choice
108
131
  rule(:type_choice_items) { spcCmnt? >> (type_choice | type_rule) >> spcCmnt? }
109
132
  #! type_choice_items = spcCmnt? ( type_choice / type_rule ) spcCmnt?
110
133
  #!
111
134
 
112
- rule(:annotations) { ( str('@(') >> spcCmnt? >> annotation_set >> spcCmnt? >> str(')') >> spcCmnt? ).repeat }
113
- #! annotations = *( "@(" spcCmnt? annotation_set spcCmnt? ")" spcCmnt? )
114
- rule(:annotation_set) { reject_annotation | unordered_annotation | root_annotation | tbd_annotation }
115
- #! annotation_set = reject_annotation / unordered_annotation /
135
+ rule(:annotations) { ( str('@{') >> spcCmnt? >> annotation_set >> spcCmnt? >> str('}') >> spcCmnt? ).repeat }
136
+ #! annotations = *( "@{" spcCmnt? annotation_set spcCmnt? "}" spcCmnt? )
137
+ rule(:annotation_set) { not_annotation | unordered_annotation | root_annotation | tbd_annotation }
138
+ #! annotation_set = not_annotation / unordered_annotation /
116
139
  #! root_annotation / tbd_annotation
117
- rule(:reject_annotation) { str('reject').as(:reject_annotation) }
118
- #! reject_annotation = reject-kw
119
- #> reject-kw = "reject"
140
+ rule(:not_annotation) { str('not').as(:not_annotation) }
141
+ #! not_annotation = not-kw
142
+ #> not-kw = "not"
120
143
  rule(:unordered_annotation) { str('unordered').as(:unordered_annotation) }
121
144
  #! unordered_annotation = unordered-kw
122
145
  #> unordered-kw = "unordered"
123
146
  rule(:root_annotation) { str('root').as(:root_annotation) }
124
147
  #! root_annotation = root-kw
125
148
  #> root-kw = "root"
126
- rule(:tbd_annotation) { name.as(:annotation_name) >> ( spaces >> match('[^)]').as(:annotation_parameters) ).maybe }
149
+ rule(:tbd_annotation) { name.as(:annotation_name) >> ( spaces >> annotation_parameters.as(:annotation_parameters) ).maybe }
127
150
  #! tbd_annotation = annotation_name [ spaces annotation_parameters ]
128
151
  #! annotation_name = name
129
- #! annotation_parameters = *( spaces / %x21-28 / %x2A-10FFFF )
130
- #! ; Not close bracket - ")"
152
+ rule(:annotation_parameters) { multi_line_parameters }
153
+ #! annotation_parameters = multi_line_parameters
131
154
  #!
132
155
 
133
- rule(:primitive_rule) { ( annotations >> str(':') >> spcCmnt? >> primimitive_def ).as(:primitive_rule) }
134
- #! primitive_rule = annotations ":" spcCmnt? primimitive_def
135
-
136
- rule(:primimitive_def) {
137
- null_type | boolean_type | true_value | false_value |
138
- string_type | string_range | string_value |
139
- float_type | float_range | float_value |
140
- integer_type | integer_range | integer_value |
141
- ip4_type | ip6_type | fqdn_type | idn_type |
142
- uri_range | uri_type | phone_type | email_type |
143
- full_date_type | full_time_type | date_time_type |
144
- base64_type | any
156
+ rule(:primitive_rule) { ( annotations >> primitive_def ).as(:primitive_rule) }
157
+ #! primitive_rule = annotations primitive_def
158
+
159
+ rule(:primitive_def) {
160
+ string_type | string_range | string_value |
161
+ null_type | boolean_type | true_value | false_value |
162
+ double_type | float_type | float_range | float_value |
163
+ integer_type | integer_range | integer_value |
164
+ sized_int_type | sized_uint_type |
165
+ ipv4_type | ipv6_type | ipaddr_type | fqdn_type | idn_type |
166
+ uri_range | uri_type | phone_type | email_type |
167
+ datetime_type | date_type | time_type |
168
+ hex_type | base32hex_type | base32_type | base64url_type | base64_type |
169
+ any
145
170
  }
146
- #! primimitive_def = null_type / boolean_type / true_value / false_value /
147
- #! string_type / string_range / string_value /
148
- #! float_type / float_range / float_value /
149
- #! integer_type / integer_range / integer_value /
150
- #! ip4_type / ip6_type / fqdn_type / idn_type /
171
+ #! primitive_def = string_type / string_range / string_value /
172
+ #! null_type / boolean_type / true_value / false_value /
173
+ #! double_type / float_type / float_range / float_value /
174
+ #! integer_type / integer_range / integer_value /
175
+ #! sized_int_type / sized_uint_type /
176
+ #! ipv4_type / ipv6_type / ipaddr_type / fqdn_type / idn_type /
151
177
  #! uri_range / uri_type / phone_type / email_type /
152
- #! full_date_type / full_time_type / date_time_type /
153
- #! base64_type / any
178
+ #! datetime_type / date_type / time_type /
179
+ #! hex_type / base32hex_type / base32_type / base64url_type / base64_type /
180
+ #! any
154
181
  rule(:null_type) { str('null').as(:null) }
155
182
  #! null_type = null-kw
156
183
  #> null-kw = "null"
@@ -170,6 +197,9 @@ module JCR
170
197
  #! string_value = q_string
171
198
  rule(:string_range) { regex }
172
199
  #! string_range = regex
200
+ rule(:double_type) { str('double').as(:double_v) }
201
+ #! double_type = double-kw
202
+ #> double-kw = "double"
173
203
  rule(:float_type) { str('float').as(:float_v) }
174
204
  #! float_type = float-kw
175
205
  #> float-kw = "float"
@@ -192,12 +222,21 @@ module JCR
192
222
  #! integer_max = integer
193
223
  rule(:integer_value) { integer.as(:integer) }
194
224
  #! integer_value = integer
195
- rule(:ip4_type) { str('ip4').as(:ip4) }
196
- #! ip4_type = ip4-kw
197
- #> ip4-kw = "ip4"
198
- rule(:ip6_type) { str('ip6').as(:ip6) }
199
- #! ip6_type = ip6-kw
200
- #> ip6-kw = "ip6"
225
+ rule(:sized_int_type) { ( str('int') >> pos_integer.as(:bits) ).as(:sized_int_v) }
226
+ #! sized_int_type = int-kw pos_integer
227
+ #> int-kw = "int"
228
+ rule(:sized_uint_type) { ( str('uint') >> pos_integer.as(:bits) ).as(:sized_uint_v) }
229
+ #! sized_uint_type = uint-kw pos_integer
230
+ #> uint-kw = "uint"
231
+ rule(:ipv4_type) { str('ipv4').as(:ipv4) }
232
+ #! ipv4_type = ipv4-kw
233
+ #> ipv4-kw = "ipv4"
234
+ rule(:ipv6_type) { str('ipv6').as(:ipv6) }
235
+ #! ipv6_type = ipv6-kw
236
+ #> ipv6-kw = "ipv6"
237
+ rule(:ipaddr_type) { str('ipaddr').as(:ipaddr) }
238
+ #! ipaddr_type = ipaddr-kw
239
+ #> ipaddr-kw = "ipaddr"
201
240
  rule(:fqdn_type) { str('fqdn').as(:fqdn) }
202
241
  #! fqdn_type = fqdn-kw
203
242
  #> fqdn-kw = "fqdn"
@@ -216,15 +255,27 @@ module JCR
216
255
  rule(:email_type) { str('email').as(:email) }
217
256
  #! email_type = email-kw
218
257
  #> email-kw = "email"
219
- rule(:full_date_type) { str('full-date').as(:full_date) }
220
- #! full-date_type = full-date-kw
221
- #> full-date-kw = "full-date"
222
- rule(:full_time_type) { str('full-time').as(:full_time) }
223
- #! full-time_type = full-time-kw
224
- #> full-time-kw = "full-time"
225
- rule(:date_time_type) { str('date-time').as(:date_time) }
226
- #! date-time_type = date-time-kw
227
- #> date-time-kw = "date-time"
258
+ rule(:datetime_type) { str('datetime').as(:datetime) }
259
+ #! datetime_type = datetime-kw
260
+ #> datetime-kw = "datetime"
261
+ rule(:date_type) { str('date').as(:date) }
262
+ #! date_type = date-kw
263
+ #> date-kw = "date"
264
+ rule(:time_type) { str('time').as(:time) }
265
+ #! time_type = time-kw
266
+ #> time-kw = "time"
267
+ rule(:hex_type) { str('hex').as(:hex) }
268
+ #! hex_type = hex-kw
269
+ #> hex-kw = "hex"
270
+ rule(:base32hex_type) { str('base32hex').as(:base32hex) }
271
+ #! base32hex_type = base32hex-kw
272
+ #> base32hex-kw = "base32hex"
273
+ rule(:base32_type) { str('base32').as(:base32) }
274
+ #! base32_type = base32-kw
275
+ #> base32-kw = "base32"
276
+ rule(:base64url_type) { str('base64url').as(:base64url) }
277
+ #! base64url_type = base64url-kw
278
+ #> base64url-kw = "base64url"
228
279
  rule(:base64_type) { str('base64').as(:base64) }
229
280
  #! base64_type = base64-kw
230
281
  #> base64-kw = "base64"
@@ -233,32 +284,32 @@ module JCR
233
284
  #> any-kw = "any"
234
285
  #!
235
286
 
236
- rule(:object_rule) { ( annotations >> (str(':') >> spcCmnt?).maybe >>
237
- str('{') >> spcCmnt? >> object_items.maybe >> spcCmnt? >> str('}') ).as(:object_rule) }
238
- #! object_rule = annotations [ ":" spcCmnt? ] "{" spcCmnt? [ object_items spcCmnt? ] "}"
287
+ rule(:object_rule) { ( annotations >>
288
+ str('{') >> spcCmnt? >> object_items.maybe >> spcCmnt? >> str('}') ).as(:object_rule) }
289
+ #! object_rule = annotations "{" spcCmnt? [ object_items spcCmnt? ] "}"
239
290
  rule(:object_items) { object_item >> (( spcCmnt? >> sequence_combiner >> spcCmnt? >> object_item ).repeat(1) |
240
291
  ( spcCmnt? >> choice_combiner >> spcCmnt? >> object_item ).repeat(1) ).maybe }
241
292
  #! object_items = object_item (*( sequence_combiner object_item ) /
242
293
  #! *( choice_combiner object_item ) )
243
- rule(:object_item ) { repetition.maybe >> spcCmnt? >> object_item_types }
244
- #! object_item = [ repetition spcCmnt? ] object_item_types
245
- rule(:object_item_types) { member_rule | target_rule_name | object_group }
246
- #! object_item_types = member_rule / target_rule_name / object_group
294
+ rule(:object_item ) { object_item_types >> spcCmnt? >> repetition.maybe }
295
+ #! object_item = object_item_types spcCmnt? [ repetition ]
296
+ rule(:object_item_types) { object_group | member_rule | target_rule_name }
297
+ #! object_item_types = object_group / member_rule / target_rule_name
247
298
  rule(:object_group) { ( str('(') >> spcCmnt? >> object_items.maybe >> spcCmnt? >> str(')') ).as(:group_rule) }
248
299
  #! object_group = "(" spcCmnt? [ object_items spcCmnt? ] ")"
249
300
  #!
250
301
 
251
- rule(:array_rule) { ( annotations >> (str(':') >> spcCmnt?).maybe >>
252
- str('[') >> spcCmnt? >> array_items.maybe >> spcCmnt? >> str(']') ).as(:array_rule) }
253
- #! array_rule = annotations [ ":" spcCmnt? ] "[" spcCmnt? [ array_items spcCmnt? ] "]"
302
+ rule(:array_rule) { ( annotations >>
303
+ str('[') >> spcCmnt? >> array_items.maybe >> spcCmnt? >> str(']') ).as(:array_rule) }
304
+ #! array_rule = annotations "[" spcCmnt? [ array_items spcCmnt? ] "]"
254
305
  rule(:array_items) { array_item >> (( spcCmnt? >> sequence_combiner >> spcCmnt? >> array_item ).repeat(1) |
255
306
  ( spcCmnt? >> choice_combiner >> spcCmnt? >> array_item ).repeat(1) ).maybe }
256
307
  #! array_items = array_item (*( sequence_combiner array_item ) /
257
308
  #! *( choice_combiner array_item ) )
258
- rule(:array_item) { repetition.maybe >> spcCmnt? >> array_item_types }
259
- #! array_item = [ repetition ] spcCmnt? array_item_types
260
- rule(:array_item_types) { type_rule | array_group }
261
- #! array_item_types = type_rule / array_group
309
+ rule(:array_item) { array_item_types >> spcCmnt? >> repetition.maybe }
310
+ #! array_item = array_item_types spcCmnt? [ repetition ]
311
+ rule(:array_item_types) { array_group | type_rule | explicit_type_choice }
312
+ #! array_item_types = array_group / type_rule / explicit_type_choice
262
313
  rule(:array_group) { ( str('(') >> spcCmnt? >> array_items.maybe >> spcCmnt? >> str(')') ).as(:group_rule) }
263
314
  #! array_group = "(" spcCmnt? [ array_items spcCmnt? ] ")"
264
315
  #!
@@ -269,10 +320,10 @@ module JCR
269
320
  ( spcCmnt? >> choice_combiner >> spcCmnt? >> group_item ).repeat(1) ).maybe }
270
321
  #! group_items = group_item (*( sequence_combiner group_item ) /
271
322
  #! *( choice_combiner group_item ) )
272
- rule(:group_item) { repetition.maybe >> spcCmnt? >> group_item_types }
273
- #! group_item = [ repetition ] spcCmnt? group_item_types
274
- rule(:group_item_types) { type_rule | member_rule | group_group }
275
- #! group_item_types = type_rule / member_rule / group_group
323
+ rule(:group_item) { group_item_types >> spcCmnt? >> repetition.maybe }
324
+ #! group_item = group_item_types spcCmnt? [ repetition ]
325
+ rule(:group_item_types) { group_group | member_rule | type_rule | explicit_type_choice }
326
+ #! group_item_types = group_group / member_rule / type_rule / explicit_type_choice
276
327
  rule(:group_group) { group_rule }
277
328
  #! group_group = group_rule
278
329
  #!
@@ -283,30 +334,39 @@ module JCR
283
334
  #! choice_combiner = spcCmnt? "|" spcCmnt?
284
335
  #!
285
336
 
286
- rule(:repetition) { optional | one_or_more | min_max_repetition | specific_repetition }
287
- #! repetition = optional / one_or_more / min_max_repetition /
288
- #! min_repetition / max_repetition /
289
- #! zero_or_more / specific_repetition
337
+ rule(:repetition) { str('@') >> spcCmnt? >> ( optional | one_or_more | zero_or_more |
338
+ min_max_repetition | specific_repetition ) }
339
+ #! repetition = "@" spcCmnt? ( optional / one_or_more / min_max_repetition /
340
+ #! min_repetition / max_repetition /
341
+ #! zero_or_more / specific_repetition )
290
342
  rule(:optional) { str('?').as(:optional) }
291
343
  #! optional = "?"
292
- rule(:one_or_more) { str('+').as(:one_or_more) }
293
- #! one_or_more = "+"
294
- #! zero_or_more = "*"
295
- rule(:min_max_repetition) { # This includes zero_or_more, min_only and max_only cases
296
- p_integer.maybe.as(:repetition_min) >> spcCmnt? >> str('*').as(:repetition_interval) >> spcCmnt? >> p_integer.maybe.as(:repetition_max) }
297
- #! min_max_repetition = min_repeat spcCmnt? "*" spcCmnt? max_repeat
298
- #! min_repetition = min_repeat spcCmnt? "*"
299
- #! max_repetition = "*" spcCmnt? max_repeat
300
- #! min_repeat = p_integer
301
- #! max_repeat = p_integer
302
- rule(:specific_repetition) { p_integer.as(:specific_repetition) }
303
- #! specific_repetition = p_integer
344
+ rule(:one_or_more) { str('+').as(:one_or_more) >> repetition_step.maybe }
345
+ #! one_or_more = "+" [ repetition_step ]
346
+ rule(:zero_or_more) { str('*').as(:zero_or_more) >> repetition_step.maybe }
347
+ #! zero_or_more = "*" [ repetition_step ]
348
+ rule(:min_max_repetition) { # This includes min_only and max_only cases
349
+ non_neg_integer.maybe.as(:repetition_min) >>
350
+ str("..").as(:repetition_interval) >>
351
+ non_neg_integer.maybe.as(:repetition_max) >>
352
+ repetition_step.maybe }
353
+ #! min_max_repetition = min_repeat ".." max_repeat [ repetition_step ]
354
+ #! min_repetition = min_repeat ".." [ repetition_step ]
355
+ #! max_repetition = ".." max_repeat [ repetition_step ]
356
+ #! min_repeat = non_neg_integer
357
+ #! max_repeat = non_neg_integer
358
+ rule(:specific_repetition) { non_neg_integer.as(:specific_repetition) }
359
+ #! specific_repetition = non_neg_integer
360
+ rule(:repetition_step) { str('%') >> non_neg_integer.as(:repetition_step) }
361
+ #! repetition_step = "%" non_neg_integer
304
362
  #!
305
363
 
306
- rule(:integer) { str('-').maybe >> match('[0-9]').repeat(1) }
307
- #! integer = ["-"] 1*DIGIT
308
- rule(:p_integer) { match('[0-9]').repeat(1) }
309
- #! p_integer = 1*DIGIT
364
+ rule(:integer) { str('0') | str('-').maybe >> pos_integer }
365
+ #! integer = "0" / ["-"] pos_integer
366
+ rule(:non_neg_integer) { str('0') | pos_integer }
367
+ #! non_neg_integer = "0" / pos_integer
368
+ rule(:pos_integer) { match('[1-9]') >> match('[0-9]').repeat }
369
+ #! pos_integer = digit1-9 *DIGIT
310
370
  #!
311
371
 
312
372
  rule(:float) { str('-').maybe >> match('[0-9]').repeat(1) >> str('.' ) >> match('[0-9]').repeat(1) }
@@ -361,8 +421,8 @@ module JCR
361
421
 
362
422
  class Transformer < Parslet::Transform
363
423
 
364
- rule(:rule_def=>simple(:primimitive_def)) { puts "found rule definition" }
365
- rule(:primimitive_def => simple(:x)) { puts "value sought is " + x }
424
+ rule(:rule_def=>simple(:primitive_def)) { puts "found rule definition" }
425
+ rule(:primitive_def => simple(:x)) { puts "value sought is " + x }
366
426
 
367
427
  end
368
428
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jcrvalidator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Newton
@@ -68,6 +68,7 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: 0.1.4
70
70
  description: A JSON Content Rules (JCR) Validator library and command line utility.
71
+ Version 0.6.x is closely following -07 of the draft.
71
72
  email: andy@arin.net
72
73
  executables:
73
74
  - jcr