source: ruby/trunk/adl_parser/lib/parser.y@ 22

Last change on this file since 22 was 22, checked in by Tatsukawa, Akimichi, 16 years ago

integrating am and adl_parser

File size: 59.5 KB
Line 
1
2class OpenEHR::ADL::Parser
3
4#options omit_action_call
5
6prechigh
7
8 nonassoc UMINUS UPLUS
9 left '*' '/'
10 left '+' '-'
11
12 nonassoc SYM_EQ
13 nonassoc SYM_NE
14 nonassoc SYM_LT
15 nonassoc SYM_START_DBLOCK
16 nonassoc SYM_START_CBLOCK
17 nonassoc SYM_GT
18 nonassoc SYM_END_CBLOCK
19 nonassoc SYM_END_DBLOCK
20 nonassoc SYM_LE
21 nonassoc SYM_GE
22
23preclow
24
25
26rule
27### http://svn.openehr.org/ref_impl_eiffel/TRUNK/components/adl_parser/src/syntax/adl/parser/adl_validator.y
28
29input: archetype EOF
30 {
31 result = val[0]
32 }
33 | error
34
35archetype: arch_identification arch_specialisation arch_concept arch_language arch_description arch_definition arch_invariant arch_ontology
36 {
37 assert_at(__FILE__,__LINE__) do
38 val[4].instance_of?(OpenEHR::AM::Archetype::Archetype_Description::ARCHETYPE_DESCRIPTION) and val[5].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT) and val[7].instance_of?(OpenEHR::AM::Archetype::Ontology::ARCHETYPE_ONTOLOGY)
39 end
40
41 result = OpenEHR::AM::Archetype::ARCHETYPE.new(
42 :description => val[4],
43 :definition => val[5],
44 :ontology => val[7]
45 )
46 }
47
48
49arch_identification: arch_head V_ARCHETYPE_ID
50 | SYM_ARCHETYPE error
51
52arch_head: SYM_ARCHETYPE
53 | SYM_ARCHETYPE arch_meta_data
54
55arch_meta_data: Left_parenthesis_code arch_meta_data_items Right_parenthesis_code
56
57arch_meta_data_items: arch_meta_data_item
58 | arch_meta_data_items Semicolon_code arch_meta_data_item
59# | arch_meta_data_items ';' arch_meta_data_item
60
61arch_meta_data_item: SYM_ADL_VERSION SYM_EQ V_VERSION_STRING
62 | SYM_IS_CONTROLLED
63
64# Define specialization in which its constraints are narrower than those of the parent.
65# Any data created via the use of the specialized archetype shall be conformant both to it and its parent.
66arch_specialisation: #-- empty is ok
67 | SYM_SPECIALIZE V_ARCHETYPE_ID
68 | SYM_SPECIALIZE error
69
70arch_concept: SYM_CONCEPT V_LOCAL_TERM_CODE_REF
71 | SYM_CONCEPT error
72
73#arch_language: #-- empty is ok for ADL 1.4 tools
74# | SYM_LANGUAGE V_DADL_TEXT
75# | SYM_LANGUAGE error
76
77arch_language: #-- empty is ok for ADL 1.4 tools
78 | SYM_LANGUAGE dadl_section
79 {
80 result = {:language => val[1]}
81 }
82 | SYM_LANGUAGE error
83
84#arch_description: #-- no meta-data ok
85# | SYM_DESCRIPTION V_DADL_TEXT
86# | SYM_DESCRIPTION error
87
88arch_description: #-- no meta-data ok
89 | SYM_DESCRIPTION dadl_section
90 {
91 result = OpenEHR::AM::Archetype::Archetype_Description::ARCHETYPE_DESCRIPTION.new(:details => val[1])
92 }
93 | SYM_DESCRIPTION error
94
95#arch_definition: SYM_DEFINITION V_CADL_TEXT
96# | SYM_DEFINITION error
97arch_definition: SYM_DEFINITION cadl_section
98 {
99 result = val[1]
100 }
101 | SYM_DEFINITION error
102
103
104### cADL section
105cadl_section: c_complex_object
106 {
107 assert_at(__FILE__,__LINE__){val[0].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT)}
108
109 result = val[0]
110 }
111 | assertions
112# | error
113
114#c_complex_object: c_complex_object_head SYM_MATCHES SYM_START_CBLOCK c_complex_object_body SYM_END_CBLOCK
115c_complex_object: c_complex_object_head SYM_MATCHES START_REGEXP_BLOCK REGEXP_BODY END_REGEXP_BLOCK # added by akimichi
116 {
117 result = OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT.new
118 }
119 | c_complex_object_head SYM_MATCHES SYM_START_CBLOCK c_complex_object_body SYM_END_CBLOCK
120 {
121 result = OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT.new(
122 :assumed_value => val[0],
123 :attributes => val[2]
124 )
125 }
126# | c_complex_object_head error SYM_END_CBLOCK
127# | c_complex_object_head SYM_MATCHES SYM_START_CBLOCK c_complex_object_body c_invariants SYM_END_CBLOCK
128
129c_complex_object_head: c_complex_object_id c_occurrences
130
131c_complex_object_id: type_identifier
132 {
133 result = val[0]
134 }
135 | type_identifier V_LOCAL_TERM_CODE_REF
136 {
137 result = {:c_complex_object_id => {:type_identifier => val[0], :V_LOCAL_TERM_CODE_REF => val[1]}}
138 }
139
140c_complex_object_body: c_any #-- used to indicate that any value of a type is ok
141 | c_attributes
142 {
143 result = OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT.new(:attributes => val[0])
144 }
145
146
147#------------------------- node types -----------------------
148
149c_object: v_c_domain_type
150 {
151 result = val[0]
152 }
153 | c_complex_object
154 {
155 result = OpenEHR::AM::Archetype::Constraint_Model::C_COMPLEX_OBJECT.new
156 }
157 | archetype_internal_ref
158 {
159 result = OpenEHR::AM::Archetype::Constraint_Model::ARCHETYPE_INTERNAL_REF.new
160 }
161 | archetype_slot
162 {
163 result = OpenEHR::AM::Archetype::Constraint_Model::ARCHETYPE_SLOT.new
164 }
165 | constraint_ref
166 {
167 result = OpenEHR::AM::Archetype::Constraint_Model::CONSTRAINT_REF.new
168 }
169 | c_code_phrase
170 {
171 result = val[0]
172 }
173 | c_ordinal
174 {
175 result = val[0]
176 }
177 | c_primitive_object
178 {
179 result = val[0]
180 }
181# | v_c_domain_type
182# | V_C_DOMAIN_TYPE
183 # this is an attempt to match a dADL section inside cADL. It will
184 # probably never work 100% properly since there can be '>' inside "||"
185 # ranges, and also strings containing any character, e.g. units string
186 # contining "{}" chars. The real solution is to use the dADL parser on
187 # the buffer from the current point on and be able to fast-forward the
188 # cursor to the last character matched by the dADL scanner
189 | ERR_C_DOMAIN_TYPE
190 | error
191
192v_c_domain_type: START_V_C_DOMAIN_TYPE_BLOCK dadl_section END_V_C_DOMAIN_TYPE_BLOCK
193
194# 'archetype_internal_ref' is a node that refers to a previously defined object node in the same archetype.
195archetype_internal_ref: SYM_USE_NODE type_identifier c_occurrences absolute_path
196 | SYM_USE_NODE type_identifier error
197
198# 'archetype_slot' is a node whose statements define a constraint that determines which other archetypes may appear at that point in the current archetype.
199archetype_slot: c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK
200
201c_archetype_slot_head: c_archetype_slot_id c_occurrences
202
203c_archetype_slot_id: SYM_ALLOW_ARCHETYPE type_identifier
204 | SYM_ALLOW_ARCHETYPE type_identifier V_LOCAL_TERM_CODE_REF
205 | SYM_ALLOW_ARCHETYPE error
206
207# 'c_primitive_object' is an node representing a constraint on a primitive object type.
208c_primitive_object: c_primitive
209 {
210 assert_at(__FILE__,__LINE__){val[0].kind_of?(OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_PRIMITIVE)}
211 result = OpenEHR::AM::Archetype::Constraint_Model::C_PRIMITIVE_OBJECT.new(:item => val[0])
212 }
213
214c_primitive: c_integer
215 {
216 @@log.info("#{__FILE__}:#{__LINE__}: c_integer = #{val[0]} at #{@filename}:#{@lineno}")
217 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_INTEGER.new
218 }
219 | c_real
220 {
221 @@log.info("#{__FILE__}:#{__LINE__}: c_real = #{val[0]} at #{@filename}:#{@lineno}")
222 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_REAL.new
223 }
224 | c_date
225 {
226 @@log.info("#{__FILE__}:#{__LINE__}: c_date = #{val[0]} at #{@filename}:#{@lineno}")
227 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DATE.new
228 }
229 | c_time
230 {
231 @@log.info("#{__FILE__}:#{__LINE__}: c_time = #{val[0]} at #{@filename}:#{@lineno}")
232 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_TIME.new
233 }
234 | c_date_time
235 {
236 @@log.info("#{__FILE__}:#{__LINE__}: c_date_time = #{val[0]} at #{@filename}:#{@lineno}")
237 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DATE_TIME.new
238 }
239 | c_duration
240 {
241 @@log.info("#{__FILE__}:#{__LINE__}: c_duration = #{val[0]} at #{@filename}:#{@lineno}")
242 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_DURATION.new
243 }
244 | c_string
245 {
246 @@log.info("#{__FILE__}:#{__LINE__}: c_string = #{val[0]} at #{@filename}:#{@lineno}")
247 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_STRING.new
248 }
249 | c_boolean
250 {
251 assert_at(__FILE__,__LINE__){val[0].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN)}
252 @@log.info("#{__FILE__}:#{__LINE__}: c_boolean = #{val[0]} at #{@filename}:#{@lineno}")
253 result = val[0]
254 }
255
256c_any: Star_code
257#c_any: '*'
258
259#---------------- BODY - relationships ----------------
260
261c_attributes: c_attribute
262 {
263 result = [val[0]]
264 }
265 | c_attributes c_attribute
266 {
267 result = (val[0] << val[1])
268 }
269
270# 'c_attribute' is a node representing a constraint on an attribute in an object model.
271c_attribute: c_attr_head SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK
272 {
273 assert_at(__FILE__,__LINE__){ val[0].kind_of?(OpenEHR::AM::Archetype::Constraint_Model::C_ATTRIBUTE)}
274 c_attribute = val[0]
275 c_attribute.children = val[3]
276 result = c_attribute
277 }
278 | c_attr_head SYM_MATCHES START_REGEXP_BLOCK REGEXP_BODY END_REGEXP_BLOCK # added by akimichi
279 {
280 assert_at(__FILE__,__LINE__){ val[0].kind_of?(OpenEHR::AM::Archetype::Constraint_Model::C_ATTRIBUTE)}
281 result = val[0]
282 }
283 | c_attr_head SYM_MATCHES SYM_START_CBLOCK error SYM_END_CBLOCK
284 {
285 assert_at(__FILE__,__LINE__){ val[0].kind_of?(OpenEHR::AM::Archetype::Constraint_Model::C_ATTRIBUTE)}
286 result = val[0]
287 }
288
289
290c_attr_head: V_ATTRIBUTE_IDENTIFIER c_existence
291 {
292 @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]}, c_existence = #{val[1]} at #{@filename}")
293 result = OpenEHR::AM::Archetype::Constraint_Model::C_SINGLE_ATTRIBUTE.new(
294 :rm_attribute_name => val[0],
295 :existence => val[1]
296 )
297
298 }
299 | V_ATTRIBUTE_IDENTIFIER c_existence c_cardinality
300 {
301 assert_at(__FILE__,__LINE__){ val[2].instance_of?(OpenEHR::AM::Archetype::Constraint_Model::CARDINALITY) }
302 @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER: #{val[0]}, c_existence = #{val[1]}, c_cardinality = #{val[2]} at #{@filename}")
303 result = OpenEHR::AM::Archetype::Constraint_Model::C_MULTIPLE_ATTRIBUTE.new(
304 :rm_attribute_name => val[0],
305 :existence => val[1],
306 :cardinality => val[2]
307 )
308 }
309
310c_attr_values: c_object
311 {
312 result = Array[val[0]]
313 }
314 | c_attr_values c_object
315 {
316 result = (val[0] << val[1])
317 }
318 | c_any # -- to allow a property to have any value
319 {
320 result = Array[val[0]]
321 }
322
323### c_includes: #-- Empty
324### | SYM_INCLUDE assertions
325c_includes: #-- Empty
326 | SYM_INCLUDE invariants
327
328### c_excludes: #-- Empty
329### | SYM_EXCLUDE assertions
330c_excludes: #-- Empty
331 | SYM_EXCLUDE invariants
332
333invariants: invariant
334 | invariants invariant
335
336invariant: any_identifier ':' boolean_expression
337 | boolean_expression
338 | any_identifier ':' error
339
340arch_invariant: #-- no invariant ok
341 | SYM_INVARIANT V_ASSERTION_TEXT
342 | SYM_INVARIANT error
343
344# define all linguistic entries in this part as dADL.
345#arch_ontology: SYM_ONTOLOGY V_DADL_TEXT
346# | SYM_ONTOLOGY error
347
348arch_ontology: SYM_ONTOLOGY dadl_section
349 {
350 result = OpenEHR::AM::Archetype::Ontology::ARCHETYPE_ONTOLOGY.new
351 }
352 | SYM_ONTOLOGY error
353
354
355### dADL section
356dadl_section: dadl_input
357
358dadl_input: attr_vals
359 | complex_object_block
360# | error
361
362attr_vals: attr_val
363 | attr_vals attr_val
364 | attr_vals Semicolon_code attr_val
365# | attr_vals ';' attr_val
366
367attr_val: attr_id SYM_EQ object_block
368 {
369 @@log.info("#{__FILE__}:#{__LINE__}: attr_id = #{val[0]}, object_block = #{val[2]} at #{@filename}:#{@lineno}")
370 }
371
372attr_id: V_ATTRIBUTE_IDENTIFIER
373 {
374 @@log.info("#{__FILE__}:#{__LINE__}: V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}:#{@lineno}")
375 result = val[0]
376 }
377 | V_ATTRIBUTE_IDENTIFIER error
378
379object_block: complex_object_block
380 {
381 result = val[0]
382 }
383 | primitive_object_block
384 {
385 result = val[0]
386 }
387
388complex_object_block: single_attr_object_block
389 {
390 result = val[0]
391 }
392 | multiple_attr_object_block
393 {
394 result = val[0]
395 }
396
397multiple_attr_object_block: untyped_multiple_attr_object_block
398 {
399 result = val[0]
400 }
401 | type_identifier untyped_multiple_attr_object_block
402 {
403 result = val[0]
404 }
405
406untyped_multiple_attr_object_block: multiple_attr_object_block_head keyed_objects SYM_END_DBLOCK
407 {
408 result = val[0]
409 }
410
411multiple_attr_object_block_head: SYM_START_DBLOCK
412 {
413 @@log.info("SYM_START_DBLOCK: #{val[0]} at #{@filename}:#{@lineno}")
414 result = val[0]
415 }
416
417keyed_objects: keyed_object
418 | keyed_objects keyed_object
419
420keyed_object: object_key SYM_EQ object_block
421 {
422 @@log.info("#{__FILE__}:#{__LINE__}: keyed_object = #{val[0]}, object_block = #{val[2]} at #{@filename}:#{@lineno}")
423 }
424
425object_key: Left_bracket_code simple_value Right_bracket_code
426 {
427 @@log.info("object_key: [#{val[1]}] at #{@filename}:#{@lineno}")
428 result = val[1]
429 }
430
431single_attr_object_block: untyped_single_attr_object_block
432 | type_identifier untyped_single_attr_object_block
433untyped_single_attr_object_block: single_attr_object_complex_head SYM_END_DBLOCK # <>
434 {
435 @@log.info("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]} at #{@filename}:#{@lineno}")
436 result = val[0]
437 }
438 | single_attr_object_complex_head attr_vals SYM_END_DBLOCK
439 {
440 @@log.info("#{__FILE__}:#{__LINE__}: single_attr_object_complex_head = #{val[0]}, attr_vals = #{val[1]} at #{@filename}:#{@lineno}")
441 result = val[0]
442 }
443single_attr_object_complex_head: SYM_START_DBLOCK
444primitive_object_block: untyped_primitive_object_block
445 {
446 @@log.info("#{__FILE__}:#{__LINE__}: untyped_primitive_object_block = #{val[0]} at #{@filename}:#{@lineno}")
447 result = val[0]
448 }
449 | type_identifier untyped_primitive_object_block
450 {
451 @@log.info("#{__FILE__}:#{__LINE__}: type_identifier = #{val[0]}, untyped_primitive_object_block = #{val[1]} at #{@filename}:#{@lineno}")
452 result = val[0]
453 }
454untyped_primitive_object_block: SYM_START_DBLOCK primitive_object_value SYM_END_DBLOCK
455 {
456 @@log.info("#{__FILE__}:#{__LINE__}: primitive_object_block = <#{val[1]}> at #{@filename}:#{@lineno}")
457 result = val[1]
458 }
459primitive_object_value: simple_value
460 {
461 result = val[0]
462 }
463 | simple_list_value
464 {
465 result = val[0]
466 }
467 | simple_interval_value
468 {
469 result = val[0]
470 }
471 | term_code
472 {
473 result = val[0]
474 }
475 | term_code_list_value
476 {
477 result = val[0]
478 }
479simple_value: string_value
480 {
481 @@log.info("string_value: #{val[0]} at #{@filename}:#{@lineno}")
482 result = val[0]
483 }
484 | integer_value
485 {
486 @@log.info("integer_value: #{val[0]} at #{@filename}:#{@lineno}")
487 result = val[0]
488 }
489 | real_value
490 {
491 @@log.info("real_value: #{val[0]} at #{@filename}:#{@lineno}")
492 result = val[0]
493 }
494 | boolean_value
495 {
496 @@log.info("boolean_value: #{val[0]} at #{@filename}:#{@lineno}")
497 result = val[0]
498 }
499 | character_value
500 {
501 @@log.info("character_value: #{val[0]} at #{@filename}:#{@lineno}")
502 result = val[0]
503 }
504 | date_value
505 {
506 @@log.info("date_value: #{val[0]} at #{@filename}:#{@lineno}")
507 result = val[0]
508 }
509 | time_value
510 {
511 @@log.info("time_value: #{val[0]} at #{@filename}:#{@lineno}")
512 result = val[0]
513 }
514 | date_time_value
515 {
516 @@log.info("date_time_value: #{val[0]} at #{@filename}:#{@lineno}")
517 result = val[0]
518 }
519 | duration_value
520 {
521 @@log.info("duration_value: #{val[0]} at #{@filename}:#{@lineno}")
522 result = val[0]
523 }
524 | uri_value
525 {
526 @@log.info("uri_value: #{val[0]} at #{@filename}:#{@lineno}")
527 result = val[0]
528 }
529
530simple_list_value: string_list_value
531 | integer_list_value
532 | real_list_value
533 | boolean_list_value
534 | character_list_value
535 | date_list_value
536 | time_list_value
537 | date_time_list_value
538 | duration_list_value
539
540simple_interval_value: integer_interval_value
541 | real_interval_value
542 | date_interval_value
543 | time_interval_value
544 | date_time_interval_value
545 | duration_interval_value
546
547type_identifier: V_TYPE_IDENTIFIER
548 {
549 @@log.info("V_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
550 result = val[0]
551 }
552 | V_GENERIC_TYPE_IDENTIFIER
553 {
554 @@log.info("V_GENERIC_TYPE_IDENTIFIER: #{val[0]} at #{@filename}:#{@lineno}")
555 result = val[0]
556 }
557
558string_value: V_STRING
559 {
560 @@log.info("V_STRING: #{val[0]} at #{@filename}:#{@lineno}")
561 result = val[0]
562 }
563
564string_list_value: V_STRING Comma_code V_STRING
565 | string_list_value Comma_code V_STRING
566 | V_STRING Comma_code SYM_LIST_CONTINUE
567
568integer_value: V_INTEGER
569 {
570 begin
571 integer = Integer(val[0])
572 rescue
573 raise
574 end
575 result = integer
576 }
577 | Plus_code V_INTEGER
578 {
579 begin
580 integer = Integer(val[0])
581 rescue
582 raise
583 end
584 result = integer
585 }
586 | Minus_code V_INTEGER
587 {
588 begin
589 integer = Integer(val[0])
590 rescue
591 raise
592 end
593 result = - integer
594 }
595### | '+' V_INTEGER
596### | '-' V_INTEGER
597
598integer_list_value: integer_value Comma_code integer_value
599 | integer_list_value Comma_code integer_value
600 | integer_value Comma_code SYM_LIST_CONTINUE
601
602integer_interval_value: SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
603 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS integer_value SYM_INTERVAL_DELIM
604 | SYM_INTERVAL_DELIM integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
605 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_ELLIPSIS SYM_LT integer_value SYM_INTERVAL_DELIM
606 | SYM_INTERVAL_DELIM SYM_LT integer_value SYM_INTERVAL_DELIM
607 | SYM_INTERVAL_DELIM SYM_LE integer_value SYM_INTERVAL_DELIM
608 | SYM_INTERVAL_DELIM SYM_GT integer_value SYM_INTERVAL_DELIM
609 | SYM_INTERVAL_DELIM SYM_GE integer_value SYM_INTERVAL_DELIM
610 | SYM_INTERVAL_DELIM integer_value SYM_INTERVAL_DELIM
611
612real_value: V_REAL
613 | Plus_code V_REAL
614 | Minus_code V_REAL
615# | '+' V_REAL
616# | '-' V_REAL
617
618real_list_value: real_value Comma_code real_value
619 | real_list_value Comma_code real_value
620 | real_value Comma_code SYM_LIST_CONTINUE
621
622real_interval_value: SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
623 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS real_value SYM_INTERVAL_DELIM
624 | SYM_INTERVAL_DELIM real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
625 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_ELLIPSIS SYM_LT real_value SYM_INTERVAL_DELIM
626 | SYM_INTERVAL_DELIM SYM_LT real_value SYM_INTERVAL_DELIM
627 | SYM_INTERVAL_DELIM SYM_LE real_value SYM_INTERVAL_DELIM
628 | SYM_INTERVAL_DELIM SYM_GT real_value SYM_INTERVAL_DELIM
629 | SYM_INTERVAL_DELIM SYM_GE real_value SYM_INTERVAL_DELIM
630 | SYM_INTERVAL_DELIM real_value SYM_INTERVAL_DELIM
631
632
633boolean_value: SYM_TRUE
634 | SYM_FALSE
635
636boolean_list_value: boolean_value Comma_code boolean_value
637 | boolean_list_value Comma_code boolean_value
638 | boolean_value Comma_code SYM_LIST_CONTINUE
639
640character_value: V_CHARACTER
641
642character_list_value: character_value Comma_code character_value
643 | character_list_value Comma_code character_value
644 | character_value Comma_code SYM_LIST_CONTINUE
645
646date_value: V_ISO8601_EXTENDED_DATE
647
648date_list_value: date_value Comma_code date_value
649 | date_list_value Comma_code date_value
650 | date_value Comma_code SYM_LIST_CONTINUE
651
652date_interval_value: SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
653 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS date_value SYM_INTERVAL_DELIM
654 | SYM_INTERVAL_DELIM date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
655 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_ELLIPSIS SYM_LT date_value SYM_INTERVAL_DELIM
656 | SYM_INTERVAL_DELIM SYM_LT date_value SYM_INTERVAL_DELIM
657 | SYM_INTERVAL_DELIM SYM_LE date_value SYM_INTERVAL_DELIM
658 | SYM_INTERVAL_DELIM SYM_GT date_value SYM_INTERVAL_DELIM
659 | SYM_INTERVAL_DELIM SYM_GE date_value SYM_INTERVAL_DELIM
660 | SYM_INTERVAL_DELIM date_value SYM_INTERVAL_DELIM
661
662time_value: V_ISO8601_EXTENDED_TIME
663
664time_list_value: time_value Comma_code time_value
665 | time_list_value Comma_code time_value
666 | time_value Comma_code SYM_LIST_CONTINUE
667
668time_interval_value: SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
669 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS time_value SYM_INTERVAL_DELIM
670 | SYM_INTERVAL_DELIM time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
671 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_ELLIPSIS SYM_LT time_value SYM_INTERVAL_DELIM
672 | SYM_INTERVAL_DELIM SYM_LT time_value SYM_INTERVAL_DELIM
673 | SYM_INTERVAL_DELIM SYM_LE time_value SYM_INTERVAL_DELIM
674 | SYM_INTERVAL_DELIM SYM_GT time_value SYM_INTERVAL_DELIM
675 | SYM_INTERVAL_DELIM SYM_GE time_value SYM_INTERVAL_DELIM
676 | SYM_INTERVAL_DELIM time_value SYM_INTERVAL_DELIM
677
678date_time_value: V_ISO8601_EXTENDED_DATE_TIME
679
680date_time_list_value: date_time_value Comma_code date_time_value
681 | date_time_list_value Comma_code date_time_value
682 | date_time_value Comma_code SYM_LIST_CONTINUE
683
684date_time_interval_value: SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
685 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS date_time_value SYM_INTERVAL_DELIM
686 | SYM_INTERVAL_DELIM date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
687 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_ELLIPSIS SYM_LT date_time_value SYM_INTERVAL_DELIM
688 | SYM_INTERVAL_DELIM SYM_LT date_time_value SYM_INTERVAL_DELIM
689 | SYM_INTERVAL_DELIM SYM_LE date_time_value SYM_INTERVAL_DELIM
690 | SYM_INTERVAL_DELIM SYM_GT date_time_value SYM_INTERVAL_DELIM
691 | SYM_INTERVAL_DELIM SYM_GE date_time_value SYM_INTERVAL_DELIM
692 | SYM_INTERVAL_DELIM date_time_value SYM_INTERVAL_DELIM
693
694duration_value: V_ISO8601_DURATION
695 {
696 @@log.info("V_ISO8601_DURATION: #{val[0]} at #{@filename}:#{@lineno}")
697 result = val[0]
698 }
699
700duration_list_value: duration_value Comma_code duration_value
701 | duration_list_value Comma_code duration_value
702 | duration_value Comma_code SYM_LIST_CONTINUE
703
704duration_interval_value: SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
705 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS duration_value SYM_INTERVAL_DELIM
706 | SYM_INTERVAL_DELIM duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
707 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_ELLIPSIS SYM_LT duration_value SYM_INTERVAL_DELIM
708 | SYM_INTERVAL_DELIM SYM_LT duration_value SYM_INTERVAL_DELIM
709 | SYM_INTERVAL_DELIM SYM_LE duration_value SYM_INTERVAL_DELIM
710 | SYM_INTERVAL_DELIM SYM_GT duration_value SYM_INTERVAL_DELIM
711 | SYM_INTERVAL_DELIM SYM_GE duration_value SYM_INTERVAL_DELIM
712 | SYM_INTERVAL_DELIM duration_value SYM_INTERVAL_DELIM
713
714term_code: V_QUALIFIED_TERM_CODE_REF
715 {
716 @@log.info("#{__FILE__}:#{__LINE__}: V_QUALIFIED_TERM_CODE_REF = #{val[0]} at #{@filename}:#{@lineno}")
717 }
718
719term_code_list_value: term_code Comma_code term_code
720 | term_code_list_value Comma_code term_code
721 | term_code Comma_code SYM_LIST_CONTINUE
722
723uri_value: V_URI
724 {
725 @@log.info("#{__FILE__}:#{__LINE__}: V_URI = #{val[0]} at #{@filename}:#{@lineno}")
726 }
727
728
729#---------------------- ASSERTIONS ------------------------
730
731assertions: assertion
732 | assertions assertion
733
734assertion: any_identifier ':' boolean_expression
735 | boolean_expression
736 | any_identifier ':' error
737
738#---------------------- expressions ---------------------
739
740boolean_expression: boolean_leaf
741 | boolean_node
742
743boolean_node: SYM_EXISTS absolute_path
744# | absolute_path
745 | SYM_EXISTS error
746 | relative_path SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK
747 | relative_path SYM_MATCHES START_REGEXP_BLOCK REGEXP_BODY END_REGEXP_BLOCK # added by akimichi
748 | SYM_NOT boolean_leaf
749 | arithmetic_expression '=' arithmetic_expression
750 | arithmetic_expression SYM_NE arithmetic_expression
751 | arithmetic_expression SYM_LT arithmetic_expression
752 | arithmetic_expression SYM_GT arithmetic_expression
753 | arithmetic_expression SYM_LE arithmetic_expression
754 | arithmetic_expression SYM_GE arithmetic_expression
755 | boolean_expression SYM_AND boolean_expression
756 | boolean_expression SYM_OR boolean_expression
757 | boolean_expression SYM_XOR boolean_expression
758 | boolean_expression SYM_IMPLIES boolean_expression
759
760boolean_leaf: Left_parenthesis_code boolean_expression Right_parenthesis_code
761 | SYM_TRUE
762 | SYM_FALSE
763
764arithmetic_expression: arithmetic_leaf
765 | arithmetic_node
766
767arithmetic_node: arithmetic_expression '+' arithmetic_leaf
768 | arithmetic_expression '-' arithmetic_leaf
769 | arithmetic_expression Star_code arithmetic_leaf
770 | arithmetic_expression Slash_code arithmetic_leaf
771 | arithmetic_expression '^' arithmetic_leaf
772
773arithmetic_leaf: Left_parenthesis_code arithmetic_expression Right_parenthesis_code
774 | integer_value
775 | real_value
776 | absolute_path
777
778
779#--------------- THE FOLLOWING SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y -------------
780#--------------- except to remove movable_path ----------------------------------------------------
781
782
783absolute_path: Slash_code
784 | Slash_code relative_path
785# | absolute_path Slash_code relative_path
786
787
788
789relative_path: path_segment
790 | relative_path Slash_code path_segment
791
792path_segment: V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF
793 {
794 @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
795 }
796 | V_ATTRIBUTE_IDENTIFIER
797 {
798 @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{val[0]} at #{@filename}")
799 }
800
801
802#-------------------------------- END SOURCE TAKEN FROM OG_PATH_VALIDATOR.Y ----------------------
803
804
805#---------------- existence, occurrences, cardinality ----------------
806
807c_existence: #-- default to 1..1
808 {
809 result = Range.new(1,1)
810 }
811 | SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK
812 {
813 result = val[3]
814 }
815
816existence_spec: V_INTEGER #-- can only be 0 or 1
817 {
818 begin
819 integer = Integer(val[0])
820 rescue
821 raise
822 end
823 result = integer
824 }
825 | V_INTEGER SYM_ELLIPSIS V_INTEGER #-- can only be 0..0, 0..1, 1..1
826 {
827 begin
828 from_integer = Integer(val[0])
829 to_integer = Integer(val[2])
830 rescue
831 raise
832 end
833 result = Range.new(from_integer,to_integer)
834 }
835
836c_cardinality: SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK
837 {
838 result = OpenEHR::AM::Archetype::Constraint_Model::CARDINALITY.new
839 }
840
841cardinality_spec: occurrence_spec
842 | occurrence_spec Semicolon_code SYM_ORDERED
843 | occurrence_spec Semicolon_code SYM_UNORDERED
844 | occurrence_spec Semicolon_code SYM_UNIQUE
845 | occurrence_spec Semicolon_code SYM_ORDERED Semicolon_code SYM_UNIQUE
846 | occurrence_spec Semicolon_code SYM_UNORDERED Semicolon_code SYM_UNIQUE
847 | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_ORDERED
848 | occurrence_spec Semicolon_code SYM_UNIQUE Semicolon_code SYM_UNORDERED
849
850cardinality_limit_value: integer_value
851 | Star_code
852# | '*'
853
854c_occurrences: #-- default to 1..1
855 | SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK
856 | SYM_OCCURRENCES error
857
858occurrence_spec: cardinality_limit_value #-- single integer or '*'
859 | V_INTEGER SYM_ELLIPSIS cardinality_limit_value
860
861#---------------------- leaf constraint types -----------------------
862
863c_integer_spec: integer_value
864 | integer_list_value
865 | integer_interval_value
866
867c_integer: c_integer_spec
868 | c_integer_spec Semicolon_code integer_value
869 | c_integer_spec Semicolon_code error
870
871c_real_spec: real_value
872 | real_list_value
873 | real_interval_value
874
875c_real: c_real_spec
876 | c_real_spec Semicolon_code real_value
877 | c_real_spec Semicolon_code error
878
879c_date_constraint: V_ISO8601_DATE_CONSTRAINT_PATTERN
880 | date_value
881 | date_interval_value
882
883c_date: c_date_constraint
884 | c_date_constraint Semicolon_code date_value
885 | c_date_constraint Semicolon_code error
886
887c_time_constraint: V_ISO8601_TIME_CONSTRAINT_PATTERN
888 | time_value
889 | time_interval_value
890
891c_time: c_time_constraint
892 | c_time_constraint Semicolon_code time_value
893 | c_time_constraint Semicolon_code error
894
895c_date_time_constraint: V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
896 | date_time_value
897 | date_time_interval_value
898
899c_date_time: c_date_time_constraint
900 | c_date_time_constraint Semicolon_code date_time_value
901 | c_date_time_constraint Semicolon_code error
902
903c_duration_constraint: duration_pattern
904 | duration_pattern Slash_code duration_interval_value
905 | duration_value
906 | duration_interval_value
907
908c_duration: c_duration_constraint
909 | c_duration_constraint Semicolon_code duration_value
910 | c_duration_constraint Semicolon_code error
911
912c_string_spec: V_STRING #-- single value, generates closed list
913 | string_list_value #-- closed list
914 | string_list_value Comma_code SYM_LIST_CONTINUE #-- open list
915# | string_list_value ',' SYM_LIST_CONTINUE #-- open list
916# | V_REGEXP #-- regular expression with "//" or "^^" delimiters
917
918c_string: c_string_spec
919 | c_string_spec Semicolon_code string_value
920 | c_string_spec Semicolon_code error
921
922c_boolean_spec: SYM_TRUE
923 {
924 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => true)
925 }
926 | SYM_FALSE
927 {
928 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => false)
929 }
930 | SYM_TRUE Comma_code SYM_FALSE
931 {
932 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => true,:false_valid => false)
933 }
934 | SYM_FALSE Comma_code SYM_TRUE
935 {
936 result = OpenEHR::AM::Archetype::Constraint_Model::Primitive::C_BOOLEAN.new(:true_valid => false,:false_valid => true)
937 }
938
939c_boolean: c_boolean_spec
940 {
941 result = val[0]
942 }
943 | c_boolean_spec Semicolon_code boolean_value
944 {
945 raise 'Not implemented yet'
946 }
947 | c_boolean_spec Semicolon_code error
948 {
949 raise 'Not implemented yet'
950 }
951
952c_ordinal: c_ordinal_spec
953 | c_ordinal_spec Semicolon_code integer_value
954 | c_ordinal_spec Semicolon_code error
955
956c_ordinal_spec: ordinal
957 | c_ordinal_spec Comma_code ordinal
958
959ordinal: integer_value SYM_INTERVAL_DELIM V_QUALIFIED_TERM_CODE_REF
960 {
961 @in_interval = false
962 @@log.info("#{__FILE__}:#{__LINE__}, #{val[0]}|#{val[2]} at #{@filename}")
963 }
964
965#c_code_phrase: V_TERM_CODE_CONSTRAINT #-- e.g. "[local::at0040, at0041; at0040]"
966c_code_phrase: term_code_constraint_section #-- e.g. "[local::at0040, at0041; at0040]"
967 | V_QUALIFIED_TERM_CODE_REF
968
969#term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body Right_bracket_code
970term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body END_TERM_CODE_CONSTRAINT
971term_code_body: # empty
972 | TERM_CODE
973 | term_code_body TERM_CODE
974### term_code_constraint_section: START_TERM_CODE_CONSTRAINT term_code_body END_TERM_CODE_CONSTRAINT
975### term_code_body: TERM_CODE
976### | term_code_body TERM_CODE
977
978# A Constraint_Ref is a proxy for a set of constraints on an object.
979constraint_ref: V_LOCAL_TERM_CODE_REF #-- e.g. "ac0003"
980
981any_identifier: type_identifier
982 | V_ATTRIBUTE_IDENTIFIER
983 {
984 @@log.info("#{__FILE__}:#{__LINE__}, V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}")
985 }
986
987
988#----------------- TAKEN FROM DADL_VALIDATOR.Y -------------------
989#----------------- DO NOT MODIFY -------------------
990#---------------------- BASIC DATA VALUES -----------------------
991
992duration_pattern: V_ISO8601_DURATION_CONSTRAINT_PATTERN
993
994
995
996---- header
997
998$:.unshift File.join(File.dirname(__FILE__))
999require 'logger'
1000require 'lib/util.rb'
1001require 'lib/scanner.rb'
1002#require 'lib/model.rb'
1003require 'rubygems'
1004require 'am.rb'
1005$DEBUG = true
1006
1007
1008
1009---- inner
1010
1011def assert_at(file,line, message = "")
1012 unless yield
1013 raise "Assertion failed !: #{file}, #{line}: #{message}"
1014 end
1015end
1016
1017@@log = Logger.new('log/parser.log','daily')
1018@@dadl_scanner = OpenEHR::ADL::Scanner::DADL::RootScanner.new
1019@@cadl_scanner = OpenEHR::ADL::Scanner::CADL::RootScanner.new
1020
1021###----------/* keywords */ ---------------------------------------------
1022@@adl_reserved = {
1023 'archetype' => :SYM_ARCHETYPE,
1024 'adl_version' => :SYM_ADL_VERSION,
1025 'controlled' => :SYM_IS_CONTROLLED,
1026 'specialize' => :SYM_SPECIALIZE,
1027 'concept' => :SYM_CONCEPT,
1028 'language' => :SYM_LANGUAGE,
1029 'description' => :SYM_DESCRIPTION,
1030 'definition' => :SYM_DEFINITION,
1031 'invariant' => :SYM_INVARIANT,
1032 'ontology' => :SYM_ONTOLOGY,
1033 'matches' => :SYM_MATCHES,
1034 'is_in' => :SYM_MATCHES,
1035 'occurrences' => :SYM_OCCURRENCES,
1036 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
1037 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
1038 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
1039}
1040
1041@@dadl_reserved = {
1042 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
1043 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
1044 'infinity' => :SYM_INFINITY # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
1045}
1046
1047@@cadl_reserved = {
1048 'then' => :SYM_THEN, # [Tt][Hh][Ee][Nn]
1049 'else' => :SYM_ELSE, # [Ee][Ll][Ss][Ee]
1050 'and' => :SYM_AND, # [Aa][Nn][Dd]
1051 'or' => :SYM_OR, # [Oo][Rr]
1052 'xor' => :SYM_XOR, # [Xx][Oo][Rr]
1053 'not' => :SYM_NOT, # [Nn][Oo][Tt]
1054 'implies' => :SYM_IMPLIES, # [Ii][Mm][Pp][Ll][Ii][Ee][Ss]
1055 'true' => :SYM_TRUE, #[Tt][Rr][Uu][Ee] -- -> SYM_TRUE
1056 'false' => :SYM_FALSE, # [Ff][Aa][Ll][Ss][Ee] -- -> SYM_FALSE
1057 'forall' => :SYM_FORALL, # [Ff][Oo][Rr][_][Aa][Ll][Ll]
1058 'exists' => :SYM_EXISTS, # [Ee][Xx][Ii][Ss][Tt][Ss]
1059 'existence' => :SYM_EXISTENCE, # [Ee][Xx][Iu][Ss][Tt][Ee][Nn][Cc][Ee]
1060 'occurrences' => :SYM_OCCURRENCES, # [Oo][Cc][Cc][Uu][Rr][Rr][Ee][Nn][Cc][Ee][Ss]
1061 'cardinality' => :SYM_CARDINALITY, # [Cc][Aa][Rr][Dd][Ii][Nn][Aa][Ll][Ii][Tt][Yy]
1062 'ordered' => :SYM_ORDERED, # [Oo][Rr][Dd][Ee][Rr][Ee][Dd]
1063 'unordered' => :SYM_UNORDERED, # [Uu][Nn][Oo][Rr][Dd][Ee][Rr][Ee][Dd]
1064 'unique' => :SYM_UNIQUE, # [Uu][Nn][Ii][Qq][Uu][Ee]
1065 'matches' => :SYM_MATCHES, # [Mm][Aa][Tt][Cc][Hh][Ee][Ss]
1066 'is_in' => :SYM_MATCHES, # [Ii][Ss][_][Ii][Nn]
1067 'invariant' => :SYM_INVARIANT, # [Ii][Nn][Vv][Aa][Rr][Ii][Aa][Nn][Tt]
1068 'infinity' => :SYM_INFINITY, # [Ii][Nn][Ff][Ii][Nn][Ii][Tt][Yy] -- -> SYM_INFINITY
1069 'use_node' => :SYM_USE_NODE, # [Uu][Ss][Ee][_][Nn][Oo][Dd][Ee]
1070 'use_archetype' => :SYM_ALLOW_ARCHETYPE, # [Uu][Ss][Ee][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
1071 'allow_archetype' => :SYM_ALLOW_ARCHETYPE, # [Aa][Ll][Ll][Oo][Ww][_][Aa][Rr][Cc][Hh][Ee][Tt][Yy][Pp][Ee]
1072 'include' => :SYM_INCLUDE, # [Ii][Nn][Cc][Ll][Uu][Dd][Ee]
1073 'exclude' => :SYM_EXCLUDE # [Ee][Xx][Cc][Ll][Uu][Dd][Ee]
1074}
1075
1076
1077###----------/* Scanner */ -----------------------------------------------
1078
1079def scan
1080 until @data.nil? do
1081 case @adl_type.last
1082 when :adl
1083 @data = scan_adl(@data) do |sym, val|
1084 yield sym, val
1085 end
1086 when :dadl
1087 @data = scan_dadl(@data) do |sym, val|
1088 yield sym, val
1089 end
1090 when :cadl
1091 @data = scan_cadl(@data) do |sym, val|
1092 yield sym, val
1093 end
1094 when :regexp
1095 @data = scan_regexp(@data) do |sym, val|
1096 yield sym, val
1097 end
1098 else
1099 raise
1100 end
1101 @data = $' # variable $' receives the string after the match
1102 end
1103 yield :EOF, nil
1104 yield false, '$'
1105end # of scan
1106
1107def scan_adl(data)
1108 until data.nil? do
1109 case @adl_type.last
1110 when :adl
1111# puts "Entering scan_adl"
1112 case data
1113 when /\A\n/ # carriage return
1114 @lineno += 1
1115 ;
1116 when /\A[ \t\r\f]+/ #just drop it
1117 ;
1118 when /\A--.*\n/ # single line comment
1119 @lineno += 1
1120 @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
1121 ;
1122 when /\Adescription/ # description
1123 yield :SYM_DESCRIPTION, :SYM_DESCRIPTION
1124 when /\Adefinition/ # definition
1125 yield :SYM_DEFINITION, :SYM_DEFINITION
1126# @adl_type.push(:cadl)
1127 ###----------/* symbols */ -------------------------------------------------
1128 when /\A[A-Z][a-zA-Z0-9_]*/
1129 yield :V_TYPE_IDENTIFIER, $&
1130 when /\A[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z][a-zA-Z0-9_-]+\.[a-zA-Z0-9]+/ #V_ARCHETYPE_ID
1131 yield :V_ARCHETYPE_ID, $&
1132 when /\A[a-z][a-zA-Z0-9_]*/
1133# word = $&.downcase
1134 word = $&
1135 if @@adl_reserved[word]
1136 @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: @@adl_reserved = #{@@adl_reserved[word]} at #{@filename}:#{@lineno}")
1137 yield @@adl_reserved[word], @@adl_reserved[word]
1138 elsif #/\A[A-Z][a-zA-Z0-9_]*/
1139 @@log.info("#{__FILE__}:#{__LINE__}: scan_adl: V_ATTRIBUTE_IDENTIFIER = #{$&} at #{@filename}:#{@lineno}")
1140 yield :V_ATTRIBUTE_IDENTIFIER, $&
1141 end
1142 when /\A\=/ # =
1143 yield :SYM_EQ, :SYM_EQ
1144 when /\A\>=/ # >=
1145 yield :SYM_GE, :SYM_GE
1146 when /\A\<=/ # <=
1147 yield :SYM_LE, :SYM_LE
1148 when /\A\</ # <
1149 if @in_interval
1150# @start_block_received = false
1151 yield :SYM_LT, :SYM_LT
1152 else
1153# @start_block_received = true
1154 @adl_type.push(:dadl)
1155 yield :SYM_START_DBLOCK, $&
1156 end
1157 when /\A\>/ # >
1158 if @in_interval
1159 yield :SYM_GT, :SYM_GT
1160 else
1161 adl_type = @adl_type.pop
1162# puts "Escaping #{adl_type}"
1163 assert_at(__FILE__,__LINE__){adl_type == :dadl}
1164 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
1165 end
1166 when /\A\{/ # {
1167 @adl_type.push(:cadl)
1168 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")
1169 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
1170 when /\A\}/ # }
1171 adl_type = @adl_type.pop
1172# puts "Escaping #{adl_type}"
1173 assert_at(__FILE__,__LINE__){adl_type == :cadl}
1174 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")
1175 yield :SYM_END_CBLOCK, $&
1176 when /\A\-/ # -
1177 yield :Minus_code, :Minus_code
1178 when /\A\+/ # +
1179 yield :Plus_code, :Plus_code
1180 when /\A\*/ # *
1181 yield :Star_code, :Star_code
1182 when /\A\// # /
1183 yield :Slash_code, :Slash_code
1184 when /\A\^/ # ^
1185 yield :Caret_code, :Caret_code
1186 when /\A\=/ # =
1187 yield :Equal_code, :Equal_code
1188 when /\A\.\.\./ # ...
1189 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
1190 when /\A\.\./ # ..
1191 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
1192 when /\A\./ # .
1193 yield :Dot_code, :Dot_code
1194 when /\A\;/ # ;
1195 yield :Semicolon_code, :Semicolon_code
1196 when /\A\,/ # ,
1197 yield :Comma_code, :Comma_code
1198 when /\A\:/ # :
1199 yield :Colon_code, :Colon_code
1200 when /\A\!/ # !
1201 yield :Exclamation_code, :Exclamation_code
1202 when /\A\(/ # (
1203 yield :Left_parenthesis_code, :Left_parenthesis_code
1204 when /\A\)/ # )
1205 yield :Right_parenthesis_code, :Right_parenthesis_code
1206 when /\A\$/ # $
1207 yield :Dollar_code, :Dollar_code
1208 when /\A\?\?/ # ??
1209 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
1210 when /\A\?/ # ?
1211 yield :Question_mark_code, :Question_mark_code
1212 when /\A[0-9]+\.[0-9]+(\.[0-9]+)*/ # ?
1213 yield :V_VERSION_STRING, :V_VERSION_STRING
1214 when /\A\|/ # |
1215 if @in_interval
1216 @in_interval = false
1217 else
1218 @in_interval = true
1219 end
1220 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
1221 when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/
1222# when /\A\[[a-zA-Z0-9()\._-]+\:\:[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
1223 yield :V_QUALIFIED_TERM_CODE_REF, $&
1224 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF
1225 yield :V_LOCAL_TERM_CODE_REF, $&
1226 when /\A\[/ # [
1227 yield :Left_bracket_code, :Left_bracket_code
1228 when /\A\]/ # ]
1229 yield :Right_bracket_code, :Right_bracket_code
1230
1231 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
1232 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
1233 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
1234 yield :V_LOCAL_CODE, $&
1235 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-]-
1236 yield :V_ISO8601_EXTENDED_DATE_TIME, $&
1237 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]
1238 yield :V_ISO8601_EXTENDED_TIME, $&
1239 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
1240 yield :V_ISO8601_EXTENDED_DATE, $&
1241 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
1242 yield :V_GENERIC_TYPE_IDENTIFIER, $&
1243 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
1244 yield :V_INTEGER, $&
1245 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
1246 yield :V_REAL, $&
1247 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
1248 when /\A"([^"]*)"/m #V_STRING
1249 yield :V_STRING, $1
1250 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
1251 yield :V_URI, $&
1252 when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|P([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
1253 yield :V_ISO8601_DURATION, $&
1254 when /\A\S/ #UTF8CHAR
1255 yield :UTF8CHAR, $&
1256 end
1257 data = $' # variable $' receives the string after the match
1258 when :dadl
1259# puts "Entering scan_dadl"
1260 data = scan_dadl(data) do |sym, val|
1261 yield sym, val
1262 end
1263 when :cadl
1264# puts "Entering scan_cadl"
1265 data = scan_cadl(data) do |sym, val|
1266 yield sym, val
1267 end
1268 when :regexp
1269# puts "Entering scan_regexp"
1270 data = scan_regexp(data) do |sym, val|
1271 yield sym, val
1272 end
1273 when :term_constraint
1274# puts "Entering scan_term_constraint"
1275 data = scan_term_constraint(data) do |sym, val|
1276 yield sym, val
1277 end
1278 else
1279 raise
1280 end
1281 end
1282end # scan_adl
1283
1284
1285def scan_cadl(data)
1286 until data.nil? do
1287 case @adl_type.last
1288 when :cadl
1289# puts "Entering scan_cadl"
1290 case scanned = @@cadl_scanner.parse(data)
1291 when Yaparc::Result::OK
1292 if scanned.value[0] == :START_V_C_DOMAIN_TYPE_BLOCK
1293 @in_c_domain_type = true
1294 @adl_type.push(:dadl)
1295 yield scanned.value
1296 else
1297 yield scanned.value
1298 end
1299 data = scanned.input
1300 end
1301
1302 case data
1303 when /\A\n/ # carriage return
1304 @lineno += 1
1305 ;
1306 when /\A[ \t\r\f]+/ #just drop it
1307 ;
1308 when /\A--.*\n/ # single line comment
1309 @lineno += 1
1310 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
1311 ;
1312 ###----------/* symbols */ -------------------------------------------------
1313 when /\A\=/ # =
1314 yield :SYM_EQ, :SYM_EQ
1315 when /\A\>=/ # >=
1316 yield :SYM_GE, :SYM_GE
1317 when /\A\<=/ # <=
1318 yield :SYM_LE, :SYM_LE
1319### when /\A[A-Z][a-zA-Z0-9_]*[ \n]*\</ # V_C_DOMAIN_TYPE
1320### @in_c_domain_type = true
1321### @adl_type.push(:dadl)
1322### yield :START_V_C_DOMAIN_TYPE_BLOCK, $&
1323 when /\A\</ # <
1324 if @in_interval
1325 yield :SYM_LT, :SYM_LT
1326 else
1327 @adl_type.push(:dadl)
1328 yield :SYM_START_DBLOCK, $&
1329 end
1330 when /\A\>/ # >
1331 if @in_interval
1332 yield :SYM_GT, :SYM_GT
1333 else
1334 adl_type = @adl_type.pop
1335# puts "Escaping #{adl_type}"
1336 assert_at(__FILE__,__LINE__){adl_type == :dadl}
1337 yield :SYM_END_DBLOCK, :SYM_END_DBLOCK
1338 end
1339 when /\A\-/ # -
1340 yield :Minus_code, :Minus_code
1341 when /\A\+/ # +
1342 yield :Plus_code, :Plus_code
1343 when /\A\*/ # *
1344 yield :Star_code, :Star_code
1345 when /\A\// # /
1346 yield :Slash_code, :Slash_code
1347 when /\A\^/ # ^
1348 yield :Caret_code, :Caret_code
1349 when /\A\.\.\./ # ...
1350 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
1351 when /\A\.\./ # ..
1352 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
1353 when /\A\./ # .
1354 yield :Dot_code, :Dot_code
1355 when /\A\;/ # ;
1356 yield :Semicolon_code, :Semicolon_code
1357 when /\A\,/ # ,
1358 yield :Comma_code, :Comma_code
1359 when /\A\:/ # :
1360 yield :Colon_code, :Colon_code
1361 when /\A\!/ # !
1362 yield :Exclamation_code, :Exclamation_code
1363 when /\A\(/ # (
1364 yield :Left_parenthesis_code, :Left_parenthesis_code
1365 when /\A\)/ # )
1366 yield :Right_parenthesis_code, :Right_parenthesis_code
1367 when /\A\{\// #V_REGEXP
1368 if @adl_type.last != :regexp
1369 @in_regexp = true
1370 @adl_type.push(:regexp)
1371 yield :START_REGEXP_BLOCK, :START_REGEXP_BLOCK
1372 else
1373 raise
1374 end
1375# yield :V_REGEXP, :V_REGEXP
1376 when /\A\{/ # {
1377 @adl_type.push(:cadl)
1378 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: entering cADL at #{@filename}:#{@lineno}")
1379 yield :SYM_START_CBLOCK, :SYM_START_CBLOCK
1380 when /\A\}/ # }
1381 adl_type = @adl_type.pop
1382# puts "Escaping #{adl_type}"
1383 assert_at(__FILE__,__LINE__){adl_type == :cadl}
1384 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: exiting cADL at #{@filename}:#{@lineno}")
1385 yield :SYM_END_CBLOCK, :SYM_END_CBLOCK
1386 when /\A\$/ # $
1387 yield :Dollar_code, :Dollar_code
1388 when /\A\?\?/ # ??
1389 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
1390 when /\A\?/ # ?
1391 yield :Question_mark_code, :Question_mark_code
1392 when /\A\|/ # |
1393 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
1394 if @in_interval
1395 @in_interval = false
1396 else
1397# @in_interval = false
1398 @in_interval = true
1399 end
1400 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
1401 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
1402
1403 when /\A\[[a-zA-Z0-9._\-]+::[a-zA-Z0-9._\-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
1404 yield :V_QUALIFIED_TERM_CODE_REF, $&
1405 when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
1406 yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
1407 when /\A\[([a-zA-Z0-9()._\-]+::[a-zA-Z0-9._\_-]+)\]/
1408 yield :V_TERM_CODE_CONSTRAINT, :V_TERM_CODE_CONSTRAINT
1409 when /\A\[[a-zA-Z0-9\(\)\._\-]+::[ \t\n]*/
1410 @adl_type.push(:term_constraint)
1411 yield :START_TERM_CODE_CONSTRAINT, $&
1412 when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF
1413 yield :V_LOCAL_TERM_CODE_REF, $&
1414 when /\A\[/ # [
1415 yield :Left_bracket_code, :Left_bracket_code
1416 when /\A\]/ # ]
1417 yield :Right_bracket_code, :Right_bracket_code
1418 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
1419 yield :V_GENERIC_TYPE_IDENTIFIER, $&
1420 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X][T\t][hH?X][hH?X]:[mM?X][mM?X]:[sS?X][sS?X]/
1421 yield :V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN, $&
1422 when /\A[yY][yY][yY][yY]-[mM?X][mM?X]-[dD?X][dD?X]/
1423 yield :V_ISO8601_DATE_CONSTRAINT_PATTERN, $&
1424 when /\A[hH][hH]:[mM?X][mM?X]:[sS?X][sS?X]/
1425 yield :V_ISO8601_TIME_CONSTRAINT_PATTERN, $&
1426 when /\A[a-z][a-zA-Z0-9_]*/
1427 word = $&.dup
1428 if @@cadl_reserved[word.downcase]
1429 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]
1430 else
1431 @@log.info("#{__FILE__}:#{__LINE__}: scan_cadl: V_ATTRIBUTE_IDENTIFIER = #{word} at #{@filename}:#{@lineno}")
1432 yield :V_ATTRIBUTE_IDENTIFIER, word #V_ATTRIBUTE_IDENTIFIER /\A[a-z][a-zA-Z0-9_]*/
1433 end
1434 when /\A[A-Z][a-zA-Z0-9_]*/
1435 word = $&.dup
1436 if @@cadl_reserved[word.downcase]
1437 yield @@cadl_reserved[word.downcase], @@cadl_reserved[word.downcase]
1438 else
1439 yield :V_TYPE_IDENTIFIER, $&
1440 end
1441 when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
1442 yield :V_LOCAL_CODE, $&
1443 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-]-
1444 yield :V_ISO8601_EXTENDED_DATE_TIME, $&
1445 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]
1446 yield :V_ISO8601_EXTENDED_TIME, $&
1447 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
1448 yield :V_ISO8601_EXTENDED_DATE, $&
1449 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
1450 yield :V_INTEGER, $&
1451 when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
1452 yield :V_REAL, $&
1453 when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
1454 when /\A"([^"]*)"/m #V_STRING
1455 yield :V_STRING, $1
1456 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
1457 yield :V_URI, $&
1458### when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|P([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
1459### yield :V_ISO8601_DURATION, $&
1460 when /\A\S/ #UTF8CHAR
1461 yield :UTF8CHAR, $&
1462 else
1463 raise
1464 end
1465 data = $' # variable $' receives the string after the match
1466 when :adl
1467# puts "Entering scan_adl"
1468 data = scan_adl(data) do |sym, val|
1469 yield sym, val
1470 end
1471 when :dadl
1472# puts "Entering scan_dadl"
1473 data = scan_dadl(data) do |sym, val|
1474 yield sym, val
1475 end
1476 when :regexp
1477# puts "Entering scan_regexp"
1478 data = scan_regexp(data) do |sym, val|
1479 yield sym, val
1480 end
1481 when :term_constraint
1482# puts "Entering scan_term_constraint"
1483 data = scan_term_constraint(data) do |sym, val|
1484 yield sym, val
1485 end
1486 else
1487 raise
1488 end
1489 end # of until
1490end # of scan_cadl
1491
1492def scan_dadl(data)
1493 until data.nil? do
1494 case @adl_type.last
1495 when :dadl
1496# puts "Entering scan_dadl"
1497 case scanned = @@dadl_scanner.parse(data)
1498 when Yaparc::Result::OK
1499 yield scanned.value
1500 data = scanned.input
1501 else
1502 end
1503
1504 case data
1505 when /\A\n/ # carriage return
1506 @lineno += 1
1507 ;
1508 when /\A[ \t\r\f]+/ #just drop it
1509 ;
1510 when /\A--.*\n/ # single line comment
1511 @lineno += 1
1512 @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: COMMENT = #{$&} at #{@filename}:#{@lineno}")
1513 ;
1514 ###----------/* symbols */ -------------------------------------------------
1515 when /\A\=/ # =
1516 yield :SYM_EQ, :SYM_EQ
1517 when /\A\>\=/ # >=
1518 yield :SYM_GE, :SYM_GE
1519 when /\A\<\=/ # <=
1520 yield :SYM_LE, :SYM_LE
1521 when /\A\</ # <
1522 if @in_interval
1523 yield :SYM_LT, :SYM_LT
1524 else
1525 @adl_type.push(:dadl)
1526 yield :SYM_START_DBLOCK, :SYM_START_DBLOCK
1527 end
1528 when /\A\>/ # >
1529 if @in_interval
1530# @in_interval = false
1531 yield :SYM_GT, :SYM_GT
1532 elsif @in_c_domain_type == true
1533 assert_at(__FILE__,__LINE__){@adl_type.last == :dadl}
1534 adl_type = @adl_type.pop
1535 if @adl_type.last == :cadl
1536 @in_c_domain_type = false
1537 yield :END_V_C_DOMAIN_TYPE_BLOCK, $&
1538 else
1539 yield :SYM_END_DBLOCK, $&
1540 end
1541 elsif @in_c_domain_type == false
1542 adl_type = @adl_type.pop
1543# puts "Escaping #{adl_type}"
1544 assert_at(__FILE__,__LINE__){adl_type == :dadl}
1545 yield :SYM_END_DBLOCK, $&
1546 else
1547 raise
1548 end
1549 when /\A\-/ # -
1550 yield :Minus_code, :Minus_code
1551 when /\A\+/ # +
1552 yield :Plus_code, :Plus_code
1553 when /\A\*/ # *
1554 yield :Star_code, :Star_code
1555 when /\A\// # /
1556 yield :Slash_code, :Slash_code
1557 when /\A\^/ # ^
1558 yield :Caret_code, :Caret_code
1559 when /\A\.\.\./ # ...
1560 yield :SYM_LIST_CONTINUE, :SYM_LIST_CONTINUE
1561 when /\A\.\./ # ..
1562 yield :SYM_ELLIPSIS, :SYM_ELLIPSIS
1563 when /\A\./ # .
1564 yield :Dot_code, :Dot_code
1565 when /\A\;/ # ;
1566 yield :Semicolon_code, :Semicolon_code
1567 when /\A\,/ # ,
1568 yield :Comma_code, :Comma_code
1569 when /\A\:/ # :
1570 yield :Colon_code, :Colon_code
1571 when /\A\!/ # !
1572 yield :Exclamation_code, :Exclamation_code
1573 when /\A\(/ # (
1574 yield :Left_parenthesis_code, :Left_parenthesis_code
1575 when /\A\)/ # )
1576 yield :Right_parenthesis_code, :Right_parenthesis_code
1577 when /\A\$/ # $
1578 yield :Dollar_code, :Dollar_code
1579 when /\A\?\?/ # ??
1580 yield :SYM_DT_UNKNOWN, :SYM_DT_UNKNOWN
1581 when /\A\?/ # ?
1582 yield :Question_mark_code, :Question_mark_code
1583 when /\A\|/ # |
1584 @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: @in_interval = #{@in_interval} at #{@filename}:#{@lineno}")
1585 if @in_interval
1586 @in_interval = false
1587 else
1588# @in_interval = false
1589 @in_interval = true
1590 end
1591 @@log.info("#{__FILE__}:#{__LINE__}: scan_dadl: SYM_INTERVAL_DELIM at #{@filename}:#{@lineno}")
1592 yield :SYM_INTERVAL_DELIM, :SYM_INTERVAL_DELIM
1593### when /\A\[[a-zA-Z0-9()\._-]+::[a-zA-Z0-9\._-]+\]/ #V_QUALIFIED_TERM_CODE_REF form [ICD10AM(1998)::F23]
1594### yield :V_QUALIFIED_TERM_CODE_REF, $&
1595### when /\A\[[a-zA-Z0-9][a-zA-Z0-9._\-]*\]/ #V_LOCAL_TERM_CODE_REF
1596### yield :V_LOCAL_TERM_CODE_REF, $&
1597### when /\A\[[a-zA-Z0-9._\- ]+::[a-zA-Z0-9._\- ]+\]/ #ERR_V_QUALIFIED_TERM_CODE_REF
1598### yield :ERR_V_QUALIFIED_TERM_CODE_REF, $&
1599 when /\A\[/ # [
1600 yield :Left_bracket_code, :Left_bracket_code
1601 when /\A\]/ # ]
1602 yield :Right_bracket_code, :Right_bracket_code
1603### when /\A[A-Z][a-zA-Z0-9_-]*/
1604### yield :V_TYPE_IDENTIFIER, $&
1605### when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
1606### yield :V_GENERIC_TYPE_IDENTIFIER, $&
1607### when /\A[a-z][a-zA-Z0-9_]*/
1608### word = $&.downcase
1609### if @@dadl_reserved[word]
1610### yield @@dadl_reserved[word], @@dadl_reserved[word]
1611### else
1612### yield :V_ATTRIBUTE_IDENTIFIER, $&
1613### end
1614### when /\Aa[ct][0-9.]+/ #V_LOCAL_CODE
1615### yield :V_LOCAL_CODE, $&
1616 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-]-
1617 yield :V_ISO8601_EXTENDED_DATE_TIME, $&
1618 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]
1619 yield :V_ISO8601_EXTENDED_TIME, $&
1620 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
1621 yield :V_ISO8601_EXTENDED_DATE, $&
1622 when /\A[A-Z][a-zA-Z0-9_]*<[a-zA-Z0-9,_<>]+>/ #V_GENERIC_TYPE_IDENTIFIER
1623 yield :V_GENERIC_TYPE_IDENTIFIER, $&
1624 when /\A[0-9]+|[0-9]+[eE][+-]?[0-9]+/ #V_INTEGER
1625 yield :V_INTEGER, $&
1626### when /\A[0-9]+\.[0-9]+|[0-9]+\.[0-9]+[eE][+-]?[0-9]+ / #V_REAL
1627### yield :V_REAL, $&
1628 # when /\A"((?:[^"\\]+|\\.)*)"/ #V_STRING
1629### when /\A"([^"]*)"/m #V_STRING
1630### yield :V_STRING, $1
1631 when /\A[a-z]+:\/\/[^<>|\\{}^~"\[\] ]*/ #V_URI
1632 yield :V_URI, $&
1633### when /\AP([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?T([0-9]+[hH])?([0-9]+[mM])?([0-9]+[sS])?|P([0-9]+[yY])?([0-9]+[mM])?([0-9]+[wW])?([0-9]+[dD])?/ #V_ISO8601_DURATION PnYnMnWnDTnnHnnMnnS
1634### yield :V_ISO8601_DURATION, $&
1635 when /\A\S/ #UTF8CHAR
1636 yield :UTF8CHAR, $&
1637 end
1638 data = $' # variable $' receives the string after the match
1639 when :adl
1640# puts "Entering scan_adl"
1641 data = scan_adl(data) do |sym, val|
1642 yield sym, val
1643 end
1644 when :cadl
1645# puts "Entering scan_cadl"
1646 data = scan_cadl(data) do |sym, val|
1647 yield sym, val
1648 end
1649 when :regexp
1650# puts "Entering scan_regexp"
1651 data = scan_regexp(data) do |sym, val|
1652 yield sym, val
1653 end
1654 when :term_constraint
1655# puts "Entering scan_term_constraint"
1656 data = scan_term_constraint(data) do |sym, val|
1657 yield sym, val
1658 end
1659 else
1660 raise
1661 end
1662 end
1663end # of scan_dadl
1664
1665def scan_regexp(data)
1666 until data.nil? do
1667 case @adl_type.last
1668 when :regexp
1669# puts "Entering scan_regexp"
1670 case data
1671 when /\A\/\}/ #V_REGEXP
1672 if @adl_type.last == :regexp
1673 @in_regexp = false
1674 @adl_type.pop
1675 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
1676 else
1677 raise
1678 end
1679 when /\A(.*)(\/\})/ #V_REGEXP
1680 yield :REGEXP_BODY, $1
1681 if @adl_type.last == :regexp
1682 @in_regexp = false
1683 @adl_type.pop
1684 yield :END_REGEXP_BLOCK, :END_REGEXP_BLOCK
1685 else
1686 raise
1687 end
1688 else
1689 raise data
1690 end
1691 data = $' # variable $' receives the string after the match
1692 when :adl
1693# puts "Entering scan_adl"
1694 data = scan_adl(data) do |sym, val|
1695 yield sym, val
1696 end
1697 when :dadl
1698# puts "Entering scan_dadl"
1699 data = scan_dadl(data) do |sym, val|
1700 yield sym, val
1701 end
1702 when :cadl
1703# puts "Entering scan_cadl"
1704 data = scan_cadl(data) do |sym, val|
1705 yield sym, val
1706 end
1707 when :term_constraint
1708# puts "Entering scan_term_constraint"
1709 data = scan_term_constraint(data) do |sym, val|
1710 yield sym, val
1711 end
1712 else
1713 raise
1714 end
1715 end
1716end # of scan_regexp
1717
1718def scan_term_constraint(data)
1719 until data.nil? do
1720 case @adl_type.last
1721 when :term_constraint
1722# puts "Entering scan_term_constraint"
1723 case data
1724 when /\A\n/ # carriage return
1725 @lineno += 1
1726 ;
1727 when /\A[ \t\r\f]+/ #just drop it
1728 ;
1729 when /\A--.*$/ # single line comment
1730 @lineno += 1
1731 @@log.info("#{__FILE__}:#{__LINE__}: scan_term_constraint: COMMENT = #{$&} at #{@filename}:#{@lineno}")
1732 ;
1733 when /\A[a-zA-Z0-9\._\-]+[ \t]*,/ # match any line, with ',' termination
1734 yield :TERM_CODE, $&
1735 when /\A[a-zA-Z0-9\._\-]+[ \t]*;/ #match second last line with ';' termination (assumed value)
1736 yield :TERM_CODE, $&
1737# when /\A[a-zA-Z0-9\._\-]+[ \t]*\]/ # match final line, terminating in ']'
1738 when /\A[a-zA-Z0-9\._\-]*[ \t]*\]/ # match final line, terminating in ']'
1739 adl_type = @adl_type.pop
1740 assert_at(__FILE__,__LINE__){adl_type == :term_constraint}
1741 yield :END_TERM_CODE_CONSTRAINT, $&
1742 else
1743 raise "data = #{data}"
1744 end
1745 data = $' # variable $' receives the string after the match
1746 when :adl
1747# puts "Entering scan_adl"
1748 data = scan_adl(data) do |sym, val|
1749 yield sym, val
1750 end
1751 when :dadl
1752# puts "Entering scan_dadl"
1753 data = scan_dadl(data) do |sym, val|
1754 yield sym, val
1755 end
1756 when :cadl
1757# puts "Entering scan_cadl"
1758 data = scan_cadl(data) do |sym, val|
1759 yield sym, val
1760 end
1761 else
1762 raise
1763 end
1764 end
1765end # of scan_term_constraint
1766
1767
1768def parse(data, filename, lineno = 1, debug = false)
1769 @yydebug = true
1770 @parsestring = data
1771 @data = data
1772 @lineno = lineno
1773 @filename = filename
1774 @adl_type = [:adl] # {:adl, :cadl, :dadl}
1775 @in_regexp = false
1776 @in_interval = false
1777 @in_c_domain_type = false
1778 yyparse self, :scan
1779end
1780
1781def on_error( t, v, values)
1782 raise Racc::ParseError, "#{@filename}:#{@lineno}: Inline syntax error on #{v.inspect}"
1783end
1784
1785
1786
1787
1788
1789
1790
1791### Local Variables:
1792### mode:ruby
1793### mode:font-lock
1794### comment-column:0
1795### comment-start: "### "
1796### comment-end:""
1797### End:
1798
1799
1800
1801
Note: See TracBrowser for help on using the repository browser.