open_ehr 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/Gemfile.lock +22 -20
  2. data/README.rdoc +4 -3
  3. data/Rakefile +0 -5
  4. data/VERSION +1 -1
  5. data/lib/open_ehr/parser/adl_grammar.tt +30 -23
  6. data/lib/open_ehr/parser/cadl_grammar.tt +85 -59
  7. data/lib/open_ehr/parser/cadl_node.rb +18 -0
  8. data/lib/open_ehr/parser/dadl_grammar.tt +1 -1
  9. data/lib/open_ehr/parser/shared_token_grammar.tt +4 -4
  10. data/open_ehr.gemspec +104 -55
  11. data/spec/lib/open_ehr/parser/{adl → adl14}/adl-test-ENTRY.assumed_types.v1.adl +0 -0
  12. data/spec/lib/open_ehr/parser/{adl → adl14}/adl-test-ENTRY.basic_types.v1.adl +0 -0
  13. data/spec/lib/open_ehr/parser/{adl → adl14}/adl-test-ENTRY.basic_types_fail.v1.adl +0 -0
  14. data/spec/lib/open_ehr/parser/{adl → adl14}/adl-test-ENTRY.most_minimal.v1.adl +0 -0
  15. data/spec/lib/open_ehr/parser/{adl → adl14}/adl-test-ENTRY.structure_test1.v1.adl +0 -0
  16. data/spec/lib/open_ehr/parser/adl14/adl-test-SOME_TYPE.generic_type_basic.draft.adl +56 -0
  17. data/spec/lib/open_ehr/parser/adl14/adl-test-SOME_TYPE.generic_type_use_node.draft.adl +63 -0
  18. data/spec/lib/open_ehr/parser/adl14/adl-test-car.paths.test.adl +80 -0
  19. data/spec/lib/open_ehr/parser/adl14/adl-test-car.use_node.test.adl +87 -0
  20. data/spec/lib/open_ehr/parser/adl14/adl-test-composition.dv_coded_text.test.adl +29 -0
  21. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_bindings.test.adl +47 -0
  22. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_desc_missing_purpose.test.adl +45 -0
  23. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_description.test.adl +61 -0
  24. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_description2.test.adl +45 -0
  25. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_identification.test.adl +26 -0
  26. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_internal_ref.test.adl +36 -0
  27. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_internal_ref2.test.adl +36 -0
  28. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language.test.adl +47 -0
  29. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language_no_accreditation.test.adl +38 -0
  30. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_language_order_of_translation_details.test.adl +40 -0
  31. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_ontology.test.adl +25 -0
  32. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test.adl +40 -0
  33. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_slot.test2.adl +37 -0
  34. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.archetype_uncommonkeys.test.adl +29 -0
  35. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.basic_types.test.adl +272 -0
  36. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_code_phrase.test.adl +77 -0
  37. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_ordinal.test.adl +66 -0
  38. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_empty.test.adl +46 -0
  39. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_full.test.adl +64 -0
  40. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_full2.test.adl +64 -0
  41. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_full3.test.adl +64 -0
  42. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_item_units_only.test.adl +55 -0
  43. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_list.test.adl +58 -0
  44. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_property.test.adl +47 -0
  45. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.c_dv_quantity_reversed.test.adl +59 -0
  46. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.constraint_binding.test.adl +37 -0
  47. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.constraint_ref.test.adl +43 -0
  48. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.datetime.test.adl +183 -0
  49. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.domain_types.test.adl +97 -0
  50. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.durations.test.adl +111 -0
  51. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.empty_other_contributors.test.adl +42 -0
  52. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.missing_language.test.adl +23 -0
  53. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.mixed_node_types.draft.adl +61 -0
  54. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.most_minimal.test.adl +23 -0
  55. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.multi_language.test.adl +52 -0
  56. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.special_string.test.adl +88 -0
  57. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.structure_test1.test.adl +45 -0
  58. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.structure_test2.test.adl +45 -0
  59. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.term_binding.test.adl +37 -0
  60. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.term_binding2.test.adl +32 -0
  61. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.testtranslations.test.adl +83 -0
  62. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.translations_author_language.test.adl +34 -0
  63. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.translations_language_author.test.adl +34 -0
  64. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.unicode_BOM_support.test.adl +41 -0
  65. data/spec/lib/open_ehr/parser/adl14/adl-test-entry.unicode_support.test.adl +41 -0
  66. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ACTION.imaging.v1.adl +0 -0
  67. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ACTION.referral.v1.adl +0 -0
  68. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl +0 -0
  69. data/spec/lib/open_ehr/parser/adl14/openEHR-EHR-CLUSTER.auscultation.v1.adl +48 -0
  70. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl +0 -0
  71. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.dimensions.v1.adl +0 -0
  72. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl +0 -0
  73. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-chest.v1.adl +0 -0
  74. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-fetus.v1.adl +0 -0
  75. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl +0 -0
  76. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl +0 -0
  77. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl +0 -0
  78. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-generic.v1.adl +0 -0
  79. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl +0 -0
  80. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl +0 -0
  81. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-CLUSTER.exam-uterus.v1.adl +0 -0
  82. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-COMPOSITION.discharge.v1draft.adl +0 -0
  83. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-COMPOSITION.encounter.v1draft.adl +0 -0
  84. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-EVALUATION.adverse.v1.adl +0 -0
  85. data/spec/lib/open_ehr/parser/adl14/openEHR-EHR-EVALUATION.columna_vertebral.v1.adl +85 -0
  86. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-INSTRUCTION.medication.v1.adl +0 -0
  87. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-INSTRUCTION.referral.v1.adl +0 -0
  88. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl +0 -0
  89. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.follow_up.v1draft.adl +0 -0
  90. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.imaging.v1.adl +0 -0
  91. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.medication-formulation.v1.adl +0 -0
  92. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.medication.v1.adl +0 -0
  93. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-ITEM_TREE.referral.v1.adl +0 -0
  94. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-OBSERVATION.apgar.v1.adl +0 -0
  95. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-OBSERVATION.blood_pressure.v1.adl +0 -0
  96. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl +0 -0
  97. data/spec/lib/open_ehr/parser/adl14/openEHR-EHR-OBSERVATION.testassumedvalue.v1.adl +99 -0
  98. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-SECTION.findings.v1.adl +0 -0
  99. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-SECTION.reason_for_encounter.v1.adl +0 -0
  100. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-SECTION.summary.v1.adl +0 -0
  101. data/spec/lib/open_ehr/parser/{adl → adl14}/openEHR-EHR-SECTION.vital_signs.v1.adl +0 -0
  102. data/spec/lib/open_ehr/parser/adl_parser_spec.rb +2 -2
  103. data/spec/lib/open_ehr/parser/adl_path_spec.rb +180 -0
  104. metadata +132 -83
  105. data/bin/adl_validator.rb +0 -84
  106. data/lib/open_ehr/parser/scanner/adl_scanner.rb +0 -819
  107. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-CLUSTER.auscultation.v1.adl +0 -217
  108. data/spec/lib/open_ehr/parser/adl/openEHR-EHR-cadl_sample.v1.adl +0 -9
  109. data/spec/rcov.opts +0 -1
data/Gemfile.lock CHANGED
@@ -1,44 +1,46 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.1.0)
4
+ activesupport (3.1.1)
5
5
  multi_json (~> 1.0)
6
6
  archive-tar-minitar (0.5.2)
7
7
  builder (3.0.0)
8
8
  columnize (0.3.4)
9
9
  diff-lcs (1.1.3)
10
- ffi (1.0.9)
10
+ ffi (1.0.10)
11
11
  git (1.2.5)
12
- guard (0.8.4)
12
+ guard (0.8.8)
13
13
  thor (~> 0.14.6)
14
- guard-rspec (0.4.5)
15
- guard (>= 0.4.0)
16
- guard-spork (0.3.0)
17
- guard (>= 0.8.2)
14
+ guard-rspec (0.5.2)
15
+ guard (>= 0.8.4)
16
+ guard-spork (0.3.1)
17
+ guard (>= 0.8.4)
18
18
  spork (>= 0.8.4)
19
19
  i18n (0.6.0)
20
20
  jeweler (1.6.4)
21
21
  bundler (~> 1.0)
22
22
  git (>= 1.2.5)
23
23
  rake
24
- libnotify (0.5.7)
24
+ json (1.6.1)
25
+ libnotify (0.5.9)
25
26
  linecache19 (0.5.12)
26
27
  ruby_core_source (>= 0.1.4)
27
28
  locale (2.0.5)
28
29
  multi_json (1.0.3)
29
- polyglot (0.3.2)
30
- rake (0.9.2)
30
+ polyglot (0.3.3)
31
+ rake (0.9.2.2)
31
32
  rb-inotify (0.8.8)
32
33
  ffi (>= 0.5.0)
33
- rdoc (3.9.4)
34
- rspec (2.6.0)
35
- rspec-core (~> 2.6.0)
36
- rspec-expectations (~> 2.6.0)
37
- rspec-mocks (~> 2.6.0)
38
- rspec-core (2.6.4)
39
- rspec-expectations (2.6.0)
34
+ rdoc (3.11)
35
+ json (~> 1.4)
36
+ rspec (2.7.0)
37
+ rspec-core (~> 2.7.0)
38
+ rspec-expectations (~> 2.7.0)
39
+ rspec-mocks (~> 2.7.0)
40
+ rspec-core (2.7.1)
41
+ rspec-expectations (2.7.0)
40
42
  diff-lcs (~> 1.1.2)
41
- rspec-mocks (2.6.0)
43
+ rspec-mocks (2.7.0)
42
44
  ruby-debug-base19 (0.11.25)
43
45
  columnize (>= 0.3.1)
44
46
  linecache19 (>= 0.5.11)
@@ -49,7 +51,7 @@ GEM
49
51
  ruby-debug-base19 (>= 0.11.19)
50
52
  ruby_core_source (0.1.5)
51
53
  archive-tar-minitar (>= 0.5.2)
52
- simplecov (0.5.3)
54
+ simplecov (0.5.4)
53
55
  multi_json (~> 1.0.3)
54
56
  simplecov-html (~> 0.5.3)
55
57
  simplecov-html (0.5.3)
@@ -58,7 +60,7 @@ GEM
58
60
  treetop (1.4.10)
59
61
  polyglot
60
62
  polyglot (>= 0.3.1)
61
- xml-simple (1.1.0)
63
+ xml-simple (1.1.1)
62
64
 
63
65
  PLATFORMS
64
66
  ruby
data/README.rdoc CHANGED
@@ -40,10 +40,12 @@ Terminology and Demographic server will be implemented in other
40
40
  project.
41
41
 
42
42
  = Authors
43
+ * Main codes
43
44
  Akimichi Tatsukawa, Shinji Kobayashi
44
-
45
45
  openEHR.jp, <http://openehr.jp>
46
46
 
47
+ * ADL parser test cases are derived from Java and Eiffel.
48
+
47
49
  = Copyright
48
50
  The software, including all files in this directory and
49
51
  subdirectories is copyrighted to the original authors and
@@ -66,5 +68,4 @@ Public licence (MPL), and the Free Software Foundation GNU General
66
68
  Public Licence (GPL) and Lesser GNU General Public Licence (LGPL). See
67
69
  the Mozilla relicensing FAQ for details of this license. This in no
68
70
  way constrains the way in which software created by other
69
- organisations is licenced.
70
-
71
+ organisations is licenced.
data/Rakefile CHANGED
@@ -31,11 +31,6 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
31
31
  spec.pattern = FileList['spec/**/*_spec.rb']
32
32
  end
33
33
 
34
- RSpec::Core::RakeTask.new(:rcov) do |spec|
35
- spec.pattern = 'spec/**/*_spec.rb'
36
- spec.rcov = true
37
- end
38
-
39
34
  task :default => :spec
40
35
 
41
36
  require 'rdoc/task'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1
1
+ 0.9.2
@@ -13,10 +13,10 @@ module OpenEHR
13
13
 
14
14
  rule archetype
15
15
  arch_identification
16
- arch_specialisation?
16
+ spec:(arch_specialisation)?
17
17
  arch_concept
18
- arch_language?
19
- arch_description?
18
+ lang:(arch_language)?
19
+ desc:(arch_description)?
20
20
  arch_definition
21
21
  arch_invariant?
22
22
  arch_ontology {
@@ -33,15 +33,15 @@ module OpenEHR
33
33
  end
34
34
 
35
35
  def original_language
36
- elements[3].original_language
36
+ lang.original_language
37
37
  end
38
38
 
39
39
  def translations
40
- elements[3].translations
40
+ lang.translations
41
41
  end
42
42
 
43
43
  def description
44
- elements[4].values
44
+ desc.values unless desc.empty?
45
45
  end
46
46
 
47
47
  def definition
@@ -61,48 +61,55 @@ module OpenEHR
61
61
  end
62
62
 
63
63
  def adl_version
64
- head.adl_version
64
+ head.value[:adl_version]
65
65
  end
66
+
67
+ def is_controlled?
68
+ head.value[:is_controlled?]
69
+ end
66
70
  }
67
71
  end
68
72
 
69
73
  rule arch_head
70
- SYM_ARCHETYPE m:arch_meta_data? {
71
- def adl_version
72
- m.adl_version
74
+ SYM_ARCHETYPE m:arch_meta_data {
75
+ def value
76
+ m.value
73
77
  end
74
78
  }
79
+ / SYM_ARCHETYPE {
80
+ def value
81
+ Hash.new
82
+ end
83
+ }
75
84
  end
76
85
 
77
86
  rule arch_meta_data
78
87
  '(' arch_meta_data_items ')' space {
79
- def adl_version
80
- arch_meta_data_items.adl_version
88
+ def value
89
+ arch_meta_data_items.value
81
90
  end
82
91
  }
83
92
  end
84
93
 
85
94
  rule arch_meta_data_items
86
- item:arch_meta_data_item (';' other_item:arch_meta_data_item)* {
87
- def adl_version
88
- item.adl_version
89
- end
90
-
91
- def is_controled?
92
- item.is_controled? or other_item.map {|i| i.is_controled}
95
+ item:arch_meta_data_item other_item:(';' arch_meta_data_item)* {
96
+ def value
97
+ v = item.value
98
+ other_item.elements.map {|i| i.arch_meta_data_item.value}
99
+ v
93
100
  end
94
101
  }
95
102
  end
96
103
 
97
104
  rule arch_meta_data_item
98
105
  SYM_ADL_VERSION SYM_EQ V_VERSION_STRING space {
99
- def adl_version
100
- elements[2].text_value
106
+ def value
107
+ {:adl_version => elements[2].text_value}
101
108
  end
102
109
  }
103
110
  / SYM_IS_CONTROLED space {
104
- def is_controled?
105
- true if elements[0]
111
+ def value
112
+ {:is_controled? => true} # if elements[0]
106
113
  end
107
114
  }
108
115
  end
@@ -1,17 +1,16 @@
1
1
  require 'shared_token_grammar'
2
2
  require 'open_ehr/assumed_library_types'
3
3
  require 'open_ehr/am/archetype/constraint_model'
4
+ require 'cadl_node'
4
5
 
5
6
  module OpenEHR
6
7
  module Parser
7
8
  grammar CADL
8
- # include SharedToken
9
- # include OpenEHR::AssumedLibraryTypes
10
- # include OpenEHR::AM::Archetype::ConstraintModel
9
+ # include OpenEHR::Parser::CADL
11
10
 
12
11
  rule V_CADL_TEXT
13
12
  c_complex_object '' {
14
- def value
13
+ def value
15
14
  c_complex_object.value
16
15
  end
17
16
  }
@@ -24,23 +23,33 @@ module OpenEHR
24
23
 
25
24
  rule c_complex_object
26
25
  head:c_complex_object_head SYM_MATCHES SYM_START_CBLOCK body:c_complex_object_body SYM_END_CBLOCK {
27
- def value
26
+ def value(node = ArchetypeNode.new)
28
27
  args = head.value
29
- args[:path] ||= '/'
30
28
  args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
31
29
  :lower => 1, :upper => 1)
32
- args.update body.value
30
+ node.id = args[:node_id]
31
+ if node.root?
32
+ args[:path] = '/'
33
+ else
34
+ args[:path] = node.path + '[' + args[:node_id] + ']'
35
+ end
36
+ args.update body.value(node)
33
37
  OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
34
38
  end
35
39
  }
36
40
  / c_complex_object_head '' {
37
- def value
41
+ def value(node = ArchetypeNode.new)
38
42
  args = c_complex_object_head.value
39
- args[:path] ||= '/'
40
43
  args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
41
44
  :lower => 1, :upper => 1)
42
- OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(
43
- c_complex_object_head.value)
45
+ if node.root?
46
+ node.path = '/'
47
+ else
48
+ node.id = args[:node_id]
49
+ p args[:rm_type_name]
50
+ node.path += '[' + args[:node_id] + ']'
51
+ end
52
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
44
53
  end
45
54
  }
46
55
  end
@@ -75,13 +84,13 @@ module OpenEHR
75
84
 
76
85
  rule c_complex_object_body
77
86
  c_any '' {
78
- def value
87
+ def value(node)
79
88
  {:any_allowed? => true}
80
89
  end
81
90
  }
82
91
  / c_attributes '' {
83
- def value
84
- {:attributes => c_attributes.value,
92
+ def value(node = nil)
93
+ {:attributes => c_attributes.value(node),
85
94
  :any_allowed? => false}
86
95
  end
87
96
  }
@@ -89,32 +98,32 @@ module OpenEHR
89
98
 
90
99
  rule c_object
91
100
  c_complex_object '' {
92
- def value
93
- c_complex_object.value
101
+ def value(node)
102
+ c_complex_object.value(node)
94
103
  end
95
104
  }
96
105
  / archetype_slot '' {
97
- def value
98
- archetype_slot.value
106
+ def value(node)
107
+ archetype_slot.value(node)
99
108
  end
100
109
  }
101
110
  / archetype_internal_ref '' {
102
- def value
103
- archetype_internal_ref.value
111
+ def value(node = nil)
112
+ archetype_internal_ref.value(node)
104
113
  end
105
114
  }
106
115
  / constraint_ref '' {
107
- def value
116
+ def value(node = nil)
108
117
  constraint_ref.value
109
118
  end
110
119
  }
111
120
  / c_primitive_object '' {
112
- def value
121
+ def value(node = nil)
113
122
  c_primitive_object.value
114
123
  end
115
124
  }
116
125
  / V_C_DOMAIN_TYPE '' {
117
- def value
126
+ def value(node = nil)
118
127
  p elemetns
119
128
  end
120
129
  }
@@ -122,45 +131,50 @@ module OpenEHR
122
131
  end
123
132
 
124
133
  rule archetype_internal_ref
125
- SYM_USE_NODE type_identifier c_occurrences object_path {
126
- def value
127
- OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef(
134
+ SYM_USE_NODE type_identifier c_occurrences object_path space {
135
+ def value(node)
136
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
128
137
  :rm_type_name => type_identifier.value,
129
138
  :occurrences => c_occurrences.value,
130
- :path => object_path.value)
139
+ :path => node.path,
140
+ :target_path => object_path.value)
131
141
  end
132
142
  }
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)
143
+ / SYM_USE_NODE type_identifier object_path space {
144
+ def value(node = nil)
145
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
146
+ :rm_type_name => type_identifier.value,
147
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
148
+ :lower => 1, :upper => 1),
149
+ :path => node.path,
150
+ :target_path => object_path.value)
137
151
  end
138
152
  }
139
153
  end
140
154
 
141
155
  rule archetype_slot
142
156
  c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK {
143
- def value
157
+ def value(node = nil)
144
158
  args = c_archetype_slot_head.value
145
159
  args[:includes] = c_includes.value
146
160
  args[:excludes] = c_excludes.value
147
- args[:path] ||= '/'
161
+ args[:path] = node.path
148
162
  OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
149
163
  end
150
164
  }
151
165
  / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes SYM_END_CBLOCK {
152
- def value
166
+ def value(node = nil)
153
167
  args = c_archetype_slot_head.value
154
168
  args[:includes] = c_includes.value
155
- args[:path] ||= '/'
169
+ args[:path] = node.path
156
170
  OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
157
171
  end
158
172
  }
159
173
  / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_excludes SYM_END_CBLOCK {
160
- def value
174
+ def value(node = nil)
161
175
  args = c_archetype_slot_head.value
162
176
  args[:excludes] = c_excludes.value
163
- args[:path] ||= '/'
177
+ args[:path] = node.path
164
178
  OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
165
179
  end
166
180
  }
@@ -251,22 +265,24 @@ module OpenEHR
251
265
  end
252
266
 
253
267
  rule c_attributes
254
- c_attribute more_attr:(c_attribute)* {
255
- def value
256
- attributes.map {|c| c.value}
268
+ c_attribute more_attr:(c_attribute white_space)* {
269
+ def value(node)
270
+ attributes.map {|c| c.value(node)}
257
271
  end
258
272
 
259
273
  def attributes
260
- [c_attribute] + more_attr.elements.map {|e| e.attribute}
274
+ [c_attribute] + more_attr.elements.map {|e| e.c_attribute}
261
275
  end
262
276
  }
263
277
  end
264
278
 
265
279
  rule c_attribute
266
280
  c_attr_head c_attr_body {
267
- def value
268
- val = c_attr_head.value
269
- val.children = c_attr_body.value
281
+ def value(node)
282
+ val = c_attr_head.value(node)
283
+ child_node = ArchetypeNode.new(node)
284
+ child_node.path = val.path
285
+ val.children = c_attr_body.value(child_node)
270
286
  val
271
287
  end
272
288
  }
@@ -274,55 +290,59 @@ module OpenEHR
274
290
 
275
291
  rule c_attr_head
276
292
  id:(V_ATTRIBUTE_IDENTIFIER) white_space c_existence c_cardinality {
277
- def value
293
+ def value(node)
294
+ path = (node.root? ? '/' : (node.path + "[#{node.id}]" + '/')) + id.value
278
295
  OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
279
296
  :rm_attribute_name => id.value,
280
- :path => '/' + id.value,
297
+ :path => path,
281
298
  :existence => c_existence.value,
282
299
  :cardinality => c_cardinality.value)
283
300
  end
284
301
  }
285
302
  / id:V_ATTRIBUTE_IDENTIFIER white_space c_existence {
286
- def value
303
+ def value(node)
304
+ path = (node.root? ? '/' : (node.path + "[#{node.id}]" + '/')) + id.value
287
305
  OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
288
306
  :rm_attribute_name => id.value,
289
- :path => '/' + id.value,
307
+ :path => path,
290
308
  :existence => c_existence.value)
291
309
  end
292
310
  }
293
311
  / id:(V_ATTRIBUTE_IDENTIFIER) white_space c_cardinality {
294
- def value
312
+ def value(node)
313
+ path = (node.root? ? '/' : (node.path + "[#{node.id}]" + '/')) + id.value
295
314
  OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
296
315
  :rm_attribute_name => id.value,
297
- :path => '/' + id.value,
316
+ :path => path,
298
317
  :cardinality => c_cardinality.value)
299
318
  end
300
319
  }
301
320
  / id:(V_ATTRIBUTE_IDENTIFIER) white_space {
302
- def value
321
+ def value(node)
322
+ path = (node.root? ? '/' : (node.path + "[#{node.id}]" + '/')) + id.value
303
323
  OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
304
- :rm_attribute_name => id.value, :path => '/' + id.value)
324
+ :rm_attribute_name => id.value, :path => path)
305
325
  end
306
326
  }
307
327
  end
308
328
 
309
329
  rule c_attr_body
310
330
  SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK {
311
- def value
312
- c_attr_values.value
331
+ def value(node)
332
+ c_attr_values.value(node)
313
333
  end
314
334
  }
315
335
  end
316
336
 
317
337
  rule c_attr_values
318
338
  c_any '' {
319
- def value
339
+ def value(node)
320
340
  c_any.value
321
341
  end
322
342
  }
323
343
  / c_object more_co:(c_object '')* {
324
- def value
325
- c_objects.map {|c| c.value}
344
+ def value(node)
345
+ c_objects.map {|c| c.value(node)}
326
346
  end
327
347
 
328
348
  def c_objects
@@ -577,10 +597,10 @@ module OpenEHR
577
597
  :pattern => pat.value, :type => 'Boolean')
578
598
  end
579
599
  }
580
- / V_STRING '' {
600
+ / str:V_STRING '' {
581
601
  def value
582
602
  OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
583
- :list => [V_STRING.value])
603
+ :list => [str.value])
584
604
  end
585
605
  }
586
606
  end
@@ -763,6 +783,12 @@ module OpenEHR
763
783
  end
764
784
 
765
785
  # path block
786
+ rule object_path
787
+ movable_path
788
+ / absolute_path
789
+ / relative_path
790
+ end
791
+
766
792
  rule movable_path
767
793
  SYM_MOVABLE_LEADER relative_path {
768
794
  def value
@@ -0,0 +1,18 @@
1
+ module OpenEHR
2
+ module Parser
3
+ module CADL
4
+ class ArchetypeNode
5
+ attr_reader :parent
6
+ attr_accessor :path, :id
7
+
8
+ def initialize(parent = nil)
9
+ @parent = parent
10
+ end
11
+
12
+ def root?
13
+ return parent.nil?
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -21,7 +21,7 @@ module OpenEHR
21
21
  end
22
22
 
23
23
  rule attr_vals
24
- first:attr_val second:(';'? attr_val)* {
24
+ first:attr_val second:(';'? space attr_val space)* {
25
25
  def value
26
26
  val = {first.id.to_sym => first.value}
27
27
  second.elements.each do |e|
@@ -18,22 +18,22 @@ module OpenEHR
18
18
  end
19
19
 
20
20
  rule type_identifier
21
- '(' id:V_TYPE_IDENTIFIER ')' {
21
+ '(' id:V_TYPE_IDENTIFIER ')' white_space {
22
22
  def value
23
23
  id.value
24
24
  end
25
25
  }
26
- / '(' id:V_GENERIC_TYPE_IDENTIFIER ')' {
26
+ / '(' id:V_GENERIC_TYPE_IDENTIFIER ')' white_space {
27
27
  def value
28
28
  id.value
29
29
  end
30
30
  }
31
- / id:V_TYPE_IDENTIFIER '' {
31
+ / id:V_TYPE_IDENTIFIER white_space {
32
32
  def value
33
33
  id.value
34
34
  end
35
35
  }
36
- / id:V_GENERIC_TYPE_IDENTIFIER '' {
36
+ / id:V_GENERIC_TYPE_IDENTIFIER space {
37
37
  def value
38
38
  id.value
39
39
  end