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

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

created an experimental openehr_models gem package

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