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

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

working on dADL language tag

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