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
@@ -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
-