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.
- data/Gemfile +10 -2
- data/Gemfile.lock +58 -18
- data/Guardfile +2 -1
- data/History.txt +10 -3
- data/Manifest.txt +3 -5
- data/README.rdoc +36 -32
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/bin/adl_validator.rb +84 -0
- data/lib/open_ehr/am/archetype/constraint_model/primitive.rb +11 -7
- data/lib/open_ehr/am/archetype/constraint_model.rb +4 -16
- data/lib/open_ehr/am/archetype/ontology.rb +37 -6
- data/lib/open_ehr/am/archetype.rb +6 -7
- data/lib/open_ehr/am/open_ehr_profile/data_types/text.rb +5 -2
- data/lib/open_ehr/parser/adl.rb +19 -0
- data/lib/open_ehr/parser/adl_grammar.tt +155 -0
- data/lib/open_ehr/parser/adl_parser.rb +48 -0
- data/lib/open_ehr/parser/cadl_grammar.tt +803 -0
- data/lib/open_ehr/parser/dadl.rb +13 -0
- data/lib/open_ehr/parser/dadl_grammar.tt +358 -0
- data/lib/open_ehr/parser/exception.rb +68 -0
- data/lib/open_ehr/parser/scanner/adl_scanner.rb +819 -0
- data/lib/open_ehr/parser/shared_token_grammar.tt +1200 -0
- data/lib/open_ehr/parser/validator.rb +20 -0
- data/lib/open_ehr/parser.rb +16 -12
- data/lib/open_ehr.rb +1 -0
- data/open_ehr.gemspec +364 -0
- data/spec/lib/open_ehr/am/archetype/archetype_spec.rb +7 -2
- data/spec/lib/open_ehr/am/archetype/constraint_model/c_multiple_attribute_spec.rb +0 -6
- data/spec/lib/open_ehr/am/archetype/constraint_model/c_object_spec.rb +10 -10
- data/spec/lib/open_ehr/am/archetype/constraint_model/c_single_attribute_spec.rb +0 -6
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_boolean_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_date_time_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_duration_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_integer_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_primitive_spec.rb +8 -6
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_real_spec.rb +7 -2
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_string_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/constraint_model/primitive/c_time_spec.rb +5 -0
- data/spec/lib/open_ehr/am/archetype/ontology/archetype_ontology_spec.rb +27 -7
- data/spec/lib/open_ehr/am/archetype/ontology/archetype_term_spec.rb +3 -3
- data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.assumed_types.v1.adl +88 -0
- data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.basic_types.v1.adl +143 -0
- data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.basic_types_fail.v1.adl +50 -0
- data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.most_minimal.v1.adl +27 -0
- data/spec/lib/open_ehr/parser/adl/adl-test-ENTRY.structure_test1.v1.adl +46 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ACTION.imaging.v1.adl +275 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ACTION.referral.v1.adl +351 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl +765 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.auscultation.v1.adl +217 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl +134 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.dimensions.v1.adl +241 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl +321 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-chest.v1.adl +379 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-fetus.v1.adl +577 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl +146 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl +176 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl +221 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-generic.v1.adl +139 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl +116 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl +420 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.exam-uterus.v1.adl +293 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-COMPOSITION.discharge.v1draft.adl +53 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-COMPOSITION.encounter.v1draft.adl +45 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-EVALUATION.adverse.v1.adl +411 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-INSTRUCTION.medication.v1.adl +88 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-INSTRUCTION.referral.v1.adl +84 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl +492 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.follow_up.v1draft.adl +94 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.imaging.v1.adl +127 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.medication-formulation.v1.adl +457 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.medication.v1.adl +869 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-ITEM_TREE.referral.v1.adl +494 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.apgar.v1.adl +545 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.blood_pressure.v1.adl +673 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl +166 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.findings.v1.adl +47 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.reason_for_encounter.v1.adl +51 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.summary.v1.adl +52 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-SECTION.vital_signs.v1.adl +54 -0
- data/spec/lib/open_ehr/parser/adl/openEHR-EHR-cadl_sample.v1.adl +9 -0
- data/spec/lib/open_ehr/parser/adl_parser_spec.rb +210 -0
- data/spec/lib/open_ehr/parser/base_spec.rb +19 -0
- data/spec/spec.opts +2 -1
- data/spec/spec_helper.rb +3 -0
- metadata +166 -52
- data/doc/README_rdoc.html +0 -148
- data/doc/created.rid +0 -2
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -54
- data/doc/js/darkfish.js +0 -116
- data/doc/js/jquery.js +0 -32
- data/doc/js/quicksearch.js +0 -114
- data/doc/js/thickbox-compressed.js +0 -10
- data/doc/rdoc.css +0 -706
- 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
|