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

Last change on this file since 4 was 4, checked in by KOBAYASHI, Shinji, 16 years ago

restructuring repository tree

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