open_ehr 0.9.1 → 0.9.2

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 (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
@@ -1,819 +0,0 @@
1
- require 'rubygems'
2
- require 'logger'
3
- require 'open_ehr'
4
- require 'strscan'
5
-
6
- module OpenEHR
7
- module Parser
8
- module Scanner
9
- # LOGGER = Logger.new('log/scanner.log')
10
- LOGGER = Logger.new('log/parser.log')
11
- LOGGER.level = Logger::DEBUG
12
-
13
- #
14
- # ADLScanner
15
- #
16
- class ADLScanner < Base
17
- attr_accessor :adl_type, :cadl_scanner, :dadl_scanner, :regex_scanner, :term_constraint_scanner
18
-
19
- @@logger = OpenEHR::Parser::Scanner::LOGGER #Logger.new('log/scanner.log')
20
- RESERVED = {
21
- 'archetype' => :SYM_ARCHETYPE,
22
- 'adl_version' => :SYM_ADL_VERSION,
23
- 'controlled' => :SYM_IS_CONTROLLED,
24
- 'specialize' => :SYM_SPECIALIZE,
25
- 'concept' => :SYM_CONCEPT,
26
- 'language' => :SYM_LANGUAGE,
27
- 'description' => :SYM_DESCRIPTION,
28
- 'definition' => :SYM_DEFINITION,
29
- 'invariant' => :SYM_INVARIANT,
30
- 'ontology' => :SYM_ONTOLOGY,
31
- 'matches' => :SYM_MATCHES,
32
- 'is_in' => :SYM_MATCHES,
33
- 'occurrences' => :SYM_OCCURRENCES,
34
- 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
35
- 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
36
- 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
37
- }
38
- REGEX_PATTERN = Hash[:CarriageReturn => /\A\n/,
39
- :WhiteSpace => /\A[ \t\r\f]+/,
40
- :SingleCommentLine => /\A--.*/,
41
- :V_ISO8601_DURATION => /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
42
- ]
43
-
44
- def initialize(adl_type, filename)
45
- super(adl_type, filename)
46
- @in_interval = false
47
- @s = StringScanner.new()
48
- end
49
-
50
- #
51
- # ADLScanner#scan
52
- #
53
- def scan
54
- @@logger.debug("#{__FILE__}:#{__LINE__}: Entering ADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}")
55
- until @s.eos? do
56
- case @adl_type.last
57
- when :adl
58
- case data
59
- # when /\A\n/ # carriage return
60
- when REGEX_PATTERN[:CarriageReturn] # carriage return
61
- @lineno += 1
62
- ;
63
- # when /\A[ \t\r\f]+/ #just drop it
64
- when REGEX_PATTERN[:WhiteSpace] # carriage return
65
- ;
66
- # when /\A--.*/ # single line comment
67
- when REGEX_PATTERN[:SingleCommentLine] # carriage return
68
- @lineno += 1
69
- @@logger.debug("ADLScanner#scan: COMMENT = #{$&} at #{@filename}:#{@lineno}")
70
- ;
71
- when /\Adescription/ # description
72
- yield :SYM_DESCRIPTION, :SYM_DESCRIPTION
73
- when /\Adefinition/ # definition
74
- yield :SYM_DEFINITION, :SYM_DEFINITION
75
- ###----------/* symbols */ -------------------------------------------------
76
- when /\A[A-Z][a-zA-Z0-9_]*/
77
- yield :V_TYPE_IDENTIFIER, $&
78
- when /\A(\w+)-(\w+)-(\w+)\.(\w+)((?:-\w+)*)\.(v\w+)/ #V_ARCHETYPE_ID
79
- object_id, rm_originator, rm_name, rm_entity, concept_name, specialisation, version_id = $&, $1, $2, $3, $4, $5, $6
80
- archetype_id = OpenEHR::RM::Support::Identification::ArchetypeID.new(:concept_name => concept_name, :rm_name => rm_name, :rm_entity => rm_entity, :rm_originator => rm_originator, :specialisation => specialisation, :version_id => version_id)
81
- yield :V_ARCHETYPE_ID, archetype_id
82
- when /\A[a-z][a-zA-Z0-9_]*/
83
- word = $&
84
- if RESERVED[word]
85
- @@logger.debug("ADLScanner#scan: RESERVED = #{RESERVED[word]} at #{@filename}:#{@lineno}")
86
- param = Array.new
87
- param << RESERVED[word] << RESERVED[word]
88
- # yield([[RESERVED[word], RESERVED[word]])
89
- p param
90
- yield param
91
- elsif #/\A[A-Z][a-zA-Z0-9_]*/
92
- @@logger.debug("ADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")
93
- yield :V_ATTRIBUTE_IDENTIFIER, $&
94
- end
95
- when /\A\=/ # =
96
- yield :SYM_EQ, :SYM_EQ
97
- when /\A\>=/ # >=
98
- yield :SYM_GE, :SYM_GE
99
- when /\A\<=/ # <=
100
- yield :SYM_LE, :SYM_LE
101
- when /\A\</ # <
102
- if @in_interval
103
- yield :SYM_LT, :SYM_LT
104
- else
105
- @adl_type.push(:dadl)
106
- yield :SYM_START_DBLOCK, $&
107
- end
108
- when /\A\>/ # >
109
- if @in_interval
110
- yield :SYM_GT, :SYM_GT
111
- else
112
- adl_type = @adl_type.pop
113
- assert_at(__FILE__,__LINE__){adl_type == :dadl}
114
- yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
115
- end
116
- when /\A\{/ # {
117
- @adl_type.push(:cadl)
118
- @@logger.debug("ADLScanner#scan: SYM_START_CBLOCK")
119
- yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
120
- when /\A\}/ # }
121
- adl_type = @adl_type.pop
122
- assert_at(__FILE__,__LINE__){adl_type == :cadl}
123
- @@logger.debug("ADLScanner#scan: SYM_END_CBLOCK")
124
- yield :SYM_END_CBLOCK, $&
125
- when /\A\-/ # -
126
- yield :Minus_code, :Minus_code
127
- when /\A\+/ # +
128
- yield :Plus_code, :Plus_code
129
- when /\A\*/ # *
130
- yield :Star_code, :Star_code
131
- when /\A\// # /
132
- yield :Slash_code, :Slash_code
133
- when /\A\^/ # ^
134
- yield :Caret_code, :Caret_code
135
- when /\A\=/ # =
136
- yield :Equal_code, :Equal_code
137
- when /\A\.\.\./ # ...
138
- yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
139
- when /\A\.\./ # ..
140
- yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
141
- when /\A\./ # .
142
- yield :Dot_code, :Dot_code
143
- when /\A\;/ # ;
144
- yield :Semicolon_code, :Semicolon_code
145
- when /\A\,/ # ,
146
- yield :Comma_code, :Comma_code
147
- when /\A\:/ # :
148
- yield :Colon_code, :Colon_code
149
- when /\A\!/ # !
150
- yield :Exclamation_code, :Exclamation_code
151
- when /\A\(/ # (
152
- yield :Left_parenthesis_code, :Left_parenthesis_code
153
- when /\A\)/ # )
154
- yield :Right_parenthesis_code, :Right_parenthesis_code
155
- when /\A\$/ # $
156
- yield :Dollar_code, :Dollar_code
157
- when /\A\?\?/ # ??
158
- yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
159
- when /\A\?/ # ?
160
- yield :Question_mark_code, :Question_mark_code
161
- when /\A[0-9]+\.[0-9]+(\.[0-9]+)*/ # ?
162
- yield :V_VERSION_STRING, $&
163
- when /\A\|/ # |
164
- if @in_interval
165
- @in_interval = false
166
- else
167
- @in_interval = true
168
- end
169
- yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
170
- when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form such as [ICD10AM(1998)::F23]
171
- yield :V_QUALIFIED_TERM_CODE_REF, $1
172
- when /\A\[([a-zA-Z0-9][a-zA-Z0-9._\-]*)\]/ #V_LOCAL_TERM_CODE_REF
173
- yield :V_LOCAL_TERM_CODE_REF, $1
174
- when /\A\[/ # [
175
- yield :Left_bracket_code, :Left_bracket_code
176
- when /\A\]/ # ]
177
- yield :Right_bracket_code, :Right_bracket_code
178
- when /\A"([^"]*)"/m #V_STRING
179
- yield :V_STRING, $1
180
- when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
181
- yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
182
- when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
183
- yield :V_LOCAL_CODE, $&
184
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9](Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_DATE_TIME YYYY-MM-DDThh:mm:ss[,sss][Z|+/- -n-n-n-n-]-
185
- yield :V_ISO8601_EXTENDED_DATE_TIME, $&
186
- when /\A[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})? / #V_ISO8601_EXTENDED_TIME hh:mm:ss[,sss][Z|+/-nnnn]
187
- yield :V_ISO8601_EXTENDED_TIME, $&
188
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]|[0-9]{4}-[0-1][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
189
- yield :V_ISO8601_EXTENDED_DATE, $&
190
- when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
191
- yield :V_GENERIC_TYPE_IDENTIFIER, $&
192
- when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
193
- @@logger.debug("ADLScanner#scan: V_INTEGER = #{$&}")
194
- yield :V_INTEGER, $&
195
- when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
196
- yield :V_REAL, $&
197
- # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
198
- when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
199
- yield :V_URI, $&
200
- when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
201
- yield :V_ISO8601_DURATION, $&
202
- when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
203
- yield :V_ISO8601_DURATION, $&
204
- when /\A\S/ #UTF8CHAR
205
- yield :UTF8CHAR, $&
206
- end
207
- data = $' # variable $' receives the string after the match
208
- when :dadl
209
- dadl_scanner = OpenEHR::Parser::Scanner::DADLScanner.new(@adl_type, @filename, @lineno)
210
- data = dadl_scanner.scan(data) do |sym, val|
211
- yield sym, val
212
- end
213
- when :cadl
214
- cadl_scanner = OpenEHR::Parser::Scanner::CADLScanner.new(@adl_type, @filename, @lineno)
215
- data = cadl_scanner.scan(data) do |sym, val|
216
- yield sym, val
217
- end
218
- when :regexp
219
- regex_scanner = OpenEHR::Parser::Scanner::RegexScanner.new(@adl_type, @filename, @lineno)
220
- data = regex_scanner.scan(data) do |sym, val|
221
- yield sym, val
222
- end
223
- when :term_constraint
224
- term_constraint_scanner = OpenEHR::Parser::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno)
225
- data = term_constraint_scanner.scan(data) do |sym, val|
226
- yield sym, val
227
- end
228
- else
229
- raise
230
- end
231
- end
232
- end
233
- end # of ADLScanner
234
-
235
- #
236
- # DADLScanner
237
- #
238
- class DADLScanner < ADLScanner
239
- attr_accessor :in_interval, :in_c_domain_type, :dblock_depth
240
- @@logger = OpenEHR::Parser::Scanner::LOGGER #Logger.new('log/scanner.log')
241
- RESERVED = {
242
- 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
243
- 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
244
- 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
245
- }
246
-
247
- def initialize(adl_type, filename, lineno = 1)
248
- super(adl_type, filename, lineno)
249
- @in_interval = false
250
- @in_c_domain_type = false
251
- @dblock_depth = 0
252
- end
253
-
254
- #
255
- # DADLScanner#scan
256
- #
257
- def scan(data)
258
- @@logger.debug("Entering DADLScanner#scan at #{@filename}:#{@lineno}: @adl_type = #{@adl_type.inspect}, data = #{data.inspect}")
259
- until data.nil? do
260
- @@logger.debug("#{@filename}:#{@lineno}: DADLScanner#scan:loop data = #{data.inspect}")
261
- @@logger.debug("#{@filename}:#{@lineno}: DADLScanner#scan:loop self = \n#{self.to_yaml}")
262
- case @adl_type.last
263
- when :dadl
264
- case data
265
- # when /\A\n/ # carriage return
266
- when REGEX_PATTERN[:CarriageReturn] # carriage return
267
- @lineno += 1
268
- ;
269
- # when /\A[ \t\r\f]+/ #just drop it
270
- when REGEX_PATTERN[:WhiteSpace]
271
- ##@@logger.debug("DADLScanner#scan: white space, data = #{data.inspect}")
272
- ;
273
- # when /\A--.*/ # single line comment
274
- when REGEX_PATTERN[:SingleCommentLine]
275
- @@logger.debug("DADLScanner#scan: COMMENT = #{$&} at #{@filename}:#{@lineno}")
276
- ;
277
- when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
278
- yield :V_URI, $&
279
- when /\A[a-z][a-zA-Z0-9_]*/
280
- word = $&.dup
281
- if RESERVED[word.downcase]
282
- yield RESERVED[word.downcase], RESERVED[word.downcase]
283
- else
284
- @@logger.debug("DADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")
285
- yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/
286
- end
287
- ###----------/* symbols */ -------------------------------------------------
288
- when /\A\=/ # =
289
- yield :SYM_EQ, :SYM_EQ
290
- when /\A\>\=/ # >=
291
- yield :SYM_GE, :SYM_GE
292
- when /\A\<\=/ # <=
293
- yield :SYM_LE, :SYM_LE
294
- when /\A\</ # <
295
- if @in_interval
296
- yield :SYM_LT, :SYM_LT
297
- else
298
- unless @in_c_domain_type
299
- @adl_type.push(:dadl)
300
- else
301
- @dblock_depth += 1
302
- end
303
- yield :SYM_START_DBLOCK, :SYM_START_DBLOCK
304
- end
305
- when /\A\>/ # >
306
- if @in_interval
307
- yield :SYM_GT, :SYM_GT
308
- else
309
- if @in_c_domain_type
310
- assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}
311
- @dblock_depth -= 1
312
- if @dblock_depth < 0
313
- @adl_type.pop
314
- @in_c_domain_type = false
315
- yield :END_V_C_DOMAIN_TYPE_BLOCK, :END_V_C_DOMAIN_TYPE_BLOCK
316
- else
317
- yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
318
- end
319
- else
320
- adl_type = @adl_type.pop
321
- assert_at(__FILE__,__LINE__){adl_type == :dadl}
322
- yield :SYM_END_DBLOCK, $&
323
- end
324
- end
325
- when /\A\-/ # -
326
- yield :Minus_code, :Minus_code
327
- when /\A\+/ # +
328
- yield :Plus_code, :Plus_code
329
- when /\A\*/ # *
330
- yield :Star_code, :Star_code
331
- when /\A\// # /
332
- yield :Slash_code, :Slash_code
333
- when /\A\^/ # ^
334
- yield :Caret_code, :Caret_code
335
- when /\A\.\.\./ # ...
336
- yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
337
- when /\A\.\./ # ..
338
- yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
339
- when /\A\./ # .
340
- yield :Dot_code, :Dot_code
341
- when /\A\;/ # ;
342
- yield :Semicolon_code, :Semicolon_code
343
- when /\A\,/ # ,
344
- @@logger.debug("DADLScanner#scan: Comma_code")
345
- yield :Comma_code, :Comma_code
346
- when /\A\:/ # :
347
- yield :Colon_code, :Colon_code
348
- when /\A\!/ # !
349
- yield :Exclamation_code, :Exclamation_code
350
- when /\A\(/ # (
351
- yield :Left_parenthesis_code, :Left_parenthesis_code
352
- when /\A\)/ # )
353
- yield :Right_parenthesis_code, :Right_parenthesis_code
354
- when /\A\$/ # $
355
- yield :Dollar_code, :Dollar_code
356
- when /\A\?\?/ # ??
357
- yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
358
- when /\A\?/ # ?
359
- yield :Question_mark_code, :Question_mark_code
360
- when /\A\|/ # |
361
- @@logger.debug("DADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
362
- if @in_interval
363
- @in_interval = false
364
- else
365
- @in_interval = true
366
- end
367
- @@logger.debug("DADLScanner#scan: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
368
- yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
369
- when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
370
- yield :V_QUALIFIED_TERM_CODE_REF, $1
371
- when /\A\[/ # [
372
- @@logger.debug("DADLScanner#scan: Left_bracket_code at #{@filename}:#{@lineno}")
373
- yield :Left_bracket_code, :Left_bracket_code
374
- when /\A\]/ # ]
375
- @@logger.debug("DADLScanner#scan: Right_bracket_code at #{@filename}:#{@lineno}")
376
- yield :Right_bracket_code, :Right_bracket_code
377
- when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
378
- @@logger.debug("DADLScanner#scan: V_STRING, #{$1}")
379
- yield :V_STRING, $1
380
- when /\A"([^"]*)"/m #V_STRING
381
- @@logger.debug("DADLScanner#scan: V_STRING, #{$1}")
382
- yield :V_STRING, $1
383
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?|[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9](Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_DATE_TIME YYYY-MM-DDThh:mm:ss[,sss][Z|+/- -n-n-n-n-]-
384
- @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_DATE_TIME")
385
- yield :V_ISO8601_EXTENDED_DATE_TIME, $&
386
- when /\A[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?|[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})? / #V_ISO8601_EXTENDED_TIME hh:mm:ss[,sss][Z|+/-nnnn]
387
- @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_TIME")
388
- yield :V_ISO8601_EXTENDED_TIME, $&
389
- when /\A\d{4}-[0-1][0-9]-[0-3][0-9]|[0-9]{4}-[0-1][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
390
- @@logger.debug("DADLScanner#scan: V_ISO8601_EXTENDED_DATE, #{$&}")
391
- yield :V_ISO8601_EXTENDED_DATE, $&
392
- when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
393
- yield :V_GENERIC_TYPE_IDENTIFIER, $&
394
- when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
395
- yield :V_REAL, $&
396
- when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
397
- @@logger.debug("DADLScanner#scan: V_INTEGER = #{$&}")
398
- yield :V_INTEGER, $&
399
- when /\A\S/ #UTF8CHAR
400
- yield :UTF8CHAR, $&
401
- end
402
- data = $' # variable $' receives the string after the match
403
- when :adl
404
- adl_scanner = OpenEHR::Parser::Scanner::ADLScanner.new(@adl_type, @filename, @lineno)
405
- data = adl_scanner.scan(data) do |sym, val|
406
- yield sym, val
407
- end
408
- when :cadl
409
- cadl_scanner = OpenEHR::Parser::Scanner::CADLScanner.new(@adl_type, @filename, @lineno)
410
- data = cadl_scanner.scan(data) do |sym, val|
411
- yield sym, val
412
- end
413
- when :regexp
414
- regex_scanner = OpenEHR::Parser::Scanner::RegexScanner.new(@adl_type, @filename, @lineno)
415
- data = regex_scanner.scan(data) do |sym, val|
416
- yield sym, val
417
- end
418
- when :term_constraint
419
- @@logger.debug("#{__FILE__}:#{__LINE__}: scan_dadl: Entering scan_term_constraint at #{@filename}:#{@lineno}: data = #{data.inspect}")
420
- term_constraint_scanner = OpenEHR::Parser::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno)
421
- data = term_constraint_scanner.scan(data) do |sym, val|
422
- yield sym, val
423
- end
424
- else
425
- raise
426
- end
427
- end
428
- end
429
- end # of DADLScanner
430
-
431
- class CADLScanner < ADLScanner
432
-
433
- @@logger = OpenEHR::Parser::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log')
434
- RESERVED = {
435
- 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn]
436
- 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee]
437
- 'and' => :SYM_AND, # [Aa][Nn][Dd]
438
- 'or' => :SYM_OR, # [Oo][Rr]
439
- 'xor' => :SYM_XOR, # [Xx][Oo][Rr]
440
- 'not' => :SYM_NOT, # [Nn][Oo][Tt]
441
- 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss]
442
- 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
443
- 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
444
- 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll]
445
- 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss]
446
- 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee]
447
- 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss]
448
- 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy]
449
- 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]
450
- 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]
451
- 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee]
452
- 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss]
453
- 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn]
454
- 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt]
455
- 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
456
- 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee]
457
- 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
458
- 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
459
- 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee]
460
- 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee]
461
- }
462
-
463
- def initialize(adl_type, filename, lineno = 1)
464
- super(adl_type, filename, lineno)
465
- @in_interval = false
466
- end
467
-
468
- #
469
- # CADLScanner#scan
470
- #
471
- def scan(data)
472
- @@logger.debug("#{__FILE__}:#{__LINE__}: Entering CADLScanner#scan at #{@filename}:#{@lineno}: data = #{data.inspect}")
473
- until data.nil? do
474
- @@logger.debug("CADLScanner#scan: loop data = #{data.inspect}")
475
- case @adl_type.last
476
- when :cadl
477
- case data
478
- # when /\A\n/ # carriage return
479
- when REGEX_PATTERN[:CarriageReturn] # carriage return
480
- @lineno += 1
481
- ;
482
- #yield :CR, :CR
483
- # when /\A[ \t\r\f]+/ #just drop it
484
- when REGEX_PATTERN[:WhiteSpace]
485
- ;
486
- # when /\A--.*\n/ # single line comment
487
- when REGEX_PATTERN[:SingleCommentLine]
488
- @lineno += 1
489
- ;
490
- ###----------/* symbols */ -------------------------------------------------
491
- when /\A\=/ # =
492
- yield :SYM_EQ, :SYM_EQ
493
- when /\A\>=/ # >=
494
- yield :SYM_GE, :SYM_GE
495
- when /\A\<=/ # <=
496
- yield :SYM_LE, :SYM_LE
497
- when /\A\</ # <
498
- if @in_interval
499
- yield :SYM_LT, :SYM_LT
500
- else
501
- @adl_type.push(:dadl)
502
- yield :SYM_START_DBLOCK, $&
503
- end
504
- when /\A\>/ # >
505
- if @in_interval
506
- yield :SYM_GT, :SYM_GT
507
- else
508
- adl_type = @adl_type.pop
509
- assert_at(__FILE__,__LINE__){adl_type == :dadl}
510
- yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
511
- end
512
- when /\A\-/ # -
513
- yield :Minus_code, :Minus_code
514
- when /\A\+/ # +
515
- yield :Plus_code, :Plus_code
516
- when /\A\=/ # =
517
- yield :Equal_code, :Equal_code
518
- when /\A\*/ # *
519
- yield :Star_code, :Star_code
520
- when /\A\^/ # ^
521
- yield :Caret_code, :Caret_code
522
- when /\A\.\.\./ # ...
523
- yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
524
- when /\A\.\./ # ..
525
- yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
526
- when /\A\./ # .
527
- yield :Dot_code, :Dot_code
528
- when /\A\;/ # ;
529
- yield :Semicolon_code, :Semicolon_code
530
- when /\A\,/ # ,
531
- yield :Comma_code, :Comma_code
532
- when /\A\:/ # :
533
- yield :Colon_code, :Colon_code
534
- when /\A\!/ # !
535
- yield :Exclamation_code, :Exclamation_code
536
- when /\A\(/ # (
537
- yield :Left_parenthesis_code, :Left_parenthesis_code
538
- when /\A\)/ # )
539
- yield :Right_parenthesis_code, :Right_parenthesis_code
540
- when /\A\// # /
541
- @@logger.debug("CADLScanner#scan: Slash_code #{@filename}:#{@lineno}")
542
- yield :Slash_code, :Slash_code
543
- when /\A\{\// # REGEXP_HEAD {/
544
- assert_at(__FILE__,__LINE__){ @adl_type.last != :regexp}
545
- # @in_regexp = true
546
- @@logger.debug("CADLScanner#scan: REGEXP_HEAD:")
547
- @adl_type.push(:cadl)
548
- @adl_type.push(:regexp)
549
- # yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
550
- yield :REGEXP_HEAD, :REGEXP_HEAD
551
- when /\A\{/ # {
552
- @adl_type.push(:cadl)
553
- #@@logger.debug("CADLScanner#scan: entering cADL at #{@filename}:#{@lineno}")
554
- yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
555
- when /\A\}/ # }
556
- adl_type = @adl_type.pop
557
- assert_at(__FILE__,__LINE__){adl_type == :cadl}
558
- @@logger.debug("CADLScanner#scan: exiting cADL at #{@filename}:#{@lineno}")
559
- yield :SYM_END_CBLOCK, :SYM_END_CBLOCK
560
- when /\A\$/ # $
561
- yield :Dollar_code, :Dollar_code
562
- when /\A\?\?/ # ??
563
- yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
564
- when /\A\?/ # ?
565
- yield :Question_mark_code, :Question_mark_code
566
- when /\A\|/ # |
567
- if @in_interval
568
- @in_interval = false
569
- else
570
- @in_interval = true
571
- end
572
- @@logger.debug("CADLScanner#scan: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
573
- @@logger.debug("CADLScanner#scan: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
574
- yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
575
-
576
- when /\A\[([a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+)\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
577
- yield :V_QUALIFIED_TERM_CODE_REF, $1
578
- when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
579
- yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
580
- when /\A\[([a-zA-Z0-9\(\)\._\-]+)::[ \t\n]*/
581
- @adl_type.push(:term_constraint)
582
- yield :START_TERM_CODE_CONSTRAINT, $1
583
- when /\A\[([a-zA-Z0-9][a-zA-Z0-9._\-]*)\]/ #V_LOCAL_TERM_CODE_REF
584
- yield :V_LOCAL_TERM_CODE_REF, $1
585
- when /\A\[/ # [
586
- yield :Left_bracket_code, :Left_bracket_code
587
- when /\A\]/ # ]
588
- yield :Right_bracket_code, :Right_bracket_code
589
- when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
590
- yield :V_GENERIC_TYPE_IDENTIFIER, $&
591
- when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][Tt][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
592
- yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&
593
- when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
594
- yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&
595
- when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
596
- yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&
597
- when /\AP[yY]?[mM]?[wW]?[dD]?T[hH]?[mM]?[sS]?/ #V_ISO8601_DURATION_CONSTRAINT_PATTERN
598
- if $&.length == 2
599
- case data
600
- when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9.]+[sS])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
601
- yield :V_ISO8601_DURATION, $&
602
- else
603
- yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
604
- end
605
- else
606
- yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
607
- end
608
- when /\AP[yY]?[mM]?[wW]?[dD]?/ #V_ISO8601_DURATION_CONSTRAINT_PATTERN
609
- if $&.length == 1
610
- case data
611
- when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
612
- yield :V_ISO8601_DURATION, $&
613
- else
614
- yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
615
- end
616
- else
617
- yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
618
- end
619
- when /\AP[yY]?[mM]?[wW]?[dD]?/ #V_ISO8601_DURATION_CONSTRAINT_PATTERN
620
- yield :V_ISO8601_DURATION_CONSTRAINT_PATTERN, $&
621
- when /\A[a-z][a-zA-Z0-9_]*/
622
- word = $&.dup
623
- if RESERVED[word.downcase]
624
- @@logger.debug("ADLScanner#scan: RESERVED = #{RESERVED[word]} at #{@filename}:#{@lineno}")
625
- yield RESERVED[word.downcase], RESERVED[word.downcase]
626
- else
627
- @@logger.debug("CADLScanner#scan: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")
628
- yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/
629
- end
630
- when /\A([A-Z][a-zA-Z0-9_]*)[ \n]*\</ # V_C_DOMAIN_TYPE
631
- @in_c_domain_type = true
632
- @adl_type.push(:dadl)
633
- yield :START_V_C_DOMAIN_TYPE_BLOCK, $1
634
- when /\A[A-Z][a-zA-Z0-9_]*/
635
- word = $&.dup
636
- if RESERVED[word.downcase]
637
- yield RESERVED[word.downcase], RESERVED[word.downcase]
638
- else
639
- yield :V_TYPE_IDENTIFIER, $&
640
- end
641
- when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
642
- yield :V_LOCAL_CODE, $&
643
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_DATE_TIME YYYY-MM-DDThh:mm:ss[,sss][Z|+/- -n-n-n-n-]-
644
- yield :V_ISO8601_EXTENDED_DATE_TIME, $&
645
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?/
646
- yield :V_ISO8601_EXTENDED_DATE_TIME, $&
647
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9](Z|[+-][0-9]{4})?/
648
- yield :V_ISO8601_EXTENDED_DATE_TIME, $&
649
- when /\A[0-2][0-9]:[0-6][0-9]:[0-6][0-9](,[0-9]+)?(Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_TIME hh:mm:ss[,sss][Z|+/-nnnn]
650
- yield :V_ISO8601_EXTENDED_TIME, $&
651
- when /\A[0-2][0-9]:[0-6][0-9](Z|[+-][0-9]{4})?/ #V_ISO8601_EXTENDED_TIME hh:mm:ss[,sss][Z|+/-nnnn]
652
- yield :V_ISO8601_EXTENDED_TIME, $&
653
- when /\A[0-9]{4}-[0-1][0-9]-[0-3][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
654
- yield :V_ISO8601_EXTENDED_DATE, $&
655
- when /\A[0-9]{4}-[0-1][0-9]/ #V_ISO8601_EXTENDED_DATE YYYY-MM-DD
656
- yield :V_ISO8601_EXTENDED_DATE, $&
657
- when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
658
- yield :V_STRING, $1
659
- when /\A"([^"]*)"/m #V_STRING
660
- yield :V_STRING, $1
661
- when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
662
- yield :V_REAL, $&
663
- when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
664
- @@logger.debug("CADLScanner#scan: V_INTEGER = #{$&}")
665
- yield :V_INTEGER, $&
666
- when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
667
- yield :V_URI, $&
668
- when /\A\S/ #UTF8CHAR
669
- yield :UTF8CHAR, $&
670
- when /\A.+/ #
671
- raise OpenEHR::Parser::Exception::CADLScanner::Base.new, "can't handle #{data.inspect}"
672
- end
673
- data = $' # variable $' receives the string after the match
674
- when :adl
675
- adl_scanner = OpenEHR::Parser::Scanner::ADLScanner.new(@adl_type, @filename, @lineno)
676
- data = adl_scanner.scan(data) do |sym, val|
677
- yield sym, val
678
- end
679
- when :dadl
680
- dadl_scanner = OpenEHR::Parser::Scanner::DADLScanner.new(@adl_type, @filename, @lineno)
681
- dadl_scanner.in_c_domain_type = @in_c_domain_type
682
- data = dadl_scanner.scan(data) do |sym, val|
683
- yield sym, val
684
- end
685
- when :regexp
686
- regex_scanner = OpenEHR::Parser::Scanner::RegexScanner.new(@adl_type, @filename, @lineno)
687
- data = regex_scanner.scan(data) do |sym, val|
688
- yield sym, val
689
- end
690
- when :term_constraint
691
- term_constraint_scanner = OpenEHR::Parser::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno)
692
- data = term_constraint_scanner.scan(data) do |sym, val|
693
- yield sym, val
694
- end
695
- else
696
- raise OpenEHR::Parser::Exception::CADLScanner.new, "unexpected adl_type: #{@adl_type.last}"
697
- end
698
- end # of until
699
- end
700
- end # of CADLScanner
701
-
702
-
703
- #
704
- # RegexScanner
705
- #
706
- class RegexScanner < Base
707
-
708
- @@logger = OpenEHR::Parser::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log')
709
-
710
- def initialize(adl_type, filename, lineno = 1)
711
- super(adl_type, filename, lineno)
712
- end
713
-
714
- def scan(data)
715
- @@logger.debug("#{__FILE__}:#{__LINE__}: Entering RegexScanner::scan at #{@filename}:#{@lineno}: data = #{data.inspect}")
716
- until data.nil? do
717
- case @adl_type.last
718
- when :regexp
719
- case data
720
- when /\A(.*)\// # REGEXP_BODY
721
- @adl_type.pop
722
- @@logger.debug("#{__FILE__}:#{__LINE__}: RegexScanner::scan REGEXP_BODY = #{$1}")
723
- yield :REGEXP_BODY, $1
724
- end
725
- data = $' # variable $' receives the string after the match
726
- when :adl
727
- adl_scanner = OpenEHR::Parser::Scanner::ADLScanner.new(@adl_type, @filename, @lineno)
728
- data = adl_scanner.scan(data) do |sym, val|
729
- yield sym, val
730
- end
731
- when :dadl
732
- dadl_scanner = OpenEHR::Parser::Scanner::DADLScanner.new(@adl_type, @filename, @lineno)
733
- data = dadl_scanner.scan(data) do |sym, val|
734
- yield sym, val
735
- end
736
- when :cadl
737
- cadl_scanner = OpenEHR::Parser::Scanner::CADLScanner.new(@adl_type, @filename, @lineno)
738
- data = cadl_scanner.scan(data) do |sym, val|
739
- yield sym, val
740
- end
741
- when :term_constraint
742
- #@@logger.debug("#{__FILE__}:#{__LINE__}: scan_regexp: Entering scan_term_constraint at #{@filename}:#{@lineno}")
743
- term_constraint_scanner = OpenEHR::Parser::Scanner::TermConstraintScanner.new(@adl_type, @filename, @lineno)
744
- data = term_constraint_scanner.scan(data) do |sym, val|
745
- yield sym, val
746
- end
747
- else
748
- raise
749
- end
750
- end
751
- end
752
- end # of RegexScanner
753
-
754
- #
755
- # TermConstraintScanner
756
- #
757
- class TermConstraintScanner < Base
758
- @@logger = OpenEHR::Parser::Scanner::LOGGER #Logger.new('log/scanner.log') #Logger.new('log/scanner.log')
759
- def initialize(adl_type, filename, lineno = 1)
760
- super(adl_type, filename, lineno)
761
- end
762
-
763
- def scan(data)
764
- @@logger.debug("#{__FILE__}:#{__LINE__}: Entering scan_term_constraint")
765
- until data.nil? do
766
- case @adl_type.last
767
- when :term_constraint
768
- case data
769
- when /\A\n/ # carriage return
770
- @lineno += 1
771
- ;
772
- when /\A[ \t\r\f]+/ #just drop it
773
- ;
774
- when /\A--.*$/ # single line comment
775
- @lineno += 1
776
- @@logger.debug("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}")
777
- ;
778
- when /\A([a-zA-Z0-9\._\-])+[ \t]*,/ # match any line, with ',' termination
779
- yield :TERM_CODE, $1
780
- when /\A([a-zA-Z0-9\._\-])+[ \t]*;/ # match second last line with ';' termination (assumed value)
781
- yield :TERM_CODE, $1
782
- when /\A([a-zA-Z0-9\._\-])*[ \t]*\]/ # match final line, terminating in ']'
783
- adl_type = @adl_type.pop
784
- assert_at(__FILE__,__LINE__){adl_type == :term_constraint}
785
- yield :END_TERM_CODE_CONSTRAINT, $1
786
- # else
787
- # raise "data = #{data}"
788
- end
789
- data = $' # variable $' receives the string after the match
790
- when :adl
791
- adl_scanner = OpenEHR::Parser::Scanner::ADLScanner.new(@adl_type, @filename, @lineno)
792
- data = adl_scanner.scan(data) do |sym, val|
793
- yield sym, val
794
- end
795
- when :dadl
796
- dadl_scanner = OpenEHR::Parser::Scanner::DADLScanner.new(@adl_type, @filename, @lineno)
797
- data = dadl_scanner.scan(data) do |sym, val|
798
- yield sym, val
799
- end
800
- when :cadl
801
- cadl_scanner = OpenEHR::Parser::Scanner::CADLScanner.new(@adl_type, @filename, @lineno)
802
- data = cadl_scanner.scan(data) do |sym, val|
803
- yield sym, val
804
- end
805
- else
806
- raise
807
- end
808
- end
809
- end
810
- end # of TermConstraintScanner
811
-
812
- end
813
- end
814
- end
815
-
816
- __END__
817
-
818
-
819
-