open_ehr 0.6.1 → 0.9.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.
Files changed (115) hide show
  1. data/Gemfile +10 -2
  2. data/Gemfile.lock +58 -18
  3. data/Guardfile +2 -1
  4. data/History.txt +10 -3
  5. data/Manifest.txt +3 -5
  6. data/README.rdoc +36 -32
  7. data/Rakefile +1 -1
  8. data/VERSION +1 -1
  9. data/bin/adl_validator.rb +84 -0
  10. data/lib/open_ehr/am/archetype/constraint_model/primitive.rb +11 -7
  11. data/lib/open_ehr/am/archetype/constraint_model.rb +4 -16
  12. data/lib/open_ehr/am/archetype/ontology.rb +37 -6
  13. data/lib/open_ehr/am/archetype.rb +6 -7
  14. data/lib/open_ehr/am/open_ehr_profile/data_types/text.rb +5 -2
  15. data/lib/open_ehr/parser/adl.rb +19 -0
  16. data/lib/open_ehr/parser/adl_grammar.tt +155 -0
  17. data/lib/open_ehr/parser/adl_parser.rb +48 -0
  18. data/lib/open_ehr/parser/cadl_grammar.tt +803 -0
  19. data/lib/open_ehr/parser/dadl.rb +13 -0
  20. data/lib/open_ehr/parser/dadl_grammar.tt +358 -0
  21. data/lib/open_ehr/parser/exception.rb +68 -0
  22. data/lib/open_ehr/parser/scanner/adl_scanner.rb +819 -0
  23. data/lib/open_ehr/parser/shared_token_grammar.tt +1200 -0
  24. data/lib/open_ehr/parser/validator.rb +20 -0
  25. data/lib/open_ehr/parser.rb +16 -12
  26. data/lib/open_ehr.rb +1 -0
  27. data/open_ehr.gemspec +364 -0
  28. data/spec/lib/open_ehr/am/archetype/archetype_spec.rb +7 -2
  29. data/spec/lib/open_ehr/am/archetype/constraint_model/c_multiple_attribute_spec.rb +0 -6
  30. data/spec/lib/open_ehr/am/archetype/constraint_model/c_object_spec.rb +10 -10
  31. data/spec/lib/open_ehr/am/archetype/constraint_model/c_single_attribute_spec.rb +0 -6
  32. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_boolean_spec.rb +5 -0
  33. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_time_spec.rb +5 -0
  34. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_duration_spec.rb +5 -0
  35. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_integer_spec.rb +5 -0
  36. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_primitive_spec.rb +8 -6
  37. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_real_spec.rb +7 -2
  38. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_string_spec.rb +5 -0
  39. data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_time_spec.rb +5 -0
  40. data/spec/lib/open_ehr/am/archetype/ontology/archetype_ontology_spec.rb +27 -7
  41. data/spec/lib/open_ehr/am/archetype/ontology/archetype_term_spec.rb +3 -3
  42. data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.assumed_types.v1.adl +88 -0
  43. data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.basic_types.v1.adl +143 -0
  44. data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.basic_types_fail.v1.adl +50 -0
  45. data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.most_minimal.v1.adl +27 -0
  46. data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.structure_test1.v1.adl +46 -0
  47. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ACTION.imaging.v1.adl +275 -0
  48. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ACTION.referral.v1.adl +351 -0
  49. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl +765 -0
  50. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.auscultation.v1.adl +217 -0
  51. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl +134 -0
  52. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl +241 -0
  53. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl +321 -0
  54. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-chest.v1.adl +379 -0
  55. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl +577 -0
  56. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl +146 -0
  57. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl +176 -0
  58. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl +221 -0
  59. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic.v1.adl +139 -0
  60. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl +116 -0
  61. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl +420 -0
  62. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-uterus.v1.adl +293 -0
  63. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-COMPOSITION.discharge.v1draft.adl +53 -0
  64. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-COMPOSITION.encounter.v1draft.adl +45 -0
  65. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-EVALUATION.adverse.v1.adl +411 -0
  66. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-INSTRUCTION.medication.v1.adl +88 -0
  67. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-INSTRUCTION.referral.v1.adl +84 -0
  68. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl +492 -0
  69. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.follow_up.v1draft.adl +94 -0
  70. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.imaging.v1.adl +127 -0
  71. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.medication-formulation.v1.adl +457 -0
  72. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.medication.v1.adl +869 -0
  73. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.referral.v1.adl +494 -0
  74. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.apgar.v1.adl +545 -0
  75. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.blood_pressure.v1.adl +673 -0
  76. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl +166 -0
  77. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.findings.v1.adl +47 -0
  78. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.reason_for_encounter.v1.adl +51 -0
  79. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.summary.v1.adl +52 -0
  80. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.vital_signs.v1.adl +54 -0
  81. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-cadl_sample.v1.adl +9 -0
  82. data/spec/lib/open_ehr/parser/adl_parser_spec.rb +210 -0
  83. data/spec/lib/open_ehr/parser/base_spec.rb +19 -0
  84. data/spec/spec.opts +2 -1
  85. data/spec/spec_helper.rb +3 -0
  86. metadata +166 -52
  87. data/doc/README_rdoc.html +0 -148
  88. data/doc/created.rid +0 -2
  89. data/doc/images/brick.png +0 -0
  90. data/doc/images/brick_link.png +0 -0
  91. data/doc/images/bug.png +0 -0
  92. data/doc/images/bullet_black.png +0 -0
  93. data/doc/images/bullet_toggle_minus.png +0 -0
  94. data/doc/images/bullet_toggle_plus.png +0 -0
  95. data/doc/images/date.png +0 -0
  96. data/doc/images/find.png +0 -0
  97. data/doc/images/loadingAnimation.gif +0 -0
  98. data/doc/images/macFFBgHack.png +0 -0
  99. data/doc/images/package.png +0 -0
  100. data/doc/images/page_green.png +0 -0
  101. data/doc/images/page_white_text.png +0 -0
  102. data/doc/images/page_white_width.png +0 -0
  103. data/doc/images/plugin.png +0 -0
  104. data/doc/images/ruby.png +0 -0
  105. data/doc/images/tag_green.png +0 -0
  106. data/doc/images/wrench.png +0 -0
  107. data/doc/images/wrench_orange.png +0 -0
  108. data/doc/images/zoom.png +0 -0
  109. data/doc/index.html +0 -54
  110. data/doc/js/darkfish.js +0 -116
  111. data/doc/js/jquery.js +0 -32
  112. data/doc/js/quicksearch.js +0 -114
  113. data/doc/js/thickbox-compressed.js +0 -10
  114. data/doc/rdoc.css +0 -706
  115. data/lib/#open_ehr.rb# +0 -11
@@ -0,0 +1,803 @@
1
+ require 'shared_token_grammar'
2
+ require 'open_ehr/assumed_library_types'
3
+ require 'open_ehr/am/archetype/constraint_model'
4
+
5
+ module OpenEHR
6
+ module Parser
7
+ grammar CADL
8
+ # include SharedToken
9
+ # include OpenEHR::AssumedLibraryTypes
10
+ # include OpenEHR::AM::Archetype::ConstraintModel
11
+
12
+ rule V_CADL_TEXT
13
+ c_complex_object '' {
14
+ def value
15
+ c_complex_object.value
16
+ end
17
+ }
18
+ / assertions '' {
19
+ def value
20
+ assertions.value
21
+ end
22
+ }
23
+ end
24
+
25
+ rule c_complex_object
26
+ head:c_complex_object_head SYM_MATCHES SYM_START_CBLOCK body:c_complex_object_body SYM_END_CBLOCK {
27
+ def value
28
+ args = head.value
29
+ args[:path] ||= '/'
30
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
31
+ :lower => 1, :upper => 1)
32
+ args.update body.value
33
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
34
+ end
35
+ }
36
+ / c_complex_object_head '' {
37
+ def value
38
+ args = c_complex_object_head.value
39
+ args[:path] ||= '/'
40
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
41
+ :lower => 1, :upper => 1)
42
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(
43
+ c_complex_object_head.value)
44
+ end
45
+ }
46
+ end
47
+
48
+ rule c_complex_object_head
49
+ c_complex_object_id c_occurrences {
50
+ def value
51
+ c_complex_object_id.value.update c_occurrences.value
52
+ c_complex_object_id.value
53
+ end
54
+ }
55
+ / c_complex_object_id '' {
56
+ def value
57
+ c_complex_object_id.value
58
+ end
59
+ }
60
+ end
61
+
62
+ rule c_complex_object_id
63
+ ti:type_identifier lo:V_LOCAL_TERM_CODE_REF space {
64
+ def value
65
+ {:rm_type_name => ti.value,
66
+ :node_id => lo.value}
67
+ end
68
+ }
69
+ / ti:type_identifier space {
70
+ def value
71
+ {:rm_type_name => ti.value}
72
+ end
73
+ }
74
+ end
75
+
76
+ rule c_complex_object_body
77
+ c_any '' {
78
+ def value
79
+ {:any_allowed? => true}
80
+ end
81
+ }
82
+ / c_attributes '' {
83
+ def value
84
+ {:attributes => c_attributes.value,
85
+ :any_allowed? => false}
86
+ end
87
+ }
88
+ end
89
+
90
+ rule c_object
91
+ c_complex_object '' {
92
+ def value
93
+ c_complex_object.value
94
+ end
95
+ }
96
+ / archetype_slot '' {
97
+ def value
98
+ archetype_slot.value
99
+ end
100
+ }
101
+ / archetype_internal_ref '' {
102
+ def value
103
+ archetype_internal_ref.value
104
+ end
105
+ }
106
+ / constraint_ref '' {
107
+ def value
108
+ constraint_ref.value
109
+ end
110
+ }
111
+ / c_primitive_object '' {
112
+ def value
113
+ c_primitive_object.value
114
+ end
115
+ }
116
+ / V_C_DOMAIN_TYPE '' {
117
+ def value
118
+ p elemetns
119
+ end
120
+ }
121
+ # / ERR_V_C_DOMAIN_TYPE
122
+ end
123
+
124
+ rule archetype_internal_ref
125
+ SYM_USE_NODE type_identifier c_occurrences object_path {
126
+ def value
127
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef(
128
+ :rm_type_name => type_identifier.value,
129
+ :occurrences => c_occurrences.value,
130
+ :path => object_path.value)
131
+ end
132
+ }
133
+ / SYM_USE_NODE type_identifier object_path {
134
+ def value
135
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef(
136
+ :rm_type_name => type_identifier.value, :path => object_path)
137
+ end
138
+ }
139
+ end
140
+
141
+ rule archetype_slot
142
+ c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK {
143
+ def value
144
+ args = c_archetype_slot_head.value
145
+ args[:includes] = c_includes.value
146
+ args[:excludes] = c_excludes.value
147
+ args[:path] ||= '/'
148
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
149
+ end
150
+ }
151
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes SYM_END_CBLOCK {
152
+ def value
153
+ args = c_archetype_slot_head.value
154
+ args[:includes] = c_includes.value
155
+ args[:path] ||= '/'
156
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
157
+ end
158
+ }
159
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_excludes SYM_END_CBLOCK {
160
+ def value
161
+ args = c_archetype_slot_head.value
162
+ args[:excludes] = c_excludes.value
163
+ args[:path] ||= '/'
164
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
165
+ end
166
+ }
167
+ end
168
+
169
+ rule c_archetype_slot_head
170
+ c_archetype_slot_id white_space c_occurrences {
171
+ def value
172
+ args = c_archetype_slot_id.value
173
+ args[:occurrences] = c_occurrences.value
174
+ args
175
+ end
176
+ }
177
+ / c_archetype_slot_id white_space {
178
+ def value
179
+ c_archetype_slot_id.value
180
+ end
181
+ }
182
+ end
183
+
184
+ rule c_archetype_slot_id
185
+ SYM_ALLOW_ARCHETYPE type_identifier V_LOCAL_TERM_CODE_REF {
186
+ def value
187
+ {:rm_type_name => type_identifier.value,
188
+ :node_id => V_LOCAL_TERM_CODE_REF.value}
189
+ end
190
+ }
191
+ / SYM_ALLOW_ARCHETYPE type_identifier {
192
+ def value
193
+ {:rm_type_name => type_identifier.value}
194
+ end
195
+ }
196
+ end
197
+
198
+ rule c_primitive_object
199
+ c_primitive '' {
200
+ def value
201
+ c_primitive.value
202
+ end
203
+ }
204
+ end
205
+
206
+ rule c_primitive
207
+ c_integer '' {
208
+ def value
209
+ c_integer.value
210
+ end
211
+ }
212
+ / c_real '' {
213
+ def value
214
+ c_real.value
215
+ end
216
+ }
217
+ / c_date '' {
218
+ def value
219
+ c_date.value
220
+ end
221
+ }
222
+ / c_time '' {
223
+ def value
224
+ c_time.value
225
+ end
226
+ }
227
+ / c_date_time '' {
228
+ def value
229
+ c_date_time.value
230
+ end
231
+ }
232
+ / c_duration '' {
233
+ def value
234
+ c_duration.value
235
+ end
236
+ }
237
+ / c_string '' {
238
+ def value
239
+ c_string.value
240
+ end
241
+ }
242
+ / c_boolean '' {
243
+ def value
244
+ c_boolean.value
245
+ end
246
+ }
247
+ end
248
+
249
+ rule c_any
250
+ '*' space
251
+ end
252
+
253
+ rule c_attributes
254
+ c_attribute more_attr:(c_attribute)* {
255
+ def value
256
+ attributes.map {|c| c.value}
257
+ end
258
+
259
+ def attributes
260
+ [c_attribute] + more_attr.elements.map {|e| e.attribute}
261
+ end
262
+ }
263
+ end
264
+
265
+ rule c_attribute
266
+ c_attr_head c_attr_body {
267
+ def value
268
+ val = c_attr_head.value
269
+ val.children = c_attr_body.value
270
+ val
271
+ end
272
+ }
273
+ end
274
+
275
+ rule c_attr_head
276
+ id:(V_ATTRIBUTE_IDENTIFIER) white_space c_existence c_cardinality {
277
+ def value
278
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
279
+ :rm_attribute_name => id.value,
280
+ :path => '/' + id.value,
281
+ :existence => c_existence.value,
282
+ :cardinality => c_cardinality.value)
283
+ end
284
+ }
285
+ / id:V_ATTRIBUTE_IDENTIFIER white_space c_existence {
286
+ def value
287
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
288
+ :rm_attribute_name => id.value,
289
+ :path => '/' + id.value,
290
+ :existence => c_existence.value)
291
+ end
292
+ }
293
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space c_cardinality {
294
+ def value
295
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
296
+ :rm_attribute_name => id.value,
297
+ :path => '/' + id.value,
298
+ :cardinality => c_cardinality.value)
299
+ end
300
+ }
301
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space {
302
+ def value
303
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
304
+ :rm_attribute_name => id.value, :path => '/' + id.value)
305
+ end
306
+ }
307
+ end
308
+
309
+ rule c_attr_body
310
+ SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK {
311
+ def value
312
+ c_attr_values.value
313
+ end
314
+ }
315
+ end
316
+
317
+ rule c_attr_values
318
+ c_any '' {
319
+ def value
320
+ c_any.value
321
+ end
322
+ }
323
+ / c_object more_co:(c_object '')* {
324
+ def value
325
+ c_objects.map {|c| c.value}
326
+ end
327
+
328
+ def c_objects
329
+ [c_object] + more_co.elements.map {|e| e.c_object }
330
+ end
331
+ }
332
+ end
333
+
334
+ rule c_includes
335
+ SYM_INCLUDE assertions {
336
+ def value
337
+ assertions.value
338
+ end
339
+ }
340
+ end
341
+
342
+ rule c_excludes
343
+ SYM_EXCLUDE assertions {
344
+ def value
345
+ assertions.value
346
+ end
347
+ }
348
+ end
349
+
350
+ rule c_existence
351
+ SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK {
352
+ def value
353
+ existence_spec.value
354
+ end
355
+ }
356
+ end
357
+
358
+ rule existence_spec
359
+ lo:V_INTEGER SYM_ELLIPSIS up:V_INTEGER {
360
+ def value
361
+ OpenEHR::AssumedTypesLibrary::Interval.new(:lower => lo.value, :upper => up.value)
362
+ end
363
+ }
364
+ / V_INTEGER '' {
365
+ def value
366
+ OpenEHR::AssumedTypesLibrary::Interval.new(:lower => V_INTEGER.value, :upper => V_INTEGER.value)
367
+ end
368
+ }
369
+ end
370
+
371
+ rule c_cardinality
372
+ SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK {
373
+ def value
374
+ cardinality_spec.value
375
+ end
376
+ }
377
+ end
378
+
379
+ rule cardinality_spec
380
+ occurrence_spec ';' white_space SYM_ORDERED ';' white_space SYM_UNIQUE {
381
+ def value
382
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
383
+ :interval => occurrence_spec.value,
384
+ :is_unique => true,
385
+ :is_orderd => true)
386
+ end
387
+ }
388
+ / occurrence_spec ';' white_space SYM_ORDERED {
389
+ def value
390
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
391
+ :interval => occurrence_spec.value,
392
+ :is_orderd => true)
393
+ end
394
+ }
395
+ / occurrence_spec ';' white_space SYM_UNORDERD ';' white_space SYM_UNIQUE {
396
+ def value
397
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
398
+ :interval => occurrence_spec.value,
399
+ :is_unique => true,
400
+ :is_orderd => false)
401
+ end
402
+ }
403
+ / occurrence_spec ';' white_space SYM_UNORDERD {
404
+ def value
405
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
406
+ :interval => occurrence_spec.value,
407
+ :is_orderd => false)
408
+ end
409
+ }
410
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_ORDERED {
411
+ def value
412
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
413
+ :interval => occurrence_spec.value,
414
+ :is_unique => true,
415
+ :is_orderd => true)
416
+ end
417
+ }
418
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_UNORDERD {
419
+ def value
420
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
421
+ :interval => occurrence_spec.value,
422
+ :is_unique => true,
423
+ :is_ordered => false)
424
+ end
425
+ }
426
+ / occurrence_spec SYM_UNIQUE {
427
+ def value
428
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
429
+ :interval => occurrence_spec.value,
430
+ :is_unique => true)
431
+ end
432
+ }
433
+ end
434
+
435
+ rule c_occurrences
436
+ SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK {
437
+ def value
438
+ occurrence_spec.value
439
+ end
440
+ }
441
+ end
442
+
443
+ rule occurrence_spec
444
+ st:(V_INTEGER) SYM_ELLIPSIS ed:cardinality_limit_value {
445
+ def value
446
+ if ed.value == '*'
447
+ interval = OpenEHR::AssumedLibraryTypes::Interval.new(
448
+ :lower => st.value,
449
+ :upper_unbounded => true)
450
+ else
451
+ interval = OpenEHR::AssumedLibraryTypes::Interval.new(
452
+ :lower => st.value,
453
+ :upper => ed.value)
454
+ end
455
+ end
456
+ }
457
+ / cardinality_limit_value '' {
458
+ def value
459
+ OpenEHR::AssumedLibraryTypes::Interval.new(
460
+ :lower => cardinality_limit_value.value,
461
+ :upper => cardinality_limit_value.value)
462
+ end
463
+ }
464
+ end
465
+
466
+ rule cardinality_limit_value
467
+ integer_value {
468
+ def value
469
+ text_value.to_i
470
+ end
471
+ }
472
+ / '*' {
473
+ def value
474
+ '*'
475
+ end
476
+ }
477
+ end
478
+
479
+ rule c_integer_spec
480
+ cardinality_limit_value '' {
481
+ def value
482
+ cardinality_limit_value.value
483
+ end
484
+ }
485
+ / integer_list_value '' {
486
+ def value
487
+ integer_list_value.value
488
+ end
489
+ }
490
+ / integer_interval_value '' {
491
+ def value
492
+ integer_interval_value.value
493
+ end
494
+ }
495
+ / occurrence_spec {
496
+ def value
497
+ occurrence_spec.value
498
+ end
499
+ }
500
+ end
501
+
502
+ rule c_integer
503
+ c_integer_spec (';' integer_value)?
504
+ end
505
+
506
+ rule c_real_spec
507
+ real_value
508
+ / real_list_value
509
+ / real_interval_value
510
+ end
511
+
512
+ rule c_real
513
+ c_real_spec (';' real_value)?
514
+ end
515
+
516
+ rule c_date_constraint
517
+ V_ISO8601_DATE_CONSTRAINT_PATTERN
518
+ / date_value
519
+ / date_interval_value
520
+ end
521
+
522
+ rule c_date
523
+ c_date_constraint (';' date_value)?
524
+ end
525
+
526
+ rule c_time_constraint
527
+ V_ISO8601_TIME_CONSTRAINT_PATTERN
528
+ / time_value
529
+ / time_interval_value
530
+ end
531
+
532
+ rule c_time
533
+ c_time_constraint (';' time_value)?
534
+ end
535
+
536
+ rule c_date_time_constraint
537
+ V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
538
+ / date_time_value
539
+ / date_time_interval_value
540
+ end
541
+
542
+ rule c_date_time
543
+ c_date_time_constraint
544
+ / c_date_time_constraint ';' date_time_value
545
+ end
546
+
547
+ rule c_duration_constraint
548
+ duration_pattern ('/' duration_interval_pattern)?
549
+ / duration_value
550
+ / duration_interval_value
551
+ end
552
+
553
+ rule duration_pattern
554
+ V_ISO8601_TIME_CONSTRAINT_PATTERN
555
+ end
556
+
557
+ rule c_duration
558
+ c_duration_constraint (';' duration_value)?
559
+ end
560
+
561
+ rule c_string_spec
562
+ string_list_value ',' SYM_LIST_CONTINUE {
563
+ def value
564
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
565
+ :list => string_list_value.value)
566
+ end
567
+ }
568
+ / string_list_value '' {
569
+ def value
570
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
571
+ :list => string_list_value.value, :type => 'Boolean')
572
+ end
573
+ }
574
+ / pat:V_REGEXP '' {
575
+ def value
576
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
577
+ :pattern => pat.value, :type => 'Boolean')
578
+ end
579
+ }
580
+ / V_STRING '' {
581
+ def value
582
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
583
+ :list => [V_STRING.value])
584
+ end
585
+ }
586
+ end
587
+
588
+ rule c_string
589
+ c_string_spec (';' string_value)? {
590
+ def value
591
+ c_string_spec.value
592
+ end
593
+ }
594
+ end
595
+
596
+ rule c_boolean_spec
597
+ SYM_TRUE (',' SYM_FALSE)? {
598
+ }
599
+ / SYM_FALSE (',' SYM_TRUE)?
600
+ end
601
+
602
+ rule c_boolean
603
+ c_boolean_spec ';' boolean_value {
604
+ def value
605
+ c_boolean_spec.value
606
+ end
607
+ }
608
+ / c_boolean_spec '' {
609
+ def value
610
+ c_boolean_spec.value
611
+ end
612
+ }
613
+ end
614
+
615
+ rule constraint_ref
616
+ V_LOCAL_TERM_CODE_REF '' {
617
+ def value
618
+ V_LOCAL_TERM_CODE_REF.value
619
+ end
620
+ }
621
+ end
622
+
623
+ rule V_REGEXP
624
+ (('=' / '!') '~')? (('/' ('\/' / !'/' .)* '/') / ('^' (!'^' .)* '^') ) {
625
+ def value
626
+ text_value
627
+ end
628
+ }
629
+ end
630
+
631
+ rule V_C_DOMAIN_TYPE
632
+ '('? [A-Z] IDCHAR* ')'? [ \n]* '<' [^>]* '>'
633
+ end
634
+
635
+ # assertion block
636
+
637
+ rule V_ASSERTION_TEXT
638
+ assertions '' {
639
+ def value
640
+ assertions.value
641
+ end
642
+ }
643
+ end
644
+
645
+ rule assertions
646
+ assertion more_a:(assertion '')* {
647
+ def value
648
+ assertions.map {|a| a.value}
649
+ end
650
+
651
+ def assertions
652
+ [assertion] + more_a.elements.map {|a| a.assertion}
653
+ end
654
+ }
655
+ end
656
+
657
+ rule assertion
658
+ id:(any_identifier ':')? boolean_expression space {
659
+ def value
660
+ if (id && !id.empty?)
661
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
662
+ :tag => id.value, :expression => boolean_expression.value)
663
+ else
664
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
665
+ :expression => boolean_expression.value)
666
+ end
667
+ end
668
+ }
669
+ end
670
+
671
+ rule boolean_expression
672
+ boolean_node '' {
673
+ def value
674
+ boolean_node.value
675
+ end
676
+ }
677
+ end
678
+
679
+ rule boolean_node
680
+ SYM_EXISTS absolute_path {
681
+ def value
682
+ {:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXISTS,
683
+ :path => absolute_path.value }
684
+ end
685
+ }
686
+ / relative_path white_space SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK {
687
+ def value
688
+ OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
689
+ :item => c_primitive.value,
690
+ :type => c_primitive.value.type,
691
+ :path => relative_path.value,
692
+ :reference_type => 'constraint')
693
+ end
694
+ }
695
+ / SYM_NOT boolean_leaf {
696
+ def value
697
+ boolean_leaf.value
698
+ end
699
+ }
700
+ / arithmetic_expression (SYM_EQ / SYM_NE / SYM_LT / SYM_GT / SYM_LE / SYM_GE) arithmetic_expression {
701
+ def value
702
+ p elements
703
+ end
704
+ }
705
+ / boolean_leaf ((SYM_AND / SYM_OR / SYM_XOR / SYM_IMPLIES) boolean_leaf)? {
706
+ def value
707
+ p elements
708
+ end
709
+ }
710
+ end
711
+
712
+ rule boolean_leaf
713
+ '(' boolean_expression ')' {
714
+ def value
715
+ boolean_expression.value
716
+ end
717
+ }
718
+ / SYM_TRUE {
719
+ def value
720
+ true
721
+ end
722
+ }
723
+ / SYM_FALSE {
724
+ def value
725
+ false
726
+ end
727
+ }
728
+ end
729
+
730
+ rule arithmetic_expression
731
+ arithmetic_node '' {
732
+ def value
733
+ arithmetic_node.value
734
+ end
735
+ }
736
+ end
737
+
738
+ rule arithmetic_node
739
+ arithmetic_leaf (('+' / '-' / '*' / '/' / '^') arithmetic_leaf)*
740
+ end
741
+
742
+ rule arithmetic_leaf
743
+ '(' arithmetic_expression ')' {
744
+ def value
745
+ arithmetic_expression.value
746
+ end
747
+ }
748
+ / integer_value '' {
749
+ def value
750
+ integer_value.value
751
+ end
752
+ }
753
+ / real_value '' {
754
+ def value
755
+ real_value.value
756
+ end
757
+ }
758
+ / absolute_path '' {
759
+ def value
760
+ absolute_path.value
761
+ end
762
+ }
763
+ end
764
+
765
+ # path block
766
+ rule movable_path
767
+ SYM_MOVABLE_LEADER relative_path {
768
+ def value
769
+ text_value
770
+ end
771
+ }
772
+ end
773
+
774
+ rule absolute_path
775
+ '/' relative_path? {
776
+ def value
777
+ text_value
778
+ end
779
+ }
780
+ end
781
+
782
+ rule relative_path
783
+ path_segment ('/' path_segment)* {
784
+ def value
785
+ text_value
786
+ end
787
+ }
788
+ end
789
+
790
+ rule path_segment
791
+ V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF? {
792
+ def value
793
+ text_value
794
+ end
795
+ }
796
+ end
797
+
798
+ rule SYM_MOVABLE_LEADER
799
+ '//'
800
+ end
801
+ end
802
+ end
803
+ end