openehr 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,6 @@
1
+ === 1.1.1
2
+ parser bug fixed around openehr/am/openehr_profile/data_types/quantity
3
+
1
4
  === 1.1.0
2
5
  open_ehr package will change to openehr.
3
6
 
@@ -5,7 +5,7 @@ Ruby openEHR implementation project.
5
5
 
6
6
  = Version
7
7
 
8
- Release-1.1.0
8
+ Release-1.1.1
9
9
 
10
10
  = Requirements
11
11
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.1.1
@@ -1,7 +1,6 @@
1
1
  $:.unshift(File.dirname(__FILE__))
2
2
 
3
3
  module OpenEHR
4
- VERSION = '1.0.3'
5
4
  autoload :AssumedLibraryTypes, 'openehr/assumed_library_types'
6
5
  autoload :RM, 'openehr/rm'
7
6
  autoload :AM, 'openehr/am'
@@ -1,18 +1,15 @@
1
- require 'shared_token_grammar'
2
- require 'dadl_grammar'
3
- require 'cadl_grammar'
4
- require 'adl'
1
+ require 'openehr/assumed_library_types'
2
+ require 'openehr/rm/data_types/quantity'
3
+ require 'openehr/am/archetype/constraint_model'
4
+ require 'openehr/am/openehr_profile/data_types/text'
5
+ require 'openehr/am/openehr_profile/data_types/quantity'
6
+ require 'adl_helper'
5
7
 
6
8
  module OpenEHR
7
9
  module Parser
8
10
  grammar ADLGrammar
9
-
10
- include SharedToken
11
- include DADLGrammar
12
- include CADL
13
-
14
11
  rule archetype
15
- arch_identification
12
+ arch_identification
16
13
  spec:(arch_specialisation)?
17
14
  arch_concept
18
15
  lang:(arch_language)?
@@ -240,6 +237,3093 @@ module OpenEHR
240
237
  end
241
238
  }
242
239
  end # of arch_ontology
240
+
241
+ # cADL grammar section
242
+
243
+ rule V_CADL_TEXT
244
+ c_complex_object '' {
245
+ def value
246
+ c_complex_object.value
247
+ end
248
+ }
249
+ / assertions '' {
250
+ def value
251
+ assertions.value
252
+ end
253
+ }
254
+ end
255
+
256
+ rule c_complex_object
257
+ head:c_complex_object_head SYM_MATCHES SYM_START_CBLOCK body:c_complex_object_body SYM_END_CBLOCK space {
258
+ def value(node = ArchetypeNode.new)
259
+ args = head.value
260
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
261
+ :lower => 1, :upper => 1)
262
+ node.id = args[:node_id]
263
+ if node.root? or node.id.nil?
264
+ args[:path] = node.path
265
+ else
266
+ args[:path] = node.path + '[' + node.id + ']'
267
+ end
268
+ args.update body.value(node)
269
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
270
+ end
271
+ }
272
+ / c_complex_object_head '' {
273
+ def value(node = ArchetypeNode.new)
274
+ args = c_complex_object_head.value
275
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
276
+ :lower => 1, :upper => 1)
277
+ node.id = args[:node_id]
278
+ args[:path] = node.path
279
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
280
+ end
281
+ }
282
+ end
283
+
284
+ rule c_complex_object_head
285
+ c_complex_object_id c_occurrences {
286
+ def value
287
+ args = c_complex_object_id.value
288
+ args[:occurrences] = c_occurrences.value
289
+ args
290
+ end
291
+ }
292
+ / c_complex_object_id '' {
293
+ def value
294
+ c_complex_object_id.value
295
+ end
296
+ }
297
+ end
298
+
299
+ rule c_complex_object_id
300
+ ti:type_identifier lo:V_LOCAL_TERM_CODE_REF space {
301
+ def value
302
+ {:rm_type_name => ti.value,
303
+ :node_id => lo.value}
304
+ end
305
+ }
306
+ / ti:type_identifier space {
307
+ def value
308
+ {:rm_type_name => ti.value}
309
+ end
310
+ }
311
+ end
312
+
313
+ rule c_complex_object_body
314
+ c_any '' {
315
+ def value(node)
316
+ Hash[:attributes => [c_any.value(node)]]
317
+ end
318
+ }
319
+ / c_attributes '' {
320
+ def value(node)
321
+ Hash[:attributes => c_attributes.value(node)]
322
+ end
323
+ }
324
+ end
325
+
326
+ rule c_object
327
+ c_dv_quantity '' {
328
+ def value(node)
329
+ c_dv_quantity.value(node)
330
+ end
331
+ }
332
+ / c_ordinal '' {
333
+ def value(node)
334
+ args = c_ordinal.value
335
+ args[:path] = node.path
336
+ args[:rm_type_name] = 'DvOrdinal'
337
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
338
+ :upper => 1, :lower => 1)
339
+ OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CDvOrdinal.new(
340
+ args)
341
+ end
342
+ }
343
+ / c_primitive_object '' {
344
+ def value(node)
345
+ c_primitive_object.value
346
+ end
347
+ }
348
+ / c_complex_object '' {
349
+ def value(node)
350
+ c_complex_object.value(node)
351
+ end
352
+ }
353
+ / c_code_phrase '' {
354
+ def value(node)
355
+ c_code_phrase.value(node)
356
+ end
357
+ }
358
+ / constraint_ref '' {
359
+ def value(node)
360
+ constraint_ref.value(node)
361
+ end
362
+ }
363
+ / archetype_slot '' {
364
+ def value(node)
365
+ archetype_slot.value(node)
366
+ end
367
+ }
368
+ / archetype_internal_ref '' {
369
+ def value(node = nil)
370
+ archetype_internal_ref.value(node)
371
+ end
372
+ }
373
+ / V_C_DOMAIN_TYPE '' {
374
+ def value(node = nil)
375
+ p elemetns
376
+ end
377
+ }
378
+ # / ERR_V_C_DOMAIN_TYPE
379
+ end
380
+
381
+ rule archetype_internal_ref
382
+ SYM_USE_NODE type_identifier c_occurrences object_path space {
383
+ def value(node)
384
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
385
+ :rm_type_name => type_identifier.value,
386
+ :occurrences => c_occurrences.value,
387
+ :path => node.path,
388
+ :target_path => object_path.value)
389
+ end
390
+ }
391
+ / SYM_USE_NODE type_identifier object_path space {
392
+ def value(node = nil)
393
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
394
+ :rm_type_name => type_identifier.value,
395
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
396
+ :lower => 1, :upper => 1),
397
+ :path => node.path,
398
+ :target_path => object_path.value)
399
+ end
400
+ }
401
+ end
402
+
403
+ rule archetype_slot
404
+ c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK space {
405
+ def value(node)
406
+ args = c_archetype_slot_head.value(node)
407
+ args[:includes] = c_includes.value
408
+ args[:excludes] = c_excludes.value
409
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
410
+ end
411
+ }
412
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes SYM_END_CBLOCK space {
413
+ def value(node)
414
+ args = c_archetype_slot_head.value(node)
415
+ args[:includes] = c_includes.value
416
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
417
+ end
418
+ }
419
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_excludes SYM_END_CBLOCK space {
420
+ def value(node)
421
+ args = c_archetype_slot_head.value(node)
422
+ args[:excludes] = c_excludes.value
423
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
424
+ end
425
+ }
426
+ end
427
+
428
+ rule c_archetype_slot_head
429
+ c_archetype_slot_id white_space c_occurrences {
430
+ def value(node)
431
+ args = c_archetype_slot_id.value(node)
432
+ args[:occurrences] = c_occurrences.value
433
+ args
434
+ end
435
+ }
436
+ / c_archetype_slot_id white_space {
437
+ def value(node)
438
+ args = c_archetype_slot_id.value(node)
439
+ args[:occurrences] = OpenEHR::AssumedLibraryTypes::Interval.new(
440
+ :upper => 1, :lower => 1)
441
+ args
442
+ end
443
+ }
444
+ end
445
+
446
+ rule c_archetype_slot_id
447
+ SYM_ALLOW_ARCHETYPE type_identifier lt:V_LOCAL_TERM_CODE_REF {
448
+ def value(node)
449
+ {:rm_type_name => type_identifier.value,
450
+ :node_id => lt.value,
451
+ :path => node.path + "[#{lt.value}]"}
452
+ end
453
+ }
454
+ / SYM_ALLOW_ARCHETYPE type_identifier {
455
+ def value(node)
456
+ {:rm_type_name => type_identifier.value,
457
+ :path => node.path}
458
+ end
459
+ }
460
+ end
461
+
462
+ rule c_primitive_object
463
+ c_primitive '' {
464
+ def value
465
+ c_primitive.value
466
+ end
467
+ }
468
+ end
469
+
470
+ rule c_primitive
471
+ c_boolean '' {
472
+ def value
473
+ c_boolean.value
474
+ end
475
+ }
476
+ / c_date_time '' {
477
+ def value
478
+ c_date_time.value
479
+ end
480
+ }
481
+ / c_time '' {
482
+ def value
483
+ c_time.value
484
+ end
485
+ }
486
+ / c_date '' {
487
+ def value
488
+ c_date.value
489
+ end
490
+ }
491
+ / c_duration '' {
492
+ def value
493
+ c_duration.value
494
+ end
495
+ }
496
+ / c_real '' {
497
+ def value
498
+ c_real.value
499
+ end
500
+ }
501
+ / c_integer '' {
502
+ def value
503
+ c_integer.value
504
+ end
505
+ }
506
+ / c_string '' {
507
+ def value
508
+ c_string.value
509
+ end
510
+ }
511
+ end
512
+
513
+ rule c_any
514
+ '*' space {
515
+ def value(node)
516
+ OpenEHR::AM::Archetype::ConstraintModel::CAttribute.new(
517
+ :path => node.path, :rm_attribute_name => 'ANY',
518
+ :exsitence => OpenEHR::AssumedLibraryTypes::Interval.new(
519
+ :lower => 1, :upper => 1))
520
+ end
521
+ }
522
+ end
523
+
524
+ rule c_attributes
525
+ c_attribute more_attr:(c_attribute white_space)* {
526
+ def value(node)
527
+ attributes.map {|c| c.value(node)}
528
+ end
529
+
530
+ def attributes
531
+ [c_attribute] + more_attr.elements.map {|e| e.c_attribute}
532
+ end
533
+ }
534
+ end
535
+
536
+ rule c_attribute
537
+ c_attr_head c_attr_body {
538
+ def value(node)
539
+ val = c_attr_head.value(node)
540
+ child_node = ArchetypeNode.new(node)
541
+ child_node.path = val.path
542
+ val.children = c_attr_body.value(child_node)
543
+ val
544
+ end
545
+ }
546
+ end
547
+
548
+ rule c_attr_head
549
+ id:(V_ATTRIBUTE_IDENTIFIER) white_space c_existence c_cardinality {
550
+ def value(node)
551
+ if node.root?
552
+ path = node.path + id.value
553
+ elsif node.id
554
+ path = node.path + "[#{node.id}]/" + id.value
555
+ elsif
556
+ path = node.path + '/' + id.value
557
+ end
558
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
559
+ :rm_attribute_name => id.value,
560
+ :path => path,
561
+ :existence => c_existence.value,
562
+ :cardinality => c_cardinality.value)
563
+ end
564
+ }
565
+ / id:V_ATTRIBUTE_IDENTIFIER white_space c_existence {
566
+ def value(node)
567
+ if node.root?
568
+ path = node.path + id.value
569
+ elsif node.id
570
+ path = node.path + "[#{node.id}]/" + id.value
571
+ elsif
572
+ path = node.path + '/' + id.value
573
+ end
574
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
575
+ :rm_attribute_name => id.value,
576
+ :path => path,
577
+ :existence => c_existence.value)
578
+ end
579
+ }
580
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space c_cardinality {
581
+ def value(node)
582
+ if node.root?
583
+ path = node.path + id.value
584
+ elsif node.id
585
+ path = node.path + "[#{node.id}]/" + id.value
586
+ elsif
587
+ path = node.path + '/' + id.value
588
+ end
589
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
590
+ :rm_attribute_name => id.value,
591
+ :path => path,
592
+ :cardinality => c_cardinality.value)
593
+ end
594
+ }
595
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space {
596
+ def value(node)
597
+ if node.root?
598
+ path = node.path + id.value
599
+ elsif node.id
600
+ path = node.path + "[#{node.id}]/" + id.value
601
+ elsif
602
+ path = node.path + '/' + id.value
603
+ end
604
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
605
+ :rm_attribute_name => id.value, :path => path)
606
+ end
607
+ }
608
+ end
609
+
610
+ rule c_attr_body
611
+ SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK space {
612
+ def value(node)
613
+ c_attr_values.value(node)
614
+ end
615
+ }
616
+ end
617
+
618
+ rule c_attr_values
619
+ c_any '' {
620
+ def value(node)
621
+ [c_any.value(node)]
622
+ end
623
+ }
624
+ / c_object more_co:(c_object '')* {
625
+ def value(node)
626
+ c_objects.map {|c| c.value(node)}
627
+ end
628
+
629
+ def c_objects
630
+ [c_object] + more_co.elements.map {|e| e.c_object }
631
+ end
632
+ }
633
+ end
634
+
635
+ rule c_includes
636
+ SYM_INCLUDE assertions {
637
+ def value
638
+ assertions.value
639
+ end
640
+ }
641
+ end
642
+
643
+ rule c_excludes
644
+ SYM_EXCLUDE assertions {
645
+ def value
646
+ assertions.value
647
+ end
648
+ }
649
+ end
650
+
651
+ rule c_existence
652
+ SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK space {
653
+ def value
654
+ existence_spec.value
655
+ end
656
+ }
657
+ end
658
+
659
+ rule existence_spec
660
+ lo:V_INTEGER SYM_ELLIPSIS up:V_INTEGER {
661
+ def value
662
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value, :upper => up.value)
663
+ end
664
+ }
665
+ / V_INTEGER '' {
666
+ def value
667
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => V_INTEGER.value, :upper => V_INTEGER.value)
668
+ end
669
+ }
670
+ end
671
+
672
+ rule c_cardinality
673
+ SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK space {
674
+ def value
675
+ cardinality_spec.value
676
+ end
677
+ }
678
+ end
679
+
680
+ rule cardinality_spec
681
+ occurrence_spec ';' white_space SYM_ORDERED ';' white_space SYM_UNIQUE {
682
+ def value
683
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
684
+ :interval => occurrence_spec.value,
685
+ :is_unique => true,
686
+ :is_orderd => true)
687
+ end
688
+ }
689
+ / occurrence_spec ';' white_space SYM_ORDERED {
690
+ def value
691
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
692
+ :interval => occurrence_spec.value,
693
+ :is_orderd => true)
694
+ end
695
+ }
696
+ / occurrence_spec ';' white_space SYM_UNORDERD ';' white_space SYM_UNIQUE {
697
+ def value
698
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
699
+ :interval => occurrence_spec.value,
700
+ :is_unique => true,
701
+ :is_orderd => false)
702
+ end
703
+ }
704
+ / occurrence_spec ';' white_space SYM_UNORDERD {
705
+ def value
706
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
707
+ :interval => occurrence_spec.value,
708
+ :is_orderd => false)
709
+ end
710
+ }
711
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_ORDERED {
712
+ def value
713
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
714
+ :interval => occurrence_spec.value,
715
+ :is_unique => true,
716
+ :is_orderd => true)
717
+ end
718
+ }
719
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_UNORDERD {
720
+ def value
721
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
722
+ :interval => occurrence_spec.value,
723
+ :is_unique => true,
724
+ :is_ordered => false)
725
+ end
726
+ }
727
+ / occurrence_spec SYM_UNIQUE {
728
+ def value
729
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
730
+ :interval => occurrence_spec.value,
731
+ :is_unique => true)
732
+ end
733
+ }
734
+ / occurrence_spec space {
735
+ def value
736
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
737
+ :interval => occurrence_spec.value)
738
+ end
739
+ }
740
+ end
741
+
742
+ rule c_occurrences
743
+ SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK space {
744
+ def value
745
+ occurrence_spec.value
746
+ end
747
+ }
748
+ end
749
+
750
+ rule occurrence_spec
751
+ st:integer_value SYM_ELLIPSIS ed:cardinality_limit_value {
752
+ def value
753
+ if ed.value == '*'
754
+ OpenEHR::AssumedLibraryTypes::Interval.new(
755
+ :lower => st.value)
756
+ else
757
+ OpenEHR::AssumedLibraryTypes::Interval.new(
758
+ :lower => st.value,
759
+ :upper => ed.value)
760
+ end
761
+ end
762
+ }
763
+ / cardinality_limit_value '' {
764
+ def value
765
+ OpenEHR::AssumedLibraryTypes::Interval.new(
766
+ :lower => cardinality_limit_value.value,
767
+ :upper => cardinality_limit_value.value)
768
+ end
769
+ }
770
+ end
771
+
772
+ rule cardinality_limit_value
773
+ integer_value '' {
774
+ def value
775
+ text_value.to_i
776
+ end
777
+ }
778
+ / '*' {
779
+ def value
780
+ '*'
781
+ end
782
+ }
783
+ end
784
+
785
+ rule c_integer
786
+ c_integer_spec ';' white_space integer_value {
787
+ def value
788
+ args = c_integer_spec.value
789
+ args[:assumed_value] = integer_value.value
790
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(args)
791
+ end
792
+ }
793
+ / c_integer_spec '' {
794
+ def value
795
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(
796
+ c_integer_spec.value)
797
+ end
798
+ }
799
+ end
800
+
801
+ rule c_integer_spec
802
+ integer_list_value '' {
803
+ def value
804
+ {:list => integer_list_value.value}
805
+ end
806
+ }
807
+ / integer_interval_value '' {
808
+ def value
809
+ {:range => integer_interval_value.value}
810
+ end
811
+ }
812
+ / integer_value !'..' '' {
813
+ def value
814
+ {:list => [integer_value.value]}
815
+ end
816
+ }
817
+ / occurrence_spec '' {
818
+ def value
819
+ {:range => occurrence_spec.value}
820
+ end
821
+ }
822
+ end
823
+
824
+ rule c_real_spec
825
+ real_list_value '' {
826
+ def value
827
+ {:list => real_list_value.value}
828
+ end
829
+ }
830
+ / real_interval_value '' {
831
+ def value
832
+ {:range => real_interval_value.value}
833
+ end
834
+ }
835
+ / real_value '' {
836
+ def value
837
+ {:list => [real_value.value]}
838
+ end
839
+ }
840
+ end
841
+
842
+ rule c_real
843
+ c_real_spec ';' white_space real_value {
844
+ def value
845
+ args = c_real_spec.value
846
+ args[:assumed_value] = real_value.value
847
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(args)
848
+ end
849
+ }
850
+ / c_real_spec '' {
851
+ def value
852
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(
853
+ c_real_spec.value)
854
+ end
855
+ }
856
+ end
857
+
858
+ rule c_date_constraint
859
+ date_interval_value '' {
860
+ def value
861
+ {:range => date_interval_value.value}
862
+ end
863
+ }
864
+ / date_list_value '' {
865
+ def value
866
+ {:list => date_list_value.value}
867
+ end
868
+ }
869
+ / date_value '' {
870
+ def value
871
+ {:list => [date_value.value]}
872
+ end
873
+ }
874
+ / con:V_ISO8601_DATE_CONSTRAINT_PATTERN '' {
875
+ def value
876
+ {:pattern => con.text_value}
877
+ end
878
+ }
879
+ end
880
+
881
+ rule c_date
882
+ c_date_constraint ';' white_space date_value {
883
+ def value
884
+ args = c_date_constraint.value
885
+ args[:assumed_value] = date_value.value
886
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
887
+ args)
888
+ end
889
+ }
890
+ / c_date_constraint '' {
891
+ def value
892
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
893
+ c_date_constraint.value)
894
+ end
895
+ }
896
+ end
897
+
898
+ rule c_time_constraint
899
+ time_interval_value '' {
900
+ def value
901
+ {:range => time_interval_value.value}
902
+ end
903
+ }
904
+ / time_list_value '' {
905
+ def value
906
+ {:list => time_list_value.value}
907
+ end
908
+ }
909
+ / time_value '' {
910
+ def value
911
+ {:list => [time_value.value]}
912
+ end
913
+ }
914
+ / tc:V_ISO8601_TIME_CONSTRAINT_PATTERN '' {
915
+ def value
916
+ {:pattern => tc.text_value}
917
+ end
918
+ }
919
+ end
920
+
921
+ rule c_time
922
+ c_time_constraint ';' white_space time_value {
923
+ def value
924
+ args = c_time_constraint.value
925
+ args[:assumed_value] = time_value.value
926
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
927
+ args)
928
+ end
929
+ }
930
+ / c_time_constraint '' {
931
+ def value
932
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
933
+ c_time_constraint.value)
934
+ end
935
+ }
936
+ end
937
+
938
+ rule c_date_time_constraint
939
+ date_time_interval_value '' {
940
+ def value
941
+ {:range => date_time_interval_value.value}
942
+ end
943
+ }
944
+ / date_time_value '' {
945
+ def value
946
+ {:list => [date_time_value.value]}
947
+ end
948
+ }
949
+ / dtc:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN '' {
950
+ def value
951
+ {:pattern => dtc.text_value}
952
+ end
953
+ }
954
+ end
955
+
956
+ rule c_date_time
957
+ c_date_time_constraint ';' white_space date_time_value {
958
+ def value
959
+ args = c_date_time_constraint.value
960
+ args[:assumed_value] = date_time_value.value
961
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
962
+ args)
963
+ end
964
+ }
965
+ / c_date_time_constraint '' {
966
+ def value
967
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
968
+ c_date_time_constraint.value)
969
+ end
970
+ }
971
+ end
972
+
973
+ rule c_duration_constraint
974
+ duration_pattern '/' duration_interval_value '' {
975
+ def value
976
+ {:pattern => duration_pattern.value}
977
+ end
978
+ }
979
+ / duration_pattern '' {
980
+ def value
981
+ {:pattern => duration_pattern.value}
982
+ end
983
+ }
984
+ / duration_interval_value '' {
985
+ def value
986
+ {:range => duration_interval_value.value}
987
+ end
988
+ }
989
+ / duration_value '' {
990
+ def value
991
+ {:list => [duration_value.value]}
992
+ end
993
+ }
994
+ end
995
+
996
+ rule duration_pattern
997
+ dp:V_ISO8601_DURATION_CONSTRAINT_PATTERN '' {
998
+ def value
999
+ dp.text_value
1000
+ end
1001
+ }
1002
+ end
1003
+
1004
+ rule c_duration
1005
+ c_duration_constraint ';' white_space duration_value '' {
1006
+ def value
1007
+ args = c_duration_constraint.value
1008
+ args[:assumed_value] = duration_value.value
1009
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
1010
+ args)
1011
+ end
1012
+ }
1013
+ / c_duration_constraint '' {
1014
+ def value
1015
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
1016
+ c_duration_constraint.value)
1017
+ end
1018
+ }
1019
+ end
1020
+
1021
+ rule c_string_spec
1022
+ string_list_value ',' white_space SYM_LIST_CONTINUE {
1023
+ def value
1024
+ {:list => string_list_value.value}
1025
+ end
1026
+ }
1027
+ / string_list_value '' {
1028
+ def value
1029
+ {:list => string_list_value.value}
1030
+ end
1031
+ }
1032
+ / pat:V_REGEXP '' {
1033
+ def value
1034
+ {:pattern => pat.value}
1035
+ end
1036
+ }
1037
+ / str:V_STRING '' {
1038
+ def value
1039
+ {:list => [str.value]}
1040
+ end
1041
+ }
1042
+ end
1043
+
1044
+ rule c_string
1045
+ c_string_spec white_space ';' white_space string_value {
1046
+ def value
1047
+ args = c_string_spec.value
1048
+ args[:assumed_value] = string_value.value
1049
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
1050
+ args)
1051
+ end
1052
+ }
1053
+ / c_string_spec '' {
1054
+ def value
1055
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
1056
+ c_string_spec.value)
1057
+ end
1058
+ }
1059
+ end
1060
+
1061
+ rule c_boolean_spec
1062
+ SYM_TRUE ',' white_space SYM_FALSE {
1063
+ def value
1064
+ {:true_valid => true, :false_valid => true}
1065
+ end
1066
+ }
1067
+ / SYM_TRUE white_space '' {
1068
+ def value
1069
+ {:true_valid => true, :false_valid => false}
1070
+ end
1071
+ }
1072
+ / SYM_FALSE white_space ',' white_space SYM_TRUE {
1073
+ def value
1074
+ {:true_valid => true, :false_valid => true}
1075
+ end
1076
+ }
1077
+ / SYM_FALSE white_space '' {
1078
+ def value
1079
+ {:false_valid => true, :true_valid => false}
1080
+ end
1081
+ }
1082
+ end
1083
+
1084
+ rule c_boolean
1085
+ c_boolean_spec ';' white_space boolean_value {
1086
+ def value
1087
+ args = c_boolean_spec.value
1088
+ args[:assumed_value] = boolean_value.value
1089
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
1090
+ args)
1091
+ end
1092
+ }
1093
+ / c_boolean_spec '' {
1094
+ def value
1095
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
1096
+ c_boolean_spec.value)
1097
+ end
1098
+ }
1099
+ end
1100
+
1101
+ rule constraint_ref
1102
+ vltcr:V_LOCAL_TERM_CODE_REF '' {
1103
+ def value(node)
1104
+ OpenEHR::AM::Archetype::ConstraintModel::ConstraintRef.new(
1105
+ :path => node.path,
1106
+ :rm_type_name => 'ConstraintRef',
1107
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(:upper => 1, :lower => 1),
1108
+ :reference => vltcr.value)
1109
+ end
1110
+ }
1111
+ end
1112
+
1113
+ rule V_REGEXP
1114
+ (('=' / '!') '~')? (('/' ('\/' / !'/' .)* '/') / ('^' (!'^' .)* '^') ) {
1115
+ def value
1116
+ text_value
1117
+ end
1118
+ }
1119
+ end
1120
+
1121
+ rule code_string
1122
+ NAMECHAR+ '' {
1123
+ def value
1124
+ text_value
1125
+ end
1126
+ }
1127
+ end
1128
+
1129
+ rule code_string_list
1130
+ first:code_string more:(',' space code_string)+ space {
1131
+ def value
1132
+ codes.map {|c| c.value}
1133
+ end
1134
+
1135
+ def codes
1136
+ [first] + more.elements.map {|e| e.code_string}
1137
+ end
1138
+ }
1139
+ end
1140
+
1141
+ rule code_string_spec
1142
+ code_string_list '' {
1143
+ def value
1144
+ code_string_list.value
1145
+ end
1146
+ }
1147
+ / code_string '' {
1148
+ def value
1149
+ [code_string.value]
1150
+ end
1151
+ }
1152
+ end
1153
+
1154
+ rule c_code_phrase
1155
+ ti:V_TERM_CODE code_string_spec ';' space code_string ']' space {
1156
+ def value(node)
1157
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
1158
+ :rm_type_name => 'CodePhrase',
1159
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
1160
+ :upper => 1, :lower => 1),
1161
+ :terminology_id => ti.value, :code_list => code_string_spec.value,
1162
+ :assumed_value => code_string.value,
1163
+ :path => node.path)
1164
+ end
1165
+ }
1166
+ / ti:V_TERM_CODE code_string_spec ']' space {
1167
+ def value(node)
1168
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
1169
+ :rm_type_name => 'CodePhrase',
1170
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
1171
+ :upper => 1, :lower => 1),
1172
+ :terminology_id => ti.value, :code_list => code_string_spec.value,
1173
+ :path => node.path)
1174
+ end
1175
+ }
1176
+ / ti:V_TERM_CODE ']' space {
1177
+ def value(node)
1178
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
1179
+ :rm_type_name => 'CodePhrase',
1180
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
1181
+ :upper => 1, :lower => 1),
1182
+ :terminology_id => ti.value, :code_list => [], :path => node.path)
1183
+ end
1184
+ }
1185
+ end
1186
+
1187
+ rule SYM_C_DV_ORDINAL
1188
+ 'C_DV_ORDINAL' space
1189
+ end
1190
+
1191
+ rule c_ordinal
1192
+ c_ordinal_spec ';' space integer_value space {
1193
+ def value
1194
+ args = c_ordinal_spec.value
1195
+ args[:assumed_value] = integer_value.value
1196
+ args
1197
+ end
1198
+ }
1199
+ / c_ordinal_spec space '' {
1200
+ def value
1201
+ c_ordinal_spec.value
1202
+ end
1203
+ }
1204
+ / SYM_C_DV_ORDINAL SYM_LT white_space SYM_GT space {
1205
+ def value
1206
+ {:list => nil}
1207
+ end
1208
+ }
1209
+ end
1210
+
1211
+ rule c_ordinal_spec
1212
+ ordinal_list '' {
1213
+ def value
1214
+ {:list => ordinal_list.value}
1215
+ end
1216
+ }
1217
+ / ordinal '' {
1218
+ def value
1219
+ {:list => [ordinal.value]}
1220
+ end
1221
+ }
1222
+ end
1223
+
1224
+ rule ordinal_list
1225
+ first:ordinal more:(',' space ordinal)+ {
1226
+ def value
1227
+ ordinals.map {|o| o.value}
1228
+ end
1229
+
1230
+ def ordinals
1231
+ [first] + more.elements.map {|e| e.ordinal}
1232
+ end
1233
+ }
1234
+ end
1235
+
1236
+ rule ordinal
1237
+ integer_value SYM_INTERVAL_DELIM vqtc:V_QUALIFIED_TERM_CODE_REF !SYM_INTERVAL_DELIM '' {
1238
+ def value
1239
+ symbol = ::OpenEHR::RM::DataTypes::Text::DvCodedText.new(
1240
+ :value => vqtc.text_value, :defining_code => vqtc.value)
1241
+ ::OpenEHR::RM::DataTypes::Quantity::DvOrdinal.new(
1242
+ :value => integer_value.value,
1243
+ :symbol => symbol)
1244
+ end
1245
+ }
1246
+ end
1247
+
1248
+ rule c_dv_quantity
1249
+ SYM_C_DV_QUANTITY SYM_START_DBLOCK
1250
+ prop:property? ql:quantity_list? aqv:assumed_quantity_value?
1251
+ SYM_END_DBLOCK <CDvQuantityItems>
1252
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
1253
+ prop:property? aqv:assumed_quantity_value? ql:quantity_list?
1254
+ SYM_END_DBLOCK <CDvQuantityItems>
1255
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
1256
+ aqv:assumed_quantity_value? prop:property? ql:quantity_list?
1257
+ SYM_END_DBLOCK <CDvQuantityItems>
1258
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
1259
+ aqv:assumed_quantity_value? ql:quantity_list? prop:property?
1260
+ SYM_END_DBLOCK <CDvQuantityItems>
1261
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
1262
+ ql:quantity_list? aqv:assumed_quantity_value? prop:property?
1263
+ SYM_END_DBLOCK <CDvQuantityItems>
1264
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
1265
+ ql:quantity_list? prop:property? aqv:assumed_quantity_value?
1266
+ SYM_END_DBLOCK <CDvQuantityItems>
1267
+ end
1268
+
1269
+ rule SYM_C_DV_QUANTITY
1270
+ 'C_DV_QUANTITY' space
1271
+ end
1272
+
1273
+ rule property
1274
+ SYM_PROPERTY SYM_EQ SYM_START_DBLOCK
1275
+ prop:V_QUALIFIED_TERM_CODE_REF SYM_END_DBLOCK {
1276
+ def value
1277
+ prop.value
1278
+ end
1279
+ }
1280
+ end
1281
+
1282
+ rule SYM_PROPERTY
1283
+ 'property' space
1284
+ end
1285
+
1286
+ rule quantity_list
1287
+ SYM_QUANTITY_LIST SYM_EQ SYM_START_DBLOCK
1288
+ c_quantity_items SYM_END_DBLOCK {
1289
+ def value(node)
1290
+ c_quantity_items.value(node)
1291
+ end
1292
+ }
1293
+ end
1294
+
1295
+ rule assumed_quantity_value
1296
+ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1297
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1298
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1299
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1300
+ SYM_END_DBLOCK <AssumedValueItems>
1301
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1302
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1303
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1304
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1305
+ SYM_END_DBLOCK <AssumedValueItems>
1306
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1307
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1308
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1309
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1310
+ SYM_END_DBLOCK <AssumedValueItems>
1311
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1312
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1313
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1314
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1315
+ SYM_END_DBLOCK <AssumedValueItems>
1316
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1317
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1318
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1319
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1320
+ SYM_END_DBLOCK <AssumedValueItems>
1321
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
1322
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
1323
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1324
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
1325
+ SYM_END_DBLOCK <AssumedValueItems>
1326
+ end
1327
+
1328
+ rule SYM_QUANTITY_LIST
1329
+ 'list' space
1330
+ end
1331
+
1332
+ rule c_quantity_items
1333
+ c_quantity_item more_cdv:(c_quantity_item white_space)* {
1334
+ def value(node)
1335
+ quantities.map {|q| q.value(node)}
1336
+ end
1337
+
1338
+ def quantities
1339
+ [c_quantity_item] + more_cdv.elements.map {|e| e.c_quantity_item}
1340
+ end
1341
+ }
1342
+ end
1343
+
1344
+ rule c_quantity_item
1345
+ '[' V_STRING ']' white_space SYM_EQ SYM_START_DBLOCK
1346
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
1347
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK int:real_interval_value SYM_END_DBLOCK)?
1348
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK int:integer_interval_value SYM_END_DBLOCK)?
1349
+ SYM_END_DBLOCK {
1350
+ def value(node)
1351
+ magnitude, precision = nil
1352
+ magnitude = mag.int.value unless mag.empty?
1353
+ precision = prec.int.value unless prec.empty?
1354
+ OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CQuantityItem.new(
1355
+ :path => node.path, :rm_type_name => 'DvQuantity',
1356
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
1357
+ :upper => 1, :lower => 1),
1358
+ :units => units.value,
1359
+ :magnitude => magnitude, :precision => precision)
1360
+ end
1361
+ }
1362
+ end
1363
+
1364
+ rule SYM_UNITS
1365
+ 'units' space
1366
+ end
1367
+
1368
+ rule SYM_MAGNITUDE
1369
+ 'magnitude' space
1370
+ end
1371
+
1372
+ rule SYM_PRECISION
1373
+ 'precision' space
1374
+ end
1375
+
1376
+ rule SYM_ASSUMED_VALUE
1377
+ 'assumed_value' space
1378
+ end
1379
+
1380
+ rule V_C_DOMAIN_TYPE
1381
+ '('? [A-Z] IDCHAR* ')'? [ \n]* '<' [^>]* '>'
1382
+ end
1383
+
1384
+ # assertion block
1385
+
1386
+ rule V_ASSERTION_TEXT
1387
+ assertions '' {
1388
+ def value
1389
+ assertions.value
1390
+ end
1391
+ }
1392
+ end
1393
+
1394
+ rule assertions
1395
+ assertion more_a:(assertion '')* {
1396
+ def value
1397
+ assertions.map {|a| a.value}
1398
+ end
1399
+
1400
+ def assertions
1401
+ [assertion] + more_a.elements.map {|a| a.assertion}
1402
+ end
1403
+ }
1404
+ end
1405
+
1406
+ rule assertion
1407
+ id:(any_identifier ':')? boolean_expression space {
1408
+ def value
1409
+ if (id && !id.empty?)
1410
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
1411
+ :tag => id.value, :expression => boolean_expression.value,
1412
+ :string_expression => id.text_value + boolean_expression.text_value)
1413
+ else
1414
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
1415
+ :expression => boolean_expression.value,
1416
+ :string_expression => boolean_expression.text_value)
1417
+ end
1418
+ end
1419
+ }
1420
+ end
1421
+
1422
+ rule boolean_expression
1423
+ boolean_node '' {
1424
+ def value
1425
+ boolean_node.value
1426
+ end
1427
+ }
1428
+ / boolean_leaf '' {
1429
+ def value
1430
+ boolean_leaf.value
1431
+ end
1432
+ }
1433
+ end
1434
+
1435
+ rule boolean_node
1436
+ SYM_EXISTS absolute_path {
1437
+ def value
1438
+ item = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
1439
+ :type => 'String',
1440
+ :item => absolute_path.value,
1441
+ :reference_type => 'CONSTANT')
1442
+ OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
1443
+ :type => 'Boolean',
1444
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXISTS,
1445
+ :operand => item,
1446
+ :precedence_overridden => false)
1447
+ end
1448
+ }
1449
+ / relative_path white_space SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK {
1450
+ def value
1451
+ left_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
1452
+ :type => 'String',
1453
+ :item => relative_path.value,
1454
+ :reference_type => 'Constant')
1455
+ right_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
1456
+ :item => c_primitive.value,
1457
+ :type => c_primitive.value.type,
1458
+ :reference_type => 'Constant')
1459
+ op = OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MATCHES
1460
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1461
+ :type => 'Boolean',
1462
+ :operator => op,
1463
+ :right_operand => right_op,
1464
+ :left_operand => left_op,
1465
+ :reference_type => 'Constraint')
1466
+ end
1467
+ }
1468
+ / SYM_NOT boolean_leaf '' {
1469
+ def value
1470
+ OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
1471
+ :type => 'Boolean',
1472
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NOT,
1473
+ :operand => boolean_leaf.value,
1474
+ :precedence_overridden => false)
1475
+ end
1476
+ }
1477
+ / arithmetic_leaf SYM_EQ arithmetic_expression {
1478
+ def value
1479
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1480
+ :type => 'Boolean',
1481
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EQ,
1482
+ :left_operand => arithmetic_leaf.value,
1483
+ :right_operand => arithmetic_expression.value,
1484
+ :reference_type => 'Constraint')
1485
+ end
1486
+ }
1487
+ / arithmetic_leaf SYM_NE arithmetic_expression {
1488
+ def value
1489
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1490
+ :type => 'Boolean',
1491
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NE,
1492
+ :left_operand => arithmetic_leaf.value,
1493
+ :right_operand => arithmetic_expression.value,
1494
+ :reference_type => 'Constraint')
1495
+ end
1496
+ }
1497
+ / arithmetic_leaf SYM_LT arithmetic_expression {
1498
+ def value
1499
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1500
+ :type => 'Boolean',
1501
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LT,
1502
+ :left_operand => arithmetic_leaf.value,
1503
+ :right_operand => arithmetic_expression.value,
1504
+ :reference_type => 'Constraint')
1505
+ end
1506
+ }
1507
+ / arithmetic_leaf SYM_GT arithmetic_expression {
1508
+ def value
1509
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1510
+ :type => 'Boolean',
1511
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GT,
1512
+ :left_operand => arithmetic_leaf.value,
1513
+ :right_operand => arithmetic_expression.value,
1514
+ :reference_type => 'Constraint')
1515
+ end
1516
+ }
1517
+ / arithmetic_leaf SYM_LE arithmetic_expression {
1518
+ def value
1519
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1520
+ :type => 'Boolean',
1521
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LE,
1522
+ :left_operand => arithmetic_leaf.value,
1523
+ :right_operand => arithmetic_expression.value,
1524
+ :reference_type => 'Constraint')
1525
+ end
1526
+ }
1527
+ / arithmetic_leaf SYM_GE arithmetic_expression {
1528
+ def value
1529
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1530
+ :type => 'Boolean',
1531
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GE,
1532
+ :left_operand => arithmetic_leaf.value,
1533
+ :right_operand => arithmetic_expression.value,
1534
+ :reference_type => 'Constraint')
1535
+ end
1536
+ }
1537
+ / boolean_leaf SYM_AND boolean_expression {
1538
+ def value
1539
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1540
+ :type => 'Boolean',
1541
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_AND,
1542
+ :left_operand => boolean_leaf.value,
1543
+ :right_operand => boolean_expression.value,
1544
+ :reference_type => 'Constraint')
1545
+ end
1546
+ }
1547
+ / boolean_leaf SYM_OR boolean_expression {
1548
+ def value
1549
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1550
+ :type => 'Boolean',
1551
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_OR,
1552
+ :left_operand => boolean_leaf.value,
1553
+ :right_operand => boolean_expression.value,
1554
+ :reference_type => 'Constraint')
1555
+ end
1556
+ }
1557
+ / boolean_leaf SYM_XOR boolean_expression {
1558
+ def value
1559
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1560
+ :type => 'Boolean',
1561
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_XOR,
1562
+ :left_operand => boolean_leaf.value,
1563
+ :right_operand => boolean_expression.value,
1564
+ :reference_type => 'Constraint')
1565
+ end
1566
+ }
1567
+ / boolean_leaf SYM_IMPLIES boolean_expression {
1568
+ def value
1569
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1570
+ :type => 'Boolean',
1571
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_IMPLIES,
1572
+ :left_operand => boolean_leaf.value,
1573
+ :right_operand => boolean_expression.value,
1574
+ :reference_type => 'Constraint')
1575
+ end
1576
+ }
1577
+ end
1578
+
1579
+ rule boolean_leaf
1580
+ '(' boolean_expression ')' {
1581
+ def value
1582
+ boolean_expression.value
1583
+ end
1584
+ }
1585
+ / SYM_TRUE '' {
1586
+ def value
1587
+ OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
1588
+ :type => 'Boolean',
1589
+ :item => true,
1590
+ :reference_type => 'CONSTANT')
1591
+ end
1592
+ }
1593
+ / SYM_FALSE '' {
1594
+ def value
1595
+ OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
1596
+ :type => 'Boolean',
1597
+ :item => false,
1598
+ :reference_type => 'CONSTANT')
1599
+ end
1600
+ }
1601
+ end
1602
+
1603
+ rule arithmetic_expression
1604
+ arithmetic_node '' {
1605
+ def value
1606
+ arithmetic_node.value
1607
+ end
1608
+ }
1609
+ / arithmetic_leaf '' {
1610
+ def value
1611
+ arithmetic_leaf.value
1612
+ end
1613
+ }
1614
+ end
1615
+
1616
+ rule arithmetic_node
1617
+ arithmetic_leaf '+' arithmetic_expression {
1618
+ def value
1619
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1620
+ :type => 'Boolean',
1621
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_PLUS,
1622
+ :left_operand => arithmetic_leaf.value,
1623
+ :right_operand => arithmetic_expression.value,
1624
+ :reference_type => 'Constraint')
1625
+ end
1626
+ }
1627
+ / arithmetic_leaf '-' arithmetic_expression {
1628
+ def value
1629
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1630
+ :type => 'Boolean',
1631
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MINUS,
1632
+ :left_operand => arithmetic_leaf.value,
1633
+ :right_operand => arithmetic_expression.value,
1634
+ :reference_type => 'Constraint')
1635
+ end
1636
+ }
1637
+ / arithmetic_leaf '*' arithmetic_expression {
1638
+ def value
1639
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1640
+ :type => 'Boolean',
1641
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MULTIPLY,
1642
+ :left_operand => arithmetic_leaf.value,
1643
+ :right_operand => arithmetic_expression.value,
1644
+ :reference_type => 'Constraint')
1645
+ end
1646
+ }
1647
+ / arithmetic_leaf '/' arithmetic_expression {
1648
+ def value
1649
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1650
+ :type => 'Boolean',
1651
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_DIVIDE,
1652
+ :left_operand => arithmetic_leaf.value,
1653
+ :right_operand => arithmetic_expression.value,
1654
+ :reference_type => 'Constraint')
1655
+ end
1656
+ }
1657
+ / arithmetic_leaf '^' arithmetic_expression {
1658
+ def value
1659
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
1660
+ :type => 'Boolean',
1661
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXP,
1662
+ :left_operand => arithmetic_leaf.value,
1663
+ :right_operand => arithmetic_expression.value,
1664
+ :reference_type => 'Constraint')
1665
+ end
1666
+ }
1667
+ end
1668
+
1669
+ rule arithmetic_leaf
1670
+ '(' arithmetic_expression ')' space {
1671
+ def value
1672
+ arithmetic_expression.value
1673
+ end
1674
+ }
1675
+ / integer_value '' {
1676
+ def value
1677
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
1678
+ :type => 'Integer',
1679
+ :item => integer_value.value,
1680
+ :reference_type => 'CONSTANT')
1681
+ end
1682
+ }
1683
+ / real_value '' {
1684
+ def value
1685
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
1686
+ :type => 'Real',
1687
+ :item => real_value.value,
1688
+ :reference_type => 'CONSTANT')
1689
+ end
1690
+ }
1691
+ / absolute_path space {
1692
+ def value
1693
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
1694
+ :type => 'String',
1695
+ :item => absolute_path.value,
1696
+ :reference_type => 'CONSTANT')
1697
+
1698
+ end
1699
+ }
1700
+ end
1701
+
1702
+ # path block
1703
+ rule object_path
1704
+ movable_path '' {
1705
+ def value
1706
+ movable_path.value
1707
+ end
1708
+ }
1709
+ / absolute_path '' {
1710
+ def value
1711
+ absolute_path.value
1712
+ end
1713
+ }
1714
+ / relative_path '' {
1715
+ def value
1716
+ relative_path.value
1717
+ end
1718
+ }
1719
+ end
1720
+
1721
+ rule movable_path
1722
+ SYM_MOVABLE_LEADER relative_path '' {
1723
+ def value
1724
+ text_value
1725
+ end
1726
+ }
1727
+ end
1728
+
1729
+ rule absolute_path
1730
+ '/' relative_path? '' {
1731
+ def value
1732
+ text_value
1733
+ end
1734
+ }
1735
+ end
1736
+
1737
+ rule relative_path
1738
+ path_segment ('/' path_segment)* '' {
1739
+ def value
1740
+ text_value
1741
+ end
1742
+ }
1743
+ end
1744
+
1745
+ rule path_segment
1746
+ V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF? '' {
1747
+ def value
1748
+ text_value
1749
+ end
1750
+ }
1751
+ end
1752
+
1753
+ rule SYM_MOVABLE_LEADER
1754
+ '//'
1755
+ end # of cADL grammar
1756
+
1757
+ # biginning of dADL grammar
1758
+
1759
+ rule V_DADL_TEXT
1760
+ attr_vals space {
1761
+ def value
1762
+ attr_vals.value
1763
+ end
1764
+ }
1765
+ / complex_object_block space {
1766
+ def value
1767
+ complex_object_block.value
1768
+ end
1769
+ }
1770
+ end
1771
+
1772
+ rule attr_vals
1773
+ first:attr_val second:(';'? space attr_val space)* {
1774
+ def value
1775
+ attrs.inject({ }) {|val, a| val.update a.value}
1776
+ end
1777
+
1778
+ def attrs
1779
+ [first] + second.elements.map {|e| e.attr_val}
1780
+ end
1781
+ }
1782
+ end
1783
+
1784
+ rule attr_val
1785
+ attr_id SYM_EQ object_block {
1786
+ def value
1787
+ {attr_id.value => object_block.value}
1788
+ end
1789
+ }
1790
+ end
1791
+
1792
+ rule attr_id
1793
+ id:V_ATTRIBUTE_IDENTIFIER white_space {
1794
+ def value
1795
+ id.value
1796
+ end
1797
+ }
1798
+ end
1799
+
1800
+ rule object_block
1801
+ complex_object_block space {
1802
+ def value
1803
+ complex_object_block.value
1804
+ end
1805
+ }
1806
+ / primitive_object_block space {
1807
+ def value
1808
+ primitive_object_block.value
1809
+ end
1810
+ }
1811
+ end
1812
+
1813
+ rule complex_object_block
1814
+ single_attr_object_block '' {
1815
+ def value
1816
+ single_attr_object_block.value
1817
+ end
1818
+ }
1819
+ / multiple_attr_object_block '' {
1820
+ def value
1821
+ multiple_attr_object_block.value
1822
+ end
1823
+ }
1824
+ end
1825
+
1826
+ rule multiple_attr_object_block
1827
+ type_identifier? untyped_multiple_attr_object_block {
1828
+ def value
1829
+ untyped_multiple_attr_object_block.value
1830
+ end
1831
+ }
1832
+ end
1833
+
1834
+ rule untyped_multiple_attr_object_block
1835
+ multiple_attr_object_block_head keyed_objects SYM_END_DBLOCK {
1836
+ def value
1837
+ keyed_objects.value
1838
+ end
1839
+ }
1840
+ end
1841
+
1842
+ rule multiple_attr_object_block_head
1843
+ SYM_START_DBLOCK
1844
+ end
1845
+
1846
+ rule keyed_objects
1847
+ keyed_object+ {
1848
+ def value
1849
+ elements.inject({ }) {|val, e| val.update e.value}
1850
+ end
1851
+ }
1852
+ end
1853
+
1854
+ rule keyed_object
1855
+ object_key SYM_EQ object_block {
1856
+ def value
1857
+ {object_key.value => object_block.value}
1858
+ end
1859
+ }
1860
+ end
1861
+
1862
+ rule object_key
1863
+ '[' simple_value ']' white_space {
1864
+ def value
1865
+ simple_value.value
1866
+ end
1867
+ }
1868
+ end
1869
+
1870
+ rule single_attr_object_block
1871
+ type_identifier? untyped_single_attr_object_block {
1872
+ def value
1873
+ untyped_single_attr_object_block.value
1874
+ end
1875
+ }
1876
+ end
1877
+
1878
+ rule untyped_single_attr_object_block
1879
+ single_attr_object_complex_head attr_vals SYM_END_DBLOCK {
1880
+ def value
1881
+ elements[1].value
1882
+ end
1883
+ }
1884
+ / single_attr_object_complex_head SYM_END_DBLOCK {
1885
+ def value
1886
+ nil
1887
+ end
1888
+ }
1889
+ end
1890
+
1891
+ rule single_attr_object_complex_head
1892
+ SYM_START_DBLOCK
1893
+ end
1894
+
1895
+ rule primitive_object_block
1896
+ type_identifier? untyped_primitive_object_block {
1897
+ def value
1898
+ untyped_primitive_object_block.value
1899
+ end
1900
+ }
1901
+ end
1902
+
1903
+ rule untyped_primitive_object_block
1904
+ SYM_START_DBLOCK primitive_object_value SYM_END_DBLOCK {
1905
+ def value
1906
+ primitive_object_value.value
1907
+ end
1908
+ }
1909
+ end
1910
+
1911
+ rule primitive_object_value
1912
+ term_code_list_value '' {
1913
+ def value
1914
+ term_code_list_value.value
1915
+ end
1916
+ }
1917
+ / term_code '' {
1918
+ def value
1919
+ term_code.value
1920
+ end
1921
+ }
1922
+ / simple_list_value '' {
1923
+ def value
1924
+ simple_list_value.value
1925
+ end
1926
+ }
1927
+ / simple_interval_value '' {
1928
+ def value
1929
+ simple_interval_value.value
1930
+ end
1931
+ }
1932
+ / simple_value '' {
1933
+ def value
1934
+ simple_value.value
1935
+ end
1936
+ }
1937
+ end
1938
+
1939
+ rule simple_value
1940
+ integer_value '' {
1941
+ def value
1942
+ integer_value.value
1943
+ end
1944
+ }
1945
+ / real_value '' {
1946
+ def value
1947
+ real_value.value
1948
+ end
1949
+ }
1950
+ / boolean_value '' {
1951
+ def value
1952
+ boolean_value.value
1953
+ end
1954
+ }
1955
+ / uri_value '' {
1956
+ def value
1957
+ uri_value.value
1958
+ end
1959
+ }
1960
+ / date_value '' {
1961
+ def value
1962
+ date_value.value
1963
+ end
1964
+ }
1965
+ / time_value '' {
1966
+ def value
1967
+ time_value.value
1968
+ end
1969
+ }
1970
+ / date_time_value '' {
1971
+ def value
1972
+ date_time_value.value
1973
+ end
1974
+ }
1975
+ / duration_value '' {
1976
+ def value
1977
+ duration_value.value
1978
+ end
1979
+ }
1980
+ / string_value '' {
1981
+ def value
1982
+ string_value.value
1983
+ end
1984
+ }
1985
+ / character_value '' {
1986
+ def value
1987
+ character_value.value
1988
+ end
1989
+ }
1990
+ end
1991
+
1992
+ rule simple_list_value
1993
+ integer_list_value '' {
1994
+ def value
1995
+ integer_list_value.value
1996
+ end
1997
+ }
1998
+ / real_list_value '' {
1999
+ def value
2000
+ real_list_value.value
2001
+ end
2002
+ }
2003
+ / boolean_list_value '' {
2004
+ def value
2005
+ boolean_list_value.value
2006
+ end
2007
+ }
2008
+ / character_list_value '' {
2009
+ def value
2010
+ character_list_value.value
2011
+ end
2012
+ }
2013
+ / date_list_value '' {
2014
+ def value
2015
+ date_list_value.value
2016
+ end
2017
+ }
2018
+ / time_list_value '' {
2019
+ def value
2020
+ time_list_value.value
2021
+ end
2022
+ }
2023
+ / date_time_list_value '' {
2024
+ def value
2025
+ date_time_list_value.value
2026
+ end
2027
+ }
2028
+ / duration_list_value '' {
2029
+ def value
2030
+ duration_list_value.value
2031
+ end
2032
+ }
2033
+ / string_list_value '' {
2034
+ def value
2035
+ string_list_value.value
2036
+ end
2037
+ }
2038
+ end
2039
+
2040
+ rule simple_interval_value
2041
+ integer_interval_value '' {
2042
+ def value
2043
+ integer_interval_value.value
2044
+ end
2045
+ }
2046
+ / real_interval_value '' {
2047
+ def value
2048
+ real_interval_value.value
2049
+ end
2050
+ }
2051
+ / date_interval_value '' {
2052
+ def value
2053
+ date_interval_value.value
2054
+ end
2055
+ }
2056
+ / time_interval_value '' {
2057
+ def value
2058
+ time_interval_value.value
2059
+ end
2060
+ }
2061
+ / date_time_interval_value '' {
2062
+ def value
2063
+ date_time_interval_value.value
2064
+ end
2065
+ }
2066
+ / duration_interval_value '' {
2067
+ def value
2068
+ duration_interval_value.value
2069
+ end
2070
+ }
2071
+ end
2072
+
2073
+ rule term_code
2074
+ vtref:V_QUALIFIED_TERM_CODE_REF '' {
2075
+ def value
2076
+ vtref.value
2077
+ end
2078
+ }
2079
+ end
2080
+
2081
+ rule term_code_list_value
2082
+ first:term_code more:(',' term_code)+ {
2083
+ def value
2084
+ term_codes.map {|t| t.value}
2085
+ end
2086
+
2087
+ def term_codes
2088
+ [first] + more.elements.map {|e| e.term_code}
2089
+ end
2090
+ }
2091
+ / term_code ',' SYM_LIST_CONTINUE {
2092
+ def value
2093
+ [term_code.value]
2094
+ end
2095
+ }
2096
+ end
2097
+
2098
+ rule uri_value
2099
+ uri:V_URI '' {
2100
+ def value
2101
+ uri.value
2102
+ end
2103
+ }
2104
+ end # of dADL grammar
2105
+
2106
+ # beginning of shared token section
2107
+
2108
+ rule any_identifier
2109
+ type_identifier '' {
2110
+ def value
2111
+ type_identifier.value
2112
+ end
2113
+ }
2114
+ / V_ATTRIBUTE_IDENTIFIER '' {
2115
+ def value
2116
+ V_ATTRIBUTE_IDENTIFIER.value
2117
+ end
2118
+ }
2119
+ end
2120
+
2121
+ rule type_identifier
2122
+ '(' id:V_GENERIC_TYPE_IDENTIFIER ')' white_space {
2123
+ def value
2124
+ id.value
2125
+ end
2126
+ }
2127
+ / id:V_GENERIC_TYPE_IDENTIFIER white_space {
2128
+ def value
2129
+ id.value
2130
+ end
2131
+ }
2132
+ / '(' id:V_TYPE_IDENTIFIER ')' white_space {
2133
+ def value
2134
+ id.value
2135
+ end
2136
+ }
2137
+ / id:V_TYPE_IDENTIFIER white_space {
2138
+ def value
2139
+ id.value
2140
+ end
2141
+ }
2142
+ end
2143
+
2144
+ rule boolean_value
2145
+ SYM_TRUE {
2146
+ def value
2147
+ true
2148
+ end
2149
+ }
2150
+ / SYM_FALSE {
2151
+ def value
2152
+ false
2153
+ end
2154
+ }
2155
+ end
2156
+
2157
+ rule boolean_list_value
2158
+ boolean_value (',' white_space more_bool:(boolean_value ''))+ {
2159
+ def value
2160
+ booelans.map {|b| b.value}
2161
+ end
2162
+
2163
+ def booleans
2164
+ [boolean_value] + more_bool.elements.map { |b| b.boolean_value }
2165
+ end
2166
+ }
2167
+ / boolean_value white_space SYM_LIST_CONTINUE {
2168
+ def value
2169
+ [boolean_value.value]
2170
+ end
2171
+ }
2172
+ end
2173
+
2174
+ rule integer_value
2175
+ [+-]? V_INTEGER '' {
2176
+ def value
2177
+ text_value.to_i
2178
+ end
2179
+ }
2180
+ end
2181
+
2182
+ rule integer_list_value
2183
+ integer_value more_i:(',' white_space integer_value)+ {
2184
+ def value
2185
+ integers.map { |i| i.value }
2186
+ end
2187
+
2188
+ def integers
2189
+ [integer_value] + more_i.elements.map { |i| i.integer_value }
2190
+ end
2191
+ }
2192
+ / integer_value ',' white_space SYM_LIST_CONTINUE {
2193
+ def value
2194
+ [integer_value.value]
2195
+ end
2196
+ }
2197
+ end
2198
+
2199
+ rule integer_interval_value
2200
+ SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_ELLIPSIS SYM_LT up:integer_value SYM_INTERVAL_DELIM {
2201
+ def value
2202
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2203
+ :upper => up.value,
2204
+ :lower_included => false,
2205
+ :upper_included => false)
2206
+ end
2207
+ }
2208
+ / SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_ELLIPSIS up:integer_value SYM_INTERVAL_DELIM {
2209
+ def value
2210
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2211
+ :upper => up.value,
2212
+ :lower_included => false,
2213
+ :upper_included => true)
2214
+ end
2215
+ }
2216
+ / SYM_INTERVAL_DELIM lo:integer_value SYM_ELLIPSIS SYM_LT up:integer_value SYM_INTERVAL_DELIM {
2217
+ def value
2218
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2219
+ :upper => up.value,
2220
+ :lower_included => true,
2221
+ :upper_included => false)
2222
+ end
2223
+ }
2224
+ / SYM_INTERVAL_DELIM lo:integer_value SYM_ELLIPSIS up:integer_value SYM_INTERVAL_DELIM {
2225
+ def value
2226
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2227
+ :upper => up.value,
2228
+ :lower_included => true,
2229
+ :upper_included => true)
2230
+ end
2231
+ }
2232
+ / SYM_INTERVAL_DELIM SYM_LT up:integer_value SYM_INTERVAL_DELIM {
2233
+ def value
2234
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2235
+ :upper => up.value,
2236
+ :lower_unbounded => true,
2237
+ :upper_included => false)
2238
+ end
2239
+ }
2240
+ / SYM_INTERVAL_DELIM SYM_LE up:integer_value SYM_INTERVAL_DELIM {
2241
+ def value
2242
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2243
+ :upper => up.value,
2244
+ :lower_unbounded => true,
2245
+ :upper_included => true)
2246
+ end
2247
+ }
2248
+ / SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_INTERVAL_DELIM {
2249
+ def value
2250
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2251
+ :lower => lo.value,
2252
+ :uppper_unbounded => true,
2253
+ :lower_included => false)
2254
+ end
2255
+ }
2256
+ / SYM_INTERVAL_DELIM SYM_GE iv:integer_value SYM_INTERVAL_DELIM {
2257
+ def value
2258
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2259
+ :lower => iv.value,
2260
+ :upper_unbounded => true,
2261
+ :lower_included => true)
2262
+ end
2263
+ }
2264
+ / SYM_INTERVAL_DELIM val:integer_value SYM_INTERVAL_DELIM {
2265
+ def value
2266
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2267
+ :lower => val.value,
2268
+ :upper => val.value,
2269
+ :upper_included => true,
2270
+ :lower_included => true)
2271
+ end
2272
+ }
2273
+ end
2274
+
2275
+ rule real_value
2276
+ ('+' / '-')? V_REAL {
2277
+ def value
2278
+ text_value.to_f
2279
+ end
2280
+ }
2281
+ end
2282
+
2283
+ rule real_list_value
2284
+ real_value more_i:(',' white_space real_value)* {
2285
+ def value
2286
+ reals.map { |i| i.value }
2287
+ end
2288
+
2289
+ def reals
2290
+ [real_value] + more_i.elements.map { |i| i.real_value }
2291
+ end
2292
+ }
2293
+ / real_value ',' white_space SYM_LIST_CONTINUE {
2294
+ def value
2295
+ [real_value.value]
2296
+ end
2297
+ }
2298
+ end
2299
+
2300
+ rule real_interval_value
2301
+ SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_ELLIPSIS SYM_LT up:real_value SYM_INTERVAL_DELIM {
2302
+ def value
2303
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2304
+ :upper => up.value,
2305
+ :lower_included => false,
2306
+ :upper_included => false)
2307
+ end
2308
+ }
2309
+ / SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_ELLIPSIS up:real_value SYM_INTERVAL_DELIM {
2310
+ def value
2311
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2312
+ :upper => up.value,
2313
+ :lower_included => false,
2314
+ :upper_included => true)
2315
+ end
2316
+ }
2317
+ / SYM_INTERVAL_DELIM lo:real_value SYM_ELLIPSIS SYM_LT up:real_value SYM_INTERVAL_DELIM {
2318
+ def value
2319
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2320
+ :upper => up.value,
2321
+ :lower_included => true,
2322
+ :upper_included => false)
2323
+ end
2324
+ }
2325
+ / SYM_INTERVAL_DELIM lo:real_value SYM_ELLIPSIS up:real_value SYM_INTERVAL_DELIM {
2326
+ def value
2327
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2328
+ :upper => up.value,
2329
+ :lower_included => true,
2330
+ :upper_included => true)
2331
+ end
2332
+ }
2333
+ / SYM_INTERVAL_DELIM SYM_LT up:real_value SYM_INTERVAL_DELIM {
2334
+ def value
2335
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2336
+ :upper => up.value,
2337
+ :lower_unbounded => true,
2338
+ :upper_included => false)
2339
+ end
2340
+ }
2341
+ / SYM_INTERVAL_DELIM SYM_LE up:real_value SYM_INTERVAL_DELIM {
2342
+ def value
2343
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2344
+ :upper => up.value,
2345
+ :lower_unbounded => true,
2346
+ :upper_included => true)
2347
+ end
2348
+ }
2349
+ / SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_INTERVAL_DELIM {
2350
+ def value
2351
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2352
+ :lower => lo.value,
2353
+ :uppper_unbounded => true,
2354
+ :lower_included => false)
2355
+ end
2356
+ }
2357
+ / SYM_INTERVAL_DELIM SYM_GE lo:real_value SYM_INTERVAL_DELIM {
2358
+ def value
2359
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2360
+ :lower => lo.value,
2361
+ :upper_unbounded => true,
2362
+ :lower_included => true)
2363
+ end
2364
+ }
2365
+ / SYM_INTERVAL_DELIM val:real_value SYM_INTERVAL_DELIM {
2366
+ def value
2367
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2368
+ :lower => val.value,
2369
+ :upper => val.value,
2370
+ :upper_included => true,
2371
+ :lower_included => true)
2372
+ end
2373
+ }
2374
+ end
2375
+
2376
+ rule character_value
2377
+ V_CHAR '' {
2378
+ def value
2379
+ text_value
2380
+ end
2381
+ }
2382
+ end
2383
+
2384
+ rule character_list_value
2385
+ character_value (',' white_space more_chars:(character_value))+ {
2386
+ def value
2387
+ characters.map {|c| c.value }
2388
+ end
2389
+
2390
+ def characters
2391
+ [character_value] + more_chars.elements.map {|c| c.character_value}
2392
+ end
2393
+ }
2394
+ / character_value ',' SYM_LIST_CONTINUE {
2395
+ def value
2396
+ [character_value.value]
2397
+ end
2398
+ }
2399
+ end
2400
+
2401
+ rule string_value
2402
+ str:V_STRING '' {
2403
+ def value
2404
+ str.value
2405
+ end
2406
+ }
2407
+ end
2408
+
2409
+ rule string_list_value
2410
+ first:string_value second:(',' white_space string_value)+ {
2411
+ def value
2412
+ strings.map {|s| s.value}
2413
+ end
2414
+
2415
+ def strings
2416
+ [first] + second.elements.map {|s| s.string_value}
2417
+ end
2418
+ }
2419
+ / str:V_STRING ',' white_space SYM_LIST_CONTINUE {
2420
+ def value
2421
+ [str.value]
2422
+ end
2423
+ }
2424
+ end
2425
+
2426
+ rule date_value
2427
+ ed:V_ISO8601_EXTENDED_DATE '' {
2428
+ def value
2429
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDate.new(
2430
+ :value => ed.text_value)
2431
+ end
2432
+ }
2433
+ end
2434
+
2435
+ rule date_list_value
2436
+ date_value more_dates:(',' white_space date_value)+ {
2437
+ def value
2438
+ dates.map {|d| d.value}
2439
+ end
2440
+
2441
+ def dates
2442
+ [date_value] + more_dates.elements.map {|d| d.date_value}
2443
+ end
2444
+ }
2445
+ / date_value ',' white_space SYM_LIST_CONTINUE {
2446
+ def value
2447
+ [date_value.value]
2448
+ end
2449
+ }
2450
+ end
2451
+
2452
+ rule date_interval_value
2453
+ SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_ELLIPSIS SYM_LT up:date_value SYM_INTERVAL_DELIM {
2454
+ def value
2455
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2456
+ :upper => up.value,
2457
+ :lower_included => false,
2458
+ :upper_included => false)
2459
+ end
2460
+ }
2461
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_ELLIPSIS up:date_value SYM_INTERVAL_DELIM {
2462
+ def value
2463
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2464
+ :upper => up.value,
2465
+ :lower_included => false,
2466
+ :upper_included => true)
2467
+ end
2468
+ }
2469
+ / SYM_INTERVAL_DELIM lo:date_value SYM_ELLIPSIS SYM_LT up:date_value SYM_INTERVAL_DELIM {
2470
+ def value
2471
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2472
+ :upper => up.value,
2473
+ :lower_included => true,
2474
+ :upper_included => false)
2475
+ end
2476
+ }
2477
+ / SYM_INTERVAL_DELIM lo:date_value SYM_ELLIPSIS up:date_value SYM_INTERVAL_DELIM {
2478
+ def value
2479
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2480
+ :upper => up.value,
2481
+ :lower_included => true,
2482
+ :upper_included => true)
2483
+ end
2484
+ }
2485
+ / SYM_INTERVAL_DELIM SYM_LT up:date_value SYM_INTERVAL_DELIM {
2486
+ def value
2487
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2488
+ :upper => up.value,
2489
+ :lower_unbounded => true,
2490
+ :upper_included => false)
2491
+ end
2492
+ }
2493
+ / SYM_INTERVAL_DELIM SYM_LE up:date_value SYM_INTERVAL_DELIM {
2494
+ def value
2495
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2496
+ :upper => up.value,
2497
+ :lower_unbounded => true,
2498
+ :upper_included => true)
2499
+ end
2500
+ }
2501
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_INTERVAL_DELIM {
2502
+ def value
2503
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2504
+ :lower => lo.value,
2505
+ :uppper_unbounded => true,
2506
+ :lower_included => false)
2507
+ end
2508
+ }
2509
+ / SYM_INTERVAL_DELIM SYM_GE val:date_value SYM_INTERVAL_DELIM {
2510
+ def value
2511
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2512
+ :lower => val.value,
2513
+ :upper_unbounded => true,
2514
+ :lower_included => true)
2515
+ end
2516
+ }
2517
+ / SYM_INTERVAL_DELIM val:date_value SYM_INTERVAL_DELIM {
2518
+ def value
2519
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2520
+ :lower => val.value,
2521
+ :upper => val.value,
2522
+ :upper_included => true,
2523
+ :lower_included => true)
2524
+ end
2525
+ }
2526
+ end
2527
+
2528
+ rule time_value
2529
+ ti:V_ISO8601_EXTENDED_TIME '' {
2530
+ def value
2531
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvTime.new(
2532
+ :value => ti.text_value)
2533
+ end
2534
+ }
2535
+ end
2536
+
2537
+ rule time_list_value
2538
+ time_value more_t:(',' white_space time_value)+ {
2539
+ def value
2540
+ times.map {|t| t.value}
2541
+ end
2542
+
2543
+ def times
2544
+ [time_value] + more_t.elements.map {|t| t.time_value}
2545
+ end
2546
+ }
2547
+ / time_value ',' white_space SYM_LIST_CONTINUE {
2548
+ def value
2549
+ [time_value.value]
2550
+ end
2551
+ }
2552
+ end
2553
+
2554
+ rule time_interval_value
2555
+ SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_ELLIPSIS SYM_LT up:time_value SYM_INTERVAL_DELIM {
2556
+ def value
2557
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2558
+ :upper => up.value,
2559
+ :lower_included => false,
2560
+ :upper_included => false)
2561
+ end
2562
+ }
2563
+ / SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_ELLIPSIS up:time_value SYM_INTERVAL_DELIM {
2564
+ def value
2565
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2566
+ :upper => up.value,
2567
+ :lower_included => false,
2568
+ :upper_included => true)
2569
+ end
2570
+ }
2571
+ / SYM_INTERVAL_DELIM lo:time_value SYM_ELLIPSIS SYM_LT up:time_value SYM_INTERVAL_DELIM {
2572
+ def value
2573
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2574
+ :upper => up.value,
2575
+ :lower_included => true,
2576
+ :upper_included => false)
2577
+ end
2578
+ }
2579
+ / SYM_INTERVAL_DELIM lo:time_value SYM_ELLIPSIS up:time_value SYM_INTERVAL_DELIM {
2580
+ def value
2581
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2582
+ :upper => up.value,
2583
+ :lower_included => true,
2584
+ :upper_included => true)
2585
+ end
2586
+ }
2587
+ / SYM_INTERVAL_DELIM SYM_LT up:time_value SYM_INTERVAL_DELIM {
2588
+ def value
2589
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2590
+ :upper => up.value,
2591
+ :lower_unbounded => true,
2592
+ :upper_included => false)
2593
+ end
2594
+ }
2595
+ / SYM_INTERVAL_DELIM SYM_LE up:time_value SYM_INTERVAL_DELIM {
2596
+ def value
2597
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2598
+ :upper => up.value,
2599
+ :lower_unbounded => true,
2600
+ :upper_included => true)
2601
+ end
2602
+ }
2603
+ / SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_INTERVAL_DELIM {
2604
+ def value
2605
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2606
+ :lower => lo.value,
2607
+ :uppper_unbounded => true,
2608
+ :lower_included => false)
2609
+ end
2610
+ }
2611
+ / SYM_INTERVAL_DELIM SYM_GE tv:time_value SYM_INTERVAL_DELIM {
2612
+ def value
2613
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2614
+ :lower => tv.value,
2615
+ :upper_unbounded => true,
2616
+ :lower_included => true)
2617
+ end
2618
+ }
2619
+ / SYM_INTERVAL_DELIM val:time_value SYM_INTERVAL_DELIM {
2620
+ def value
2621
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2622
+ :lower => val.value,
2623
+ :upper => val.value,
2624
+ :upper_included => true,
2625
+ :lower_included => true)
2626
+ end
2627
+ }
2628
+ end
2629
+
2630
+ rule date_time_value
2631
+ dt:V_ISO8601_EXTENDED_DATE_TIME '' {
2632
+ def value
2633
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDateTime.new(
2634
+ :value => dt.text_value)
2635
+ end
2636
+ }
2637
+ end
2638
+
2639
+ rule date_time_list_value
2640
+ date_time_value (',' more_dt:date_time_value)+ {
2641
+ def value
2642
+ date_times.map {|t| t.value}
2643
+ end
2644
+
2645
+ def date_times
2646
+ [date_time_value] + more_dt.elements.map {|dt| dt.date_time_value}
2647
+ end
2648
+ }
2649
+ / date_time_value ',' SYM_LIST_CONTINUE {
2650
+ def value
2651
+ [date_time_value.value]
2652
+ end
2653
+ }
2654
+ end
2655
+
2656
+ rule date_time_interval_value
2657
+ SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_ELLIPSIS SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
2658
+ def value
2659
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2660
+ :upper => up.value,
2661
+ :lower_included => false,
2662
+ :upper_included => false)
2663
+ end
2664
+ }
2665
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_ELLIPSIS up:date_time_value SYM_INTERVAL_DELIM {
2666
+ def value
2667
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2668
+ :upper => up.value,
2669
+ :lower_included => false,
2670
+ :upper_included => true)
2671
+ end
2672
+ }
2673
+ / SYM_INTERVAL_DELIM lo:date_time_value SYM_ELLIPSIS SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
2674
+ def value
2675
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2676
+ :upper => up.value,
2677
+ :lower_included => true,
2678
+ :upper_included => false)
2679
+ end
2680
+ }
2681
+ / SYM_INTERVAL_DELIM lo:date_time_value SYM_ELLIPSIS up:date_time_value SYM_INTERVAL_DELIM {
2682
+ def value
2683
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2684
+ :upper => up.value,
2685
+ :lower_included => true,
2686
+ :upper_included => true)
2687
+ end
2688
+ }
2689
+ / SYM_INTERVAL_DELIM SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
2690
+ def value
2691
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2692
+ :upper => up.value,
2693
+ :lower_unbounded => true,
2694
+ :upper_included => false)
2695
+ end
2696
+ }
2697
+ / SYM_INTERVAL_DELIM SYM_LE up:date_time_value SYM_INTERVAL_DELIM {
2698
+ def value
2699
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2700
+ :upper => up.value,
2701
+ :lower_unbounded => true,
2702
+ :upper_included => true)
2703
+ end
2704
+ }
2705
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_INTERVAL_DELIM {
2706
+ def value
2707
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2708
+ :lower => lo.value,
2709
+ :uppper_unbounded => true,
2710
+ :lower_included => false)
2711
+ end
2712
+ }
2713
+ / SYM_INTERVAL_DELIM SYM_GE dt:date_time_value SYM_INTERVAL_DELIM {
2714
+ def value
2715
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2716
+ :lower => dt.value,
2717
+ :upper_unbounded => true,
2718
+ :lower_included => true)
2719
+ end
2720
+ }
2721
+ / SYM_INTERVAL_DELIM val:date_time_value SYM_INTERVAL_DELIM {
2722
+ def value
2723
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2724
+ :lower => val.value,
2725
+ :upper => val.value,
2726
+ :upper_included => true,
2727
+ :lower_included => true)
2728
+ end
2729
+ }
2730
+ end
2731
+
2732
+ rule duration_value
2733
+ du:V_ISO8601_DURATION '' {
2734
+ def value
2735
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDuration.new(
2736
+ :value => du.text_value)
2737
+ end
2738
+ }
2739
+ end
2740
+
2741
+ rule duration_list_value
2742
+ duration_value more_d:(',' duration_value)+ {
2743
+ def value
2744
+ durations.map {|d| d.value}
2745
+ end
2746
+
2747
+ def durations
2748
+ [duration_value] + more_d.elements.map {|d| d.duration_value}
2749
+ end
2750
+ }
2751
+ / duration_value ',' SYM_LIST_CONTINUE {
2752
+ def value
2753
+ [duration_value.value]
2754
+ end
2755
+ }
2756
+ end
2757
+
2758
+ rule duration_interval_value
2759
+ SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_ELLIPSIS SYM_LT up:duration_value SYM_INTERVAL_DELIM {
2760
+ def value
2761
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2762
+ :upper => up.value,
2763
+ :lower_included => false,
2764
+ :upper_included => false)
2765
+ end
2766
+ }
2767
+ / SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_ELLIPSIS up:duration_value SYM_INTERVAL_DELIM {
2768
+ def value
2769
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2770
+ :upper => up.value,
2771
+ :lower_included => false,
2772
+ :upper_included => true)
2773
+ end
2774
+ }
2775
+ / SYM_INTERVAL_DELIM lo:duration_value SYM_ELLIPSIS SYM_LT up:duration_value SYM_INTERVAL_DELIM {
2776
+ def value
2777
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2778
+ :upper => up.value,
2779
+ :lower_included => true,
2780
+ :upper_included => false)
2781
+ end
2782
+ }
2783
+ / SYM_INTERVAL_DELIM lo:duration_value SYM_ELLIPSIS up:duration_value SYM_INTERVAL_DELIM {
2784
+ def value
2785
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
2786
+ :upper => up.value,
2787
+ :lower_included => true,
2788
+ :upper_included => true)
2789
+ end
2790
+ }
2791
+ / SYM_INTERVAL_DELIM SYM_LT up:duration_value SYM_INTERVAL_DELIM {
2792
+ def value
2793
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2794
+ :upper => up.value,
2795
+ :lower_unbounded => true,
2796
+ :upper_included => false)
2797
+ end
2798
+ }
2799
+ / SYM_INTERVAL_DELIM SYM_LE up:duration_value SYM_INTERVAL_DELIM {
2800
+ def value
2801
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2802
+ :upper => up.value,
2803
+ :lower_unbounded => true,
2804
+ :upper_included => true)
2805
+ end
2806
+ }
2807
+ / SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_INTERVAL_DELIM {
2808
+ def value
2809
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2810
+ :lower => lo.value,
2811
+ :uppper_unbounded => true,
2812
+ :lower_included => false)
2813
+ end
2814
+ }
2815
+ / SYM_INTERVAL_DELIM SYM_GE val:duration_value SYM_INTERVAL_DELIM {
2816
+ def value
2817
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2818
+ :lower => val.value,
2819
+ :upper_unbounded => true,
2820
+ :lower_included => true)
2821
+ end
2822
+ }
2823
+ / SYM_INTERVAL_DELIM val:duration_value SYM_INTERVAL_DELIM {
2824
+ def value
2825
+ OpenEHR::AssumedLibraryTypes::Interval.new(
2826
+ :upper => val.value,
2827
+ :lower => val.value,
2828
+ :upper_included => true,
2829
+ :lower_included => true)
2830
+ end
2831
+ }
2832
+ end
2833
+
2834
+ rule ALPHANUM
2835
+ [a-zA-Z0-9]
2836
+ end
2837
+
2838
+ rule IDCHAR
2839
+ [a-zA-Z0-9_]
2840
+ end
2841
+
2842
+ rule NAMECHAR
2843
+ [a-zA-Z0-9\._\-]
2844
+ end
2845
+
2846
+ rule NAMECHAR_SPACE
2847
+ [a-zA-Z0-9\._\- ]
2848
+ end
2849
+
2850
+ rule NAMECHAR_PAREN
2851
+ [a-zA-Z0-9\._\-\(\)]
2852
+ end
2853
+
2854
+ rule NAMESTR
2855
+ [a-zA-Z] [a-zA-Z0-9_]+
2856
+ end
2857
+
2858
+ rule space
2859
+ COMMENT* white_space
2860
+ end
2861
+
2862
+ rule COMMENT
2863
+ white_space '--' [^\n]* "\n"
2864
+ end
2865
+
2866
+ rule white_space
2867
+ [ \t\r\n]*
2868
+ end
2869
+
2870
+ rule Minus_code
2871
+ '-'
2872
+ end
2873
+
2874
+ rule Plus_Code
2875
+ '+'
2876
+ end
2877
+
2878
+ rule Star_code
2879
+ '*'
2880
+ end
2881
+
2882
+ rule Slash_code
2883
+ '/'
2884
+ end
2885
+
2886
+ rule Carret_code
2887
+ '^'
2888
+ end
2889
+
2890
+ rule Dot_code
2891
+ '.'
2892
+ end
2893
+
2894
+ rule Semicolon_code
2895
+ ';'
2896
+ end
2897
+
2898
+ rule Colon_code
2899
+ ':'
2900
+ end
2901
+
2902
+ rule Comma_code
2903
+ ','
2904
+ end
2905
+
2906
+ rule Expclamation_code
2907
+ '!'
2908
+ end
2909
+
2910
+ rule Left_parenthesis_code
2911
+ '('
2912
+ end
2913
+
2914
+ rule Right_parenthesis_code
2915
+ ')'
2916
+ end
2917
+
2918
+ rule Dollar_code
2919
+ '$'
2920
+ end
2921
+
2922
+ rule SYM_DT_UNKNOWN
2923
+ '??'
2924
+ end
2925
+
2926
+ rule Question_mark_code
2927
+ '?'
2928
+ end
2929
+
2930
+ rule SYM_INTERVAL_DELIM
2931
+ '|'
2932
+ end
2933
+
2934
+ rule Left_bracket_code
2935
+ '[' space
2936
+ end
2937
+
2938
+ rule Right_bracket_codde
2939
+ ']'
2940
+ end
2941
+
2942
+ rule SYM_EQ
2943
+ '=' white_space
2944
+ end
2945
+
2946
+ rule SYM_GE
2947
+ ('=>' / '>=') white_space
2948
+ end
2949
+
2950
+ rule SYM_LE
2951
+ ('<=' / '=>') white_space
2952
+ end
2953
+
2954
+ rule SYM_LT
2955
+ '<' white_space
2956
+ end
2957
+
2958
+ rule SYM_GT
2959
+ '>' white_space
2960
+ end
2961
+
2962
+ rule SYM_START_DBLOCK
2963
+ '<' space
2964
+ end
2965
+
2966
+ rule SYM_END_DBLOCK
2967
+ '>' space
2968
+ end
2969
+
2970
+ rule SYM_START_CBLOCK
2971
+ '{' space
2972
+ end
2973
+
2974
+ rule SYM_END_CBLOCK
2975
+ '}'
2976
+ end
2977
+
2978
+ rule SYM_ELLIPSIS
2979
+ '..'
2980
+ end
2981
+
2982
+ rule SYM_LIST_CONTINUE
2983
+ '...'
2984
+ end
2985
+
2986
+ rule SYM_INFINITY
2987
+ [Ii] [Nn] [Ff] [Ii] [Nn] [Ii] [Tt] [Yy] space
2988
+ end
2989
+
2990
+ rule SYM_ARCHETYPE
2991
+ [Aa] [Rr] [Cc] [Hh] [Ee] [Tt] [Yy] [Pp] [Ee] space
2992
+ end
2993
+
2994
+ rule SYM_MATCHES
2995
+ ([Mm] [Aa] [Tt] [Cc] [Hh] [Ee] [Ss] / [Ii] [Ss] '_' [Ii] [Nn]) white_space
2996
+ end
2997
+
2998
+ rule SYM_THEN
2999
+ [Tt] [Hh] [Ee] [Nn] space
3000
+ end
3001
+
3002
+ rule SYM_ELSE
3003
+ [Ee] [Ll] [Ss] [Ee] space
3004
+ end
3005
+
3006
+ rule SYM_AND
3007
+ [Aa] [Nn] [Dd] space
3008
+ end
3009
+
3010
+ rule SYM_OR
3011
+ [Oo] [Rr] space
3012
+ end
3013
+
3014
+ rule SYM_XOR
3015
+ [Xx] [Oo] [Rr] space
3016
+ end
3017
+
3018
+ rule SYM_NOT
3019
+ [Nn] [Oo] [Tt] space
3020
+ end
3021
+
3022
+ rule SYM_IMPLIES
3023
+ [Ii] [Mm] [Pp] [Ll] [Ii] [Ee] [Ss] space
3024
+ end
3025
+
3026
+ rule SYM_TRUE
3027
+ [Tt] [Rr] [Uu] [Ee] space
3028
+ end
3029
+
3030
+ rule SYM_FALSE
3031
+ [Ff] [Aa] [Ll] [Ss] [Ee] space
3032
+ end
3033
+
3034
+ rule SYM_FORALL
3035
+ [Ff] [Oo] [Rr] '_' [Aa] [Ll] [Ll] space
3036
+ end
3037
+
3038
+ rule SYM_EXISTS
3039
+ [Ee] [Xx] [Ii] [Ss] [Tt] [Ss] space
3040
+ end
3041
+
3042
+ rule SYM_EXISTENCE
3043
+ [Ee] [Xx] [Ii] [Ss] [Tt] [Ee] [Nn] [Cc] [Ee] space
3044
+ end
3045
+
3046
+ rule SYM_OCCURRENCES
3047
+ [Oo] [Cc] [Cc] [Uu] [Rr] [Rr] [Ee] [Nn] [Cc] [Ee] [Ss] white_space
3048
+ end
3049
+
3050
+ rule SYM_CARDINALITY
3051
+ [Cc] [Aa] [Rr] [Dd] [Ii] [Nn] [Aa] [Ll] [Ii] [Tt] [Yy] white_space
3052
+ end
3053
+
3054
+ rule SYM_ORDERED
3055
+ [Oo] [Rr] [Dd] [Ee] [Rr] [Ee] [Dd] white_space
3056
+ end
3057
+
3058
+ rule SYM_UNORDERD
3059
+ [Uu] [Nn] [Oo] [Rr] [Dd] [Ee] [Rr] [Ee] [Dd] white_space
3060
+ end
3061
+
3062
+ rule SYM_UNIQUE
3063
+ [Uu] [Nn] [Ii] [Qq] [Uu] [Ee] space
3064
+ end
3065
+
3066
+ rule SYM_INFINITY
3067
+ [Ii] [Nn] [Ff] [Ii] [Nn] [Ii] [Tt] [Yy] space
3068
+ end
3069
+
3070
+ rule SYM_USE_NODE
3071
+ [Uu] [Ss] [Ee] '_' [Nn] [Oo] [Dd] [Ee] space
3072
+ end
3073
+
3074
+ rule SYM_ALLOW_ARCHETYPE
3075
+ ([Aa] [Ll] [Ll] [Oo] [Ww] / [Uu] [Ss] [Ee]) '_' [Aa] [Rr] [Cc] [Hh] [Ee] [Tt] [Yy] [Pp] [Ee] space
3076
+ end
3077
+
3078
+ rule SYM_INCLUDE
3079
+ [Ii] [Nn] [Cc] [Ll] [Uu] [Dd] [Ee] space
3080
+ end
3081
+
3082
+ rule SYM_EXCLUDE
3083
+ [Ee] [Xx] [Cc] [Ll] [Uu] [Dd] [Ee] space
3084
+ end
3085
+
3086
+ rule SYM_TEMPLATE_COMPONENT
3087
+ [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] ' _' [Cc] [Oo] [Mm] [Pp] [Oo] [Nn] [Ee] [Nn] [Tt] space
3088
+ end
3089
+
3090
+ rule SYM_TEMPLATE
3091
+ [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] space
3092
+ end
3093
+
3094
+ rule SYM_OPERATIONAL_TEMPLATE
3095
+ [Oo] [Pp] [Ee] [Rr] [Aa] [Tt] [Ii] [Oo] [Nn] [Aa] [Ll] '_' [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] space
3096
+ end
3097
+
3098
+ rule SYM_ADL_VERSION
3099
+ [Aa] [Dd] [Ll] '_' [Vv] [Ee] [Rr] [Ss] [Ii] [Oo] [Nn] space
3100
+ end
3101
+
3102
+ rule SYM_IS_CONTROLLED
3103
+ [Cc] [Oo] [Nn] [Tt] [Rr] [Oo] [Ll] [Ll] [Ee] [Dd] space
3104
+ end
3105
+
3106
+ rule SYM_IS_GENERATED
3107
+ [Gg] [Ee] [Nn] [Ee] [Rr] [Aa] [Tt] [Ee] [Dd] space
3108
+ end
3109
+
3110
+ rule SYM_SPECIALIZE
3111
+ [Ss] [Pp] [Ee] [Cc] [Ii] [Aa] [Ll] [Ii] [SsZz] [Ee] space
3112
+ end
3113
+
3114
+ rule SYM_CONCEPT
3115
+ [Cc] [Oo] [Nn] [Cc] [Ee] [Pp] [Tt] space
3116
+ end
3117
+
3118
+ rule SYM_LANGUAGE
3119
+ [Ll] [Aa] [Nn] [Gg] [Uu] [Aa] [Gg] [Ee] space
3120
+ end
3121
+
3122
+ rule SYM_DESCRIPTION
3123
+ [Dd] [Ee] [Ss] [Cc] [Rr] [Ii] [Pp] [Tt] [Ii] [Oo] [Nn] space
3124
+ end
3125
+
3126
+ rule SYM_DEFINITION
3127
+ [Dd] [Ee] [Ff] [Ii] [Nn] [Ii] [Tt] [Ii] [Oo] [Nn] space
3128
+ end
3129
+
3130
+ rule SYM_INVARIANT
3131
+ [Ii] [Nn] [Vv] [Aa] [Rr] [Ii] [Aa] [Nn] [Tt] space
3132
+ end
3133
+
3134
+ rule SYM_ONTOLOGY
3135
+ [Oo] [Nn] [Tt] [Oo] [Ll] [Oo] [Gg] [Yy] space
3136
+ end
3137
+
3138
+ rule SYM_ANNOTATIONS
3139
+ [Aa] [Nn] [Nn] [Oo] [Tt] [Aa] [Tt] [Ii] [Oo] [Nn] [Ss] space
3140
+ end
3141
+
3142
+ rule V_VERSION_STRING
3143
+ [0-9]+ '.' [0-9]+ ('.' [0-9]+)* {
3144
+ def value
3145
+ text_value
3146
+ end
3147
+ }
3148
+ end
3149
+
3150
+ rule V_ARCHETYPE_ID
3151
+ NAMESTR ('-' NAMESTR) 2..2 '.' NAMESTR ('-' NAMESTR)* '.v' [1-9] [0-9]* {
3152
+ def value
3153
+ text_value
3154
+ end
3155
+ }
3156
+ end
3157
+
3158
+ rule V_IDENTIFIER
3159
+ [a-zA-Z] [a-zA-Z0-9_]* {
3160
+ def value
3161
+ text_value
3162
+ end
3163
+ }
3164
+ end
3165
+
3166
+ rule V_URI
3167
+ [a-z]+ '://' [^<>|\\{}^~"\[\] ]* {
3168
+ def value
3169
+ text_value
3170
+ end
3171
+ }
3172
+ end
3173
+
3174
+ rule V_QUALIFIED_TERM_CODE_REF
3175
+ '[' ti:(NAMECHAR_PAREN+) '::' cs:(NAMECHAR+) ']' {
3176
+ def value
3177
+ term_id = OpenEHR::RM::Support::Identification::TerminologyID.new(
3178
+ :value => ti.text_value)
3179
+ OpenEHR::RM::DataTypes::Text::CodePhrase.new(
3180
+ :terminology_id => term_id, :code_string => cs.text_value)
3181
+ end
3182
+ }
3183
+ end
3184
+
3185
+ rule ERR_V_QUALIFIED_TERM_CODE_REF
3186
+ '[' er:(NAMECHAR_PAREN+ '::' NAMECHAR_SPACE+) ']' {
3187
+ def value
3188
+ er.text_value
3189
+ end
3190
+ }
3191
+ end
3192
+
3193
+ rule V_LOCAL_TERM_CODE_REF
3194
+ '[' lt:(ALPHANUM NAMECHAR*) ']' {
3195
+ def value
3196
+ lt.text_value
3197
+ end
3198
+ }
3199
+ end
3200
+
3201
+ rule V_LOCAL_CODE
3202
+ 'a' [ct] [0-9\.]+ {
3203
+ def value
3204
+ text_value
3205
+ end
3206
+ }
3207
+ end
3208
+
3209
+ rule V_TERM_CODE
3210
+ '[' code:([a-zA-Z0-9()._\-]+) '::' white_space {
3211
+ def value
3212
+ ::OpenEHR::RM::Support::Identification::TerminologyID.new(
3213
+ :value => code.text_value)
3214
+ end
3215
+ }
3216
+ end
3217
+
3218
+ rule V_ISO8601_EXTENDED_DATE_TIME
3219
+ ([0-9] 4..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..4)? ) / ([0-9] 4..4 '-' [0-1] [0-9] '-' [0-3] [0-9] 'T' [0-2] [0-9] ':' [0-6] [0-9] ('Z' / [+-] [0-9] 4..4)?) / ([0-9] 4..4 '-' [0-1] [0-9] '-' [0-3] [0-9] 'T' [0-2] [0-9] ('Z' / [+-] [0-9] 4..4)?)
3220
+ end
3221
+
3222
+ rule V_ISO8601_EXTENDED_TIME
3223
+ [0-2] [0-9] ':' [0-6] [0-9] ':' [0-6] [0-9] (',' [0-9]+)? ('Z' / [+-] [0-9] 4..4)? / [0-2] [0-9] ':' [0-6] [0-9] ('Z' / [+-] [0-9] 4..4)?
3224
+ end
3225
+
3226
+ rule V_ISO8601_EXTENDED_DATE
3227
+ [0-9] 4..4 '-' [0-1] [0-9] '-' [0-3] [0-9] / [0-9] 4..4 '-' [0-1] [0-9]
3228
+ end
3229
+
3230
+ rule V_ISO8601_DURATION
3231
+ 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])? 'T' ([0-9]+ [hH]) ([0-9]+ [mM])? ([0-9]+ ('.' [0-9]+)? [sS])?
3232
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])? 'T' ([0-9]+ [hH])? ([0-9]+ [mM]) ([0-9]+ ('.' [0-9]+)? [sS])?
3233
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])? 'T' ([0-9]+ [hH])? ([0-9]+ [mM])? ([0-9]+ ('.' [0-9]+)? [sS])?
3234
+ / 'P' ([0-9]+ [yY]) ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])?
3235
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM]) ([0-9]+ [wW])? ([0-9]+ [dD])?
3236
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW]) ([0-9]+ [dD])?
3237
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])
3238
+ end
3239
+
3240
+ rule V_ISO8601_DATE_CONSTRAINT_PATTERN
3241
+ [yY] [yY] [yY] [yY] '-' [mM?X] [mM?X] '-' [dD?X] [dD?X]
3242
+ end
3243
+
3244
+ rule V_ISO8601_TIME_CONSTRAINT_PATTERN
3245
+ [hH] [hH] ':' [mM?X] [mM?X] ':' [sS?X] [sS?X]
3246
+ end
3247
+
3248
+ rule V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
3249
+ [yY] [yY] [yY] [yY] '-' [mM?X] [mM?X] '-' [dD?X] [dD?X] [Tt ] [hH?X] [hH?X] ':' [mM?X] [mM?X] ':' [sS?X] [sS?X]
3250
+ end
3251
+
3252
+ rule V_ISO8601_DURATION_CONSTRAINT_PATTERN
3253
+ 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH] [mM]? [sS]?
3254
+ / 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH]? [mM] [sS]?
3255
+ / 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH]? [mM]? [sS]
3256
+ / 'P' [yY] [mM]? [wW]? [dD]?
3257
+ / 'P' [yY]? [mM] [wW]? [dD]?
3258
+ / 'P' [yY]? [mM]? [wW] [dD]?
3259
+ / 'P' [yY]? [mM]? [wW]? [dD]
3260
+ end
3261
+
3262
+ rule V_TYPE_IDENTIFIER
3263
+ [A-Z] IDCHAR* {
3264
+ def value
3265
+ text_value
3266
+ end
3267
+ }
3268
+ end
3269
+
3270
+ rule V_GENERIC_TYPE_IDENTIFIER
3271
+ [A-Z] IDCHAR* '<' [a-zA-Z0-9,_]+ '>' { # <>
3272
+ def value
3273
+ text_value
3274
+ end
3275
+ }
3276
+ end
3277
+
3278
+ rule V_ATTRIBUTE_IDENTIFIER
3279
+ [a-z] IDCHAR* {
3280
+ def value
3281
+ text_value
3282
+ end
3283
+ }
3284
+ end
3285
+
3286
+ rule V_INTEGER
3287
+ [0-9]+ [eE] [+-]? [0-9] {
3288
+ def value
3289
+ text_value.to_i
3290
+ end
3291
+ }
3292
+ / [1-9] [0-9]+ {
3293
+ def value
3294
+ text_value.to_i
3295
+ end
3296
+ }
3297
+ / [0-9] {
3298
+ def value
3299
+ text_value.to_i
3300
+ end
3301
+ }
3302
+ end
3303
+
3304
+ rule V_REAL
3305
+ [0-9]+ '.' [0-9]+ [eE] [+-]? [0-9]+ / [1-9] [0-9]+ '.' [0-9]+ / [0-9] '.' [0-9]+ {
3306
+ def value
3307
+ text_value.to_f
3308
+ end
3309
+ }
3310
+ end
3311
+
3312
+ rule V_CHAR
3313
+ [^\\\n\"] {
3314
+ def value
3315
+ text_value
3316
+ end
3317
+ }
3318
+ end
3319
+
3320
+ rule V_STRING
3321
+ '"' str:(('\"' / !'"' .)*) '"' {
3322
+ def value
3323
+ str.text_value.tr_s('\\\\', '\\')
3324
+ end
3325
+ }
3326
+ end # of Shared Token section
243
3327
  end # of ADLGrammar
244
3328
  end # of Parser
245
3329
  end # of openEHR