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

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

parsing c_any fails

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