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

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

begin to add scanner module using yaparc

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