openehr 1.1.0
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.
- data/.document +5 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +23 -0
- data/Guardfile +12 -0
- data/History.txt +36 -0
- data/PostInstall.txt +9 -0
- data/README.rdoc +82 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/doc/openehr_terminology.xml +2700 -0
- data/lib/openehr.rb +11 -0
- data/lib/openehr/am.rb +8 -0
- data/lib/openehr/am/archetype.rb +133 -0
- data/lib/openehr/am/archetype/assertion.rb +190 -0
- data/lib/openehr/am/archetype/constraint_model.rb +328 -0
- data/lib/openehr/am/archetype/constraint_model/primitive.rb +327 -0
- data/lib/openehr/am/archetype/ontology.rb +126 -0
- data/lib/openehr/am/openehr_profile.rb +9 -0
- data/lib/openehr/am/openehr_profile/data_types.rb +13 -0
- data/lib/openehr/am/openehr_profile/data_types/basic.rb +114 -0
- data/lib/openehr/am/openehr_profile/data_types/quantity.rb +67 -0
- data/lib/openehr/am/openehr_profile/data_types/text.rb +22 -0
- data/lib/openehr/assumed_library_types.rb +691 -0
- data/lib/openehr/parser.rb +23 -0
- data/lib/openehr/parser/adl.rb +57 -0
- data/lib/openehr/parser/adl_grammar.tt +245 -0
- data/lib/openehr/parser/adl_parser.rb +52 -0
- data/lib/openehr/parser/cadl_grammar.tt +1527 -0
- data/lib/openehr/parser/cadl_node.rb +44 -0
- data/lib/openehr/parser/dadl.rb +13 -0
- data/lib/openehr/parser/dadl_grammar.tt +358 -0
- data/lib/openehr/parser/exception.rb +68 -0
- data/lib/openehr/parser/shared_token_grammar.tt +1229 -0
- data/lib/openehr/parser/validator.rb +19 -0
- data/lib/openehr/parser/xml_perser.rb +13 -0
- data/lib/openehr/rm.rb +15 -0
- data/lib/openehr/rm/common.rb +14 -0
- data/lib/openehr/rm/common/archetyped.rb +182 -0
- data/lib/openehr/rm/common/change_control.rb +332 -0
- data/lib/openehr/rm/common/directory.rb +29 -0
- data/lib/openehr/rm/common/generic.rb +216 -0
- data/lib/openehr/rm/common/resource.rb +154 -0
- data/lib/openehr/rm/composition.rb +103 -0
- data/lib/openehr/rm/composition/content.rb +22 -0
- data/lib/openehr/rm/composition/content/entry.rb +253 -0
- data/lib/openehr/rm/composition/content/navigation.rb +31 -0
- data/lib/openehr/rm/data_structures.rb +25 -0
- data/lib/openehr/rm/data_structures/history.rb +117 -0
- data/lib/openehr/rm/data_structures/item_structure.rb +218 -0
- data/lib/openehr/rm/data_structures/item_structure/representation.rb +63 -0
- data/lib/openehr/rm/data_types.rb +14 -0
- data/lib/openehr/rm/data_types/basic.rb +108 -0
- data/lib/openehr/rm/data_types/charset.lst +818 -0
- data/lib/openehr/rm/data_types/charset_extract.rb +24 -0
- data/lib/openehr/rm/data_types/encapsulated.rb +98 -0
- data/lib/openehr/rm/data_types/quantity.rb +402 -0
- data/lib/openehr/rm/data_types/quantity/date_time.rb +256 -0
- data/lib/openehr/rm/data_types/text.rb +169 -0
- data/lib/openehr/rm/data_types/time_specification.rb +75 -0
- data/lib/openehr/rm/data_types/uri.rb +83 -0
- data/lib/openehr/rm/demographic.rb +269 -0
- data/lib/openehr/rm/ehr.rb +162 -0
- data/lib/openehr/rm/integration.rb +27 -0
- data/lib/openehr/rm/security.rb +12 -0
- data/lib/openehr/rm/support.rb +14 -0
- data/lib/openehr/rm/support/definition.rb +15 -0
- data/lib/openehr/rm/support/identification.rb +412 -0
- data/lib/openehr/rm/support/measurement.rb +17 -0
- data/lib/openehr/rm/support/terminology.rb +135 -0
- data/lib/openehr/serializer.rb +272 -0
- data/lib/openehr/terminology.rb +7 -0
- data/lib/openehr/terminology/open_ehr_terminology.rb +41 -0
- data/lib/openehr/writer.rb +12 -0
- data/openehr.gemspec +472 -0
- data/spec/lib/openehr/am/archetype/archetype_spec.rb +103 -0
- data/spec/lib/openehr/am/archetype/assertion/assertion_spec.rb +60 -0
- data/spec/lib/openehr/am/archetype/assertion/assertion_variable_spec.rb +30 -0
- data/spec/lib/openehr/am/archetype/assertion/expr_binary_operator.rb +40 -0
- data/spec/lib/openehr/am/archetype/assertion/expr_item_spec.rb +28 -0
- data/spec/lib/openehr/am/archetype/assertion/expr_leaf_spec.rb +34 -0
- data/spec/lib/openehr/am/archetype/assertion/expr_operator_spec.rb +25 -0
- data/spec/lib/openehr/am/archetype/assertion/expr_unary_operator_spec.rb +26 -0
- data/spec/lib/openehr/am/archetype/assertion/operator_kind_spec.rb +114 -0
- data/spec/lib/openehr/am/archetype/constraint_model/archetype_constraint_spec.rb +56 -0
- data/spec/lib/openehr/am/archetype/constraint_model/archetype_internal_ref_spec.rb +36 -0
- data/spec/lib/openehr/am/archetype/constraint_model/archetype_slot_spec.rb +61 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_attribute_spec.rb +59 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_complex_object_spec.rb +39 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_defined_object_spec.rb +53 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_domain_type_spec.rb +25 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_multiple_attribute_spec.rb +23 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_object_spec.rb +61 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_primitive_object_spec.rb +33 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_reference_object_spec.rb +17 -0
- data/spec/lib/openehr/am/archetype/constraint_model/c_single_attribute_spec.rb +22 -0
- data/spec/lib/openehr/am/archetype/constraint_model/cardinality_spec.rb +68 -0
- data/spec/lib/openehr/am/archetype/constraint_model/constraint_ref_spec.rb +29 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_boolean_spec.rb +57 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_date_spec.rb +52 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_date_time_spec.rb +136 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_duration_spec.rb +41 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_integer_spec.rb +67 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_primitive_spec.rb +41 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_real_spec.rb +19 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_string_spec.rb +73 -0
- data/spec/lib/openehr/am/archetype/constraint_model/primitive/c_time_spec.rb +104 -0
- data/spec/lib/openehr/am/archetype/ontology/archetype_ontology_spec.rb +97 -0
- data/spec/lib/openehr/am/archetype/ontology/archetype_term_spec.rb +43 -0
- data/spec/lib/openehr/am/archetype/validity_kind_spec.rb +42 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/c_dv_state_spec.rb +34 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/non_terminal_state_spec.rb +36 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/state_machine_spec.rb +34 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/state_spec.rb +26 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/terminal_state_spec.rb +18 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/basic/transition_spec.rb +62 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/quantity/c_dv_ordinal_spec.rb +41 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/quantity/c_dv_quantity_spec.rb +50 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/quantity/c_quantity_item_spec.rb +46 -0
- data/spec/lib/openehr/am/openehr_profile/data_types/text/c_code_phrase_spec.rb +34 -0
- data/spec/lib/openehr/assumed_library_types/interval_spec.rb +145 -0
- data/spec/lib/openehr/assumed_library_types/iso8601_date_spec.rb +236 -0
- data/spec/lib/openehr/assumed_library_types/iso8601_date_time_spec.rb +47 -0
- data/spec/lib/openehr/assumed_library_types/iso8601_duration_spec.rb +150 -0
- data/spec/lib/openehr/assumed_library_types/iso8601_time_spec.rb +234 -0
- data/spec/lib/openehr/assumed_library_types/iso8601_timezone_spec.rb +57 -0
- data/spec/lib/openehr/assumed_library_types/time_definitions_spec.rb +136 -0
- data/spec/lib/openehr/assumed_library_types/timezone_spec.rb +42 -0
- data/spec/lib/openehr/parser/adl14/adl-test-ENTRY.assumed_types.v1.adl +88 -0
- data/spec/lib/openehr/parser/adl14/adl-test-ENTRY.basic_types.v1.adl +143 -0
- data/spec/lib/openehr/parser/adl14/adl-test-ENTRY.basic_types_fail.v1.adl +50 -0
- data/spec/lib/openehr/parser/adl14/adl-test-ENTRY.most_minimal.v1.adl +27 -0
- data/spec/lib/openehr/parser/adl14/adl-test-ENTRY.structure_test1.v1.adl +46 -0
- data/spec/lib/openehr/parser/adl14/adl-test-SOME_TYPE.generic_type_basic.draft.adl +56 -0
- data/spec/lib/openehr/parser/adl14/adl-test-SOME_TYPE.generic_type_use_node.draft.adl +63 -0
- data/spec/lib/openehr/parser/adl14/adl-test-car.paths.test.adl +80 -0
- data/spec/lib/openehr/parser/adl14/adl-test-car.use_node.test.adl +87 -0
- data/spec/lib/openehr/parser/adl14/adl-test-composition.dv_coded_text.test.adl +29 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_bindings.test.adl +47 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_desc_missing_purpose.test.adl +45 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_description.test.adl +61 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_description2.test.adl +45 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_identification.test.adl +26 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_internal_ref.test.adl +36 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_internal_ref2.test.adl +36 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_language.test.adl +47 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_language_no_accreditation.test.adl +38 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_language_order_of_translation_details.test.adl +40 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_ontology.test.adl +25 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_slot.test.adl +40 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_slot.test2.adl +37 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.archetype_uncommonkeys.test.adl +29 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.basic_types.test.adl +272 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_code_phrase.test.adl +77 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_ordinal.test.adl +66 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_empty.test.adl +46 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_full.test.adl +64 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_full2.test.adl +64 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_full3.test.adl +64 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_item_units_only.test.adl +55 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_list.test.adl +58 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_property.test.adl +47 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.c_dv_quantity_reversed.test.adl +59 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.constraint_binding.test.adl +37 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.constraint_ref.test.adl +43 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.datetime.test.adl +183 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.domain_types.test.adl +97 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.durations.test.adl +109 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.empty_other_contributors.test.adl +42 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.missing_language.test.adl +23 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.mixed_node_types.draft.adl +61 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.most_minimal.test.adl +23 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.multi_language.test.adl +52 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.special_string.test.adl +88 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.structure_test1.test.adl +45 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.structure_test2.test.adl +45 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.term_binding.test.adl +37 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.term_binding2.test.adl +32 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.testtranslations.test.adl +83 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.translations_author_language.test.adl +34 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.translations_language_author.test.adl +34 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.unicode_BOM_support.test.adl +41 -0
- data/spec/lib/openehr/parser/adl14/adl-test-entry.unicode_support.test.adl +41 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ACTION.imaging.v1.adl +275 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ACTION.referral.v1.adl +351 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.auscultation-chest.v1.adl +765 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.auscultation.v1.adl +48 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.dimensions-circumference.v1.adl +134 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.dimensions.v1.adl +241 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-abdomen.v1.adl +321 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-chest.v1.adl +379 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-fetus.v1.adl +577 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-generic-joint.v1.adl +146 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-generic-lymphnode.v1.adl +176 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-generic-mass.v1.adl +221 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-generic.v1.adl +139 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-nervous_system.v1.adl +116 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-uterine_cervix.v1.adl +420 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-CLUSTER.exam-uterus.v1.adl +293 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-COMPOSITION.discharge.v1draft.adl +53 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-COMPOSITION.encounter.v1draft.adl +45 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-EVALUATION.adverse.v1.adl +411 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-EVALUATION.columna_vertebral.v1.adl +85 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-INSTRUCTION.medication.v1.adl +88 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-INSTRUCTION.referral.v1.adl +84 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.Laboratory_request.v1.adl +492 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.follow_up.v1draft.adl +94 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.imaging.v1.adl +127 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.medication-formulation.v1.adl +457 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.medication.v1.adl +869 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-ITEM_TREE.referral.v1.adl +494 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-OBSERVATION.apgar.v1.adl +545 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-OBSERVATION.blood_pressure.v1.adl +673 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-OBSERVATION.body_mass_index.v1.adl +166 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-OBSERVATION.lab_test.v1.adl +376 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-OBSERVATION.testassumedvalue.v1.adl +99 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-SECTION.findings.v1.adl +47 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-SECTION.reason_for_encounter.v1.adl +51 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-SECTION.summary.v1.adl +52 -0
- data/spec/lib/openehr/parser/adl14/openEHR-EHR-SECTION.vital_signs.v1.adl +54 -0
- data/spec/lib/openehr/parser/adl_archetype_internal_ref2_spec.rb +42 -0
- data/spec/lib/openehr/parser/adl_archetype_internal_ref_spec.rb +125 -0
- data/spec/lib/openehr/parser/adl_archetype_internal_ref_with_generics_spec.rb +258 -0
- data/spec/lib/openehr/parser/adl_archetype_ontology_binding_spec.rb +98 -0
- data/spec/lib/openehr/parser/adl_archetype_ontology_spec.rb +42 -0
- data/spec/lib/openehr/parser/adl_archetype_slot_cluster_spec.rb +101 -0
- data/spec/lib/openehr/parser/adl_archetype_slot_spec.rb +193 -0
- data/spec/lib/openehr/parser/adl_archetype_uncommon_term_keys_spec.rb +25 -0
- data/spec/lib/openehr/parser/adl_description_spec.rb +164 -0
- data/spec/lib/openehr/parser/adl_identification_spec.rb +18 -0
- data/spec/lib/openehr/parser/adl_language_no_accreditation_spec.rb +66 -0
- data/spec/lib/openehr/parser/adl_language_order_spec.rb +68 -0
- data/spec/lib/openehr/parser/adl_language_spec.rb +119 -0
- data/spec/lib/openehr/parser/adl_language_translation_author_language_spec.rb +50 -0
- data/spec/lib/openehr/parser/adl_language_translation_language_author_spec.rb +46 -0
- data/spec/lib/openehr/parser/adl_parser_spec.rb +347 -0
- data/spec/lib/openehr/parser/adl_path_spec.rb +176 -0
- data/spec/lib/openehr/parser/base_spec.rb +19 -0
- data/spec/lib/openehr/parser/basic_generic_type_spec.rb +18 -0
- data/spec/lib/openehr/parser/basic_type_spec.rb +2922 -0
- data/spec/lib/openehr/parser/c_dv_quantity_any_allowed_spec.rb +34 -0
- data/spec/lib/openehr/parser/c_dv_quantity_shared_example_for_lacked_items_spec.rb +36 -0
- data/spec/lib/openehr/parser/c_dv_quantity_shared_example_spec.rb +146 -0
- data/spec/lib/openehr/parser/cdv_ordinal_parse_spec.rb +231 -0
- data/spec/lib/openehr/parser/code_phrase_spec.rb +96 -0
- data/spec/lib/openehr/parser/constraint_binding_spec.rb +26 -0
- data/spec/lib/openehr/parser/constraint_ref_spec.rb +32 -0
- data/spec/lib/openehr/parser/date_time_spec.rb +1953 -0
- data/spec/lib/openehr/parser/duration_spec.rb +475 -0
- data/spec/lib/openehr/parser/dv_coded_text_parse_spec.rb +27 -0
- data/spec/lib/openehr/parser/empty_other_contributors_spec.rb +19 -0
- data/spec/lib/openehr/parser/lab_test_parser_spec.rb +14 -0
- data/spec/lib/openehr/parser/missing_language_spec.rb +20 -0
- data/spec/lib/openehr/parser/missing_purpose_spec.rb +23 -0
- data/spec/lib/openehr/parser/mixed_node_types_spec.rb +16 -0
- data/spec/lib/openehr/parser/most_minimal_adl_spec.rb +19 -0
- data/spec/lib/openehr/parser/multi_language_spec.rb +58 -0
- data/spec/lib/openehr/parser/parser_spec_helper.rb +7 -0
- data/spec/lib/openehr/parser/path_based_terminology_binding_spec.rb +30 -0
- data/spec/lib/openehr/parser/special_string_spec.rb +20 -0
- data/spec/lib/openehr/parser/structure_comment_spec.rb +21 -0
- data/spec/lib/openehr/parser/structure_nested_comments_spec.rb +22 -0
- data/spec/lib/openehr/parser/structure_spec.rb +202 -0
- data/spec/lib/openehr/parser/term_binding_spec.rb +54 -0
- data/spec/lib/openehr/parser/unicode_bom_spec.rb +17 -0
- data/spec/lib/openehr/parser/unicode_support_spec.rb +46 -0
- data/spec/lib/openehr/rm/common/archetyped/archetyped_spec.rb +50 -0
- data/spec/lib/openehr/rm/common/archetyped/feeder_audit_details_spec.rb +60 -0
- data/spec/lib/openehr/rm/common/archetyped/feeder_audit_spec.rb +51 -0
- data/spec/lib/openehr/rm/common/archetyped/link_spec.rb +42 -0
- data/spec/lib/openehr/rm/common/archetyped/locatable_spec.rb +89 -0
- data/spec/lib/openehr/rm/common/archetyped/pathable_spec.rb +42 -0
- data/spec/lib/openehr/rm/common/change_control/contribution_spec.rb +56 -0
- data/spec/lib/openehr/rm/common/change_control/imported_version_spec.rb +62 -0
- data/spec/lib/openehr/rm/common/change_control/original_version_spec.rb +71 -0
- data/spec/lib/openehr/rm/common/change_control/version_spec.rb +91 -0
- data/spec/lib/openehr/rm/common/change_control/versioned_object_spec.rb +284 -0
- data/spec/lib/openehr/rm/common/directory/folder_spec.rb +26 -0
- data/spec/lib/openehr/rm/common/generic/attestation_spec.rb +62 -0
- data/spec/lib/openehr/rm/common/generic/audit_details_spec.rb +51 -0
- data/spec/lib/openehr/rm/common/generic/participation_spec.rb +36 -0
- data/spec/lib/openehr/rm/common/generic/party_identified_spec.rb +64 -0
- data/spec/lib/openehr/rm/common/generic/party_proxy_spec.rb +18 -0
- data/spec/lib/openehr/rm/common/generic/party_related_spec.rb +24 -0
- data/spec/lib/openehr/rm/common/generic/revision_history_item_spec.rb +43 -0
- data/spec/lib/openehr/rm/common/generic/revision_history_spec.rb +45 -0
- data/spec/lib/openehr/rm/common/resource/authored_resource_spec.rb +68 -0
- data/spec/lib/openehr/rm/common/resource/resource_description_item_spec.rb +105 -0
- data/spec/lib/openehr/rm/common/resource/resource_description_spec.rb +74 -0
- data/spec/lib/openehr/rm/common/resource/translation_details_spec.rb +35 -0
- data/spec/lib/openehr/rm/composition/composition_spec.rb +92 -0
- data/spec/lib/openehr/rm/composition/content/content_item_spec.rb +14 -0
- data/spec/lib/openehr/rm/composition/content/entry/action_spec.rb +69 -0
- data/spec/lib/openehr/rm/composition/content/entry/activity_spec.rb +61 -0
- data/spec/lib/openehr/rm/composition/content/entry/admin_entry_spec.rb +38 -0
- data/spec/lib/openehr/rm/composition/content/entry/care_entry_spec.rb +37 -0
- data/spec/lib/openehr/rm/composition/content/entry/entry_spec.rb +98 -0
- data/spec/lib/openehr/rm/composition/content/entry/evaluation_spec.rb +37 -0
- data/spec/lib/openehr/rm/composition/content/entry/instruction_details_spec.rb +51 -0
- data/spec/lib/openehr/rm/composition/content/entry/instruction_spec.rb +62 -0
- data/spec/lib/openehr/rm/composition/content/entry/ism_transition_spec.rb +46 -0
- data/spec/lib/openehr/rm/composition/content/entry/observation_spec.rb +45 -0
- data/spec/lib/openehr/rm/composition/content/navigation/section_spec.rb +32 -0
- data/spec/lib/openehr/rm/composition/event_context_spec.rb +88 -0
- data/spec/lib/openehr/rm/data_structures/data_structure_spec.rb +21 -0
- data/spec/lib/openehr/rm/data_structures/history/event_spec.rb +44 -0
- data/spec/lib/openehr/rm/data_structures/history/history_spec.rb +67 -0
- data/spec/lib/openehr/rm/data_structures/history/interval_event_spec.rb +43 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/item_list_spec.rb +53 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/item_single_spec.rb +29 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/item_table_spec.rb +147 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/item_tree_spec.rb +48 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/representation/cluster_spec.rb +26 -0
- data/spec/lib/openehr/rm/data_structures/item_structure/representation/element_spec.rb +22 -0
- data/spec/lib/openehr/rm/data_types/basic/data_value_spec.rb +17 -0
- data/spec/lib/openehr/rm/data_types/basic/dv_boolean_spec.rb +29 -0
- data/spec/lib/openehr/rm/data_types/basic/dv_identifier_spec.rb +108 -0
- data/spec/lib/openehr/rm/data_types/basic/dv_state_spec.rb +44 -0
- data/spec/lib/openehr/rm/data_types/encapsulated/dv_encapsulated_spec.rb +42 -0
- data/spec/lib/openehr/rm/data_types/encapsulated/dv_multimedia_spec.rb +79 -0
- data/spec/lib/openehr/rm/data_types/encapsulated/dv_parsable_spec.rb +34 -0
- data/spec/lib/openehr/rm/data_types/quantity/date_time/dv_date_spec.rb +64 -0
- data/spec/lib/openehr/rm/data_types/quantity/date_time/dv_date_time_spec.rb +26 -0
- data/spec/lib/openehr/rm/data_types/quantity/date_time/dv_duration_spec.rb +44 -0
- data/spec/lib/openehr/rm/data_types/quantity/date_time/dv_temporal_spec.rb +25 -0
- data/spec/lib/openehr/rm/data_types/quantity/date_time/dv_time_spec.rb +41 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_absolute_quantity_spec.rb +35 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_amount_spec.rb +105 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_count_spec.rb +12 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_interval_spec.rb +17 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_ordered_spec.rb +60 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_ordinal_spec.rb +74 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_proportion_spec.rb +162 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_quantified_spec.rb +36 -0
- data/spec/lib/openehr/rm/data_types/quantity/dv_quantity_spec.rb +78 -0
- data/spec/lib/openehr/rm/data_types/quantity/proportion_kind_spec.rb +24 -0
- data/spec/lib/openehr/rm/data_types/quantity/reference_range_spec.rb +43 -0
- data/spec/lib/openehr/rm/data_types/text/code_phrase_spec.rb +23 -0
- data/spec/lib/openehr/rm/data_types/text/dv_paragraph_spec.rb +13 -0
- data/spec/lib/openehr/rm/data_types/text/dv_text_spec.rb +79 -0
- data/spec/lib/openehr/rm/data_types/text/term_mapping_spec.rb +59 -0
- data/spec/lib/openehr/rm/data_types/uri/dv_ehr_uri_spec.rb +21 -0
- data/spec/lib/openehr/rm/data_types/uri/dv_uri_spec.rb +36 -0
- data/spec/lib/openehr/rm/demographic/actor_spec.rb +79 -0
- data/spec/lib/openehr/rm/demographic/address_spec.rb +33 -0
- data/spec/lib/openehr/rm/demographic/capability_spec.rb +37 -0
- data/spec/lib/openehr/rm/demographic/contact_spec.rb +45 -0
- data/spec/lib/openehr/rm/demographic/party_identity_spec.rb +32 -0
- data/spec/lib/openehr/rm/demographic/party_relationship_spec.rb +84 -0
- data/spec/lib/openehr/rm/demographic/party_spec.rb +131 -0
- data/spec/lib/openehr/rm/demographic/role_spec.rb +58 -0
- data/spec/lib/openehr/rm/ehr/ehr_access_spec.rb +33 -0
- data/spec/lib/openehr/rm/ehr/ehr_spec.rb +139 -0
- data/spec/lib/openehr/rm/ehr/ehr_status_spec.rb +52 -0
- data/spec/lib/openehr/rm/ehr/versioned_composition_spec.rb +33 -0
- data/spec/lib/openehr/rm/integration/generic_entry_spec.rb +31 -0
- data/spec/lib/openehr/rm/support/identification/access_group_ref_spec.rb +19 -0
- data/spec/lib/openehr/rm/support/identification/archetype_id_spec.rb +152 -0
- data/spec/lib/openehr/rm/support/identification/generic_id_spec.rb +33 -0
- data/spec/lib/openehr/rm/support/identification/hier_object_id_spec.rb +12 -0
- data/spec/lib/openehr/rm/support/identification/internet_id_spec.rb +12 -0
- data/spec/lib/openehr/rm/support/identification/iso_oid_spec.rb +12 -0
- data/spec/lib/openehr/rm/support/identification/locatable_ref_spec.rb +34 -0
- data/spec/lib/openehr/rm/support/identification/object_id_spec.rb +24 -0
- data/spec/lib/openehr/rm/support/identification/object_ref_spec.rb +33 -0
- data/spec/lib/openehr/rm/support/identification/object_version_id_spec.rb +59 -0
- data/spec/lib/openehr/rm/support/identification/party_ref_spec.rb +29 -0
- data/spec/lib/openehr/rm/support/identification/template_id_spec.rb +12 -0
- data/spec/lib/openehr/rm/support/identification/terminology_id_spec.rb +33 -0
- data/spec/lib/openehr/rm/support/identification/uid_based_id_spec.rb +50 -0
- data/spec/lib/openehr/rm/support/identification/uid_spec.rb +29 -0
- data/spec/lib/openehr/rm/support/identification/version_tree_id_spec.rb +104 -0
- data/spec/lib/openehr/rm/support/measurement_service_spec.rb +7 -0
- data/spec/lib/openehr/rm/support/terminology_service_spec.rb +24 -0
- data/spec/lib/openehr/serializer/adl-test-entry.most_minimal.test.adl +20 -0
- data/spec/lib/openehr/serializer/adl_serializer_spec.rb +47 -0
- data/spec/lib/openehr/serializer/openEHR-EHR-SECTION.test.v1.adl +38 -0
- data/spec/lib/openehr/serializer/openEHR-EHR-SECTION.test.v1.xml +58 -0
- data/spec/lib/openehr/serializer/sample_archetype_spec.rb +44 -0
- data/spec/lib/openehr/serializer/xml_serializer_spec.rb +49 -0
- data/spec/lib/openehr/terminology/open_ehr_terminology_spec.rb +40 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +58 -0
- metadata +631 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
module OpenEHR
|
|
4
|
+
module Parser
|
|
5
|
+
class Base
|
|
6
|
+
attr_reader :filename
|
|
7
|
+
|
|
8
|
+
def initialize(filename)
|
|
9
|
+
@filename = filename
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def parse
|
|
13
|
+
raise NotImplementedError
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
autoload :ADLParser, 'parser/adl_parser'
|
|
18
|
+
# autoload :CADLParser, 'parser/adl_parser'
|
|
19
|
+
# autoload :XMLParser, 'parser/xml_perser'
|
|
20
|
+
# autoload :Exception, 'parser/exception'
|
|
21
|
+
# autoload :Scanner, 'parser/scanner'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'openehr/rm/data_types/text'
|
|
2
|
+
include OpenEHR::RM::Support::Identification
|
|
3
|
+
include OpenEHR::RM::Common::Resource
|
|
4
|
+
|
|
5
|
+
module OpenEHR
|
|
6
|
+
module Parser
|
|
7
|
+
module ADLGrammar
|
|
8
|
+
class Base < Treetop::Runtime::SyntaxNode
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class ArchLanguage < Base
|
|
13
|
+
def value
|
|
14
|
+
return Language.new(lang.value)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Language
|
|
19
|
+
include OpenEHR::RM::DataTypes::Text
|
|
20
|
+
attr_reader :original_language, :translations
|
|
21
|
+
|
|
22
|
+
def initialize(value)
|
|
23
|
+
self.original_language = value['original_language']
|
|
24
|
+
self.translations = value['translations']
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def original_language=(original_language)
|
|
28
|
+
@original_language = original_language
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def translations=(translations)
|
|
32
|
+
if translations.nil?
|
|
33
|
+
@translations = nil
|
|
34
|
+
else
|
|
35
|
+
tr = translations.inject({ }) do |trans, lang|
|
|
36
|
+
code, details = lang
|
|
37
|
+
td = TranslationDetails.new(
|
|
38
|
+
:language => details['language'],
|
|
39
|
+
:author => details['author'],
|
|
40
|
+
:accreditation => details['accreditation'],
|
|
41
|
+
:other_details => details['other_details'])
|
|
42
|
+
trans.update Hash[code, td]
|
|
43
|
+
end
|
|
44
|
+
@translations = tr
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
protected
|
|
49
|
+
def code2lang(code)
|
|
50
|
+
ti, la = code.split '::'
|
|
51
|
+
ti = TerminologyID.new(:value => ti)
|
|
52
|
+
CodePhrase.new(:code_string => la, :terminology_id => ti)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
require 'shared_token_grammar'
|
|
2
|
+
require 'dadl_grammar'
|
|
3
|
+
require 'cadl_grammar'
|
|
4
|
+
require 'adl'
|
|
5
|
+
|
|
6
|
+
module OpenEHR
|
|
7
|
+
module Parser
|
|
8
|
+
grammar ADLGrammar
|
|
9
|
+
|
|
10
|
+
include SharedToken
|
|
11
|
+
include DADLGrammar
|
|
12
|
+
include CADL
|
|
13
|
+
|
|
14
|
+
rule archetype
|
|
15
|
+
arch_identification
|
|
16
|
+
spec:(arch_specialisation)?
|
|
17
|
+
arch_concept
|
|
18
|
+
lang:(arch_language)?
|
|
19
|
+
desc:(arch_description)?
|
|
20
|
+
arch_definition
|
|
21
|
+
arch_invariant?
|
|
22
|
+
arch_ontology {
|
|
23
|
+
def archetype_id
|
|
24
|
+
arch_identification.archetype_id
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def adl_version
|
|
28
|
+
arch_identification.adl_version
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def concept
|
|
32
|
+
arch_concept.value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def original_language
|
|
36
|
+
lang.value.original_language unless lang.empty?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def translations
|
|
40
|
+
lang.value.translations unless lang.empty?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def description
|
|
44
|
+
desc.value unless desc.empty?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def definition
|
|
48
|
+
arch_definition.value
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def ontology
|
|
52
|
+
arch_ontology.value
|
|
53
|
+
end
|
|
54
|
+
}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
rule arch_identification
|
|
58
|
+
head:arch_head id:V_ARCHETYPE_ID space {
|
|
59
|
+
def archetype_id
|
|
60
|
+
id.value
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def adl_version
|
|
64
|
+
head.value[:adl_version]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def is_controlled?
|
|
68
|
+
head.value[:is_controlled?]
|
|
69
|
+
end
|
|
70
|
+
}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
rule arch_head
|
|
74
|
+
SYM_ARCHETYPE m:arch_meta_data {
|
|
75
|
+
def value
|
|
76
|
+
m.value
|
|
77
|
+
end
|
|
78
|
+
}
|
|
79
|
+
/ SYM_ARCHETYPE {
|
|
80
|
+
def value
|
|
81
|
+
Hash.new
|
|
82
|
+
end
|
|
83
|
+
}
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
rule arch_meta_data
|
|
87
|
+
'(' arch_meta_data_items ')' space {
|
|
88
|
+
def value
|
|
89
|
+
arch_meta_data_items.value
|
|
90
|
+
end
|
|
91
|
+
}
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
rule arch_meta_data_items
|
|
95
|
+
item:arch_meta_data_item other_item:(';' arch_meta_data_item)* {
|
|
96
|
+
def value
|
|
97
|
+
v = item.value
|
|
98
|
+
other_item.elements.map {|i| i.arch_meta_data_item.value}
|
|
99
|
+
v
|
|
100
|
+
end
|
|
101
|
+
}
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
rule arch_meta_data_item
|
|
105
|
+
SYM_ADL_VERSION SYM_EQ ver:V_VERSION_STRING space {
|
|
106
|
+
def value
|
|
107
|
+
{:adl_version => ver.value}
|
|
108
|
+
end
|
|
109
|
+
}
|
|
110
|
+
/ SYM_IS_CONTROLED space {
|
|
111
|
+
def value
|
|
112
|
+
{:is_controled? => true} # if elements[0]
|
|
113
|
+
end
|
|
114
|
+
}
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
rule arch_specialisation
|
|
118
|
+
SYM_SPECIALIZE arch_id:V_ARCHETYPE_ID space {
|
|
119
|
+
def specialised?
|
|
120
|
+
true if elements[0]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def archetype_id
|
|
124
|
+
arch_id.value
|
|
125
|
+
end
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
rule arch_concept
|
|
130
|
+
SYM_CONCEPT conc:V_LOCAL_TERM_CODE_REF space {
|
|
131
|
+
def value
|
|
132
|
+
conc.text_value[1..-2]
|
|
133
|
+
end
|
|
134
|
+
}
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
rule arch_language
|
|
138
|
+
SYM_LANGUAGE lang:V_DADL_TEXT <ArchLanguage>
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
rule arch_description
|
|
142
|
+
SYM_DESCRIPTION desc:V_DADL_TEXT space {
|
|
143
|
+
def value
|
|
144
|
+
params = desc.value
|
|
145
|
+
details = { }
|
|
146
|
+
params['details'].each do |lang, attrs|
|
|
147
|
+
misuse = attrs['misuse']
|
|
148
|
+
misuse = nil if misuse.nil? or misuse.empty?
|
|
149
|
+
purpose = attrs['purpose'] || '__unknown__' # for backward compat.
|
|
150
|
+
item =
|
|
151
|
+
OpenEHR::RM::Common::Resource::ResourceDescriptionItem.new(
|
|
152
|
+
:language => attrs['language'],
|
|
153
|
+
:purpose => purpose,
|
|
154
|
+
:keywords => attrs["keywords"],
|
|
155
|
+
:use => attrs["use"],
|
|
156
|
+
:misuse => misuse,
|
|
157
|
+
:copyright => attrs['copyright'],
|
|
158
|
+
:original_resource_uri => attrs['original_resource_uri'],
|
|
159
|
+
:other_details => attrs['other_details'])
|
|
160
|
+
details[lang] = item
|
|
161
|
+
end
|
|
162
|
+
oc = params['other_contributors']
|
|
163
|
+
if oc.instance_of? Hash
|
|
164
|
+
oc = oc.values
|
|
165
|
+
end
|
|
166
|
+
OpenEHR::RM::Common::Resource::ResourceDescription.new(
|
|
167
|
+
:original_author => params['original_author'],
|
|
168
|
+
:other_contributors => oc,
|
|
169
|
+
:lifecycle_state => params['lifecycle_state'],
|
|
170
|
+
:details => details,
|
|
171
|
+
:resource_package_uri => params['archetype_package_uri'],
|
|
172
|
+
:other_details => params['other_details'])
|
|
173
|
+
end
|
|
174
|
+
}
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
rule arch_definition
|
|
178
|
+
SYM_DEFINITION definition:V_CADL_TEXT space {
|
|
179
|
+
def value
|
|
180
|
+
definition.value
|
|
181
|
+
end
|
|
182
|
+
}
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
rule arch_invariant
|
|
186
|
+
SYM_INVARIANT V_ASSERTION_TEXT space
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
rule arch_ontology
|
|
190
|
+
SYM_ONTOLOGY ontology:V_DADL_TEXT space {
|
|
191
|
+
def value
|
|
192
|
+
ao = ontology.value
|
|
193
|
+
arc_term = Proc.new do |code, item|
|
|
194
|
+
OpenEHR::AM::Archetype::Ontology::ArchetypeTerm.new(
|
|
195
|
+
:code => code, :items => item)
|
|
196
|
+
end
|
|
197
|
+
td = itemizer(ao['term_definitions'], arc_term)
|
|
198
|
+
cd = ao['constraint_definitions']
|
|
199
|
+
if cd
|
|
200
|
+
cd = itemizer(cd , arc_term)
|
|
201
|
+
end
|
|
202
|
+
tb = ao['term_bindings'] || ao['term_binding']
|
|
203
|
+
term_bind = Proc.new do |code, item|
|
|
204
|
+
unless item.class == Array
|
|
205
|
+
[item]
|
|
206
|
+
else
|
|
207
|
+
item
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
if tb
|
|
211
|
+
tb = itemizer(tb, term_bind)
|
|
212
|
+
end
|
|
213
|
+
cons_bind = Proc.new do |code, item|
|
|
214
|
+
OpenEHR::RM::DataTypes::URI::DvUri.new(:value => item)
|
|
215
|
+
end
|
|
216
|
+
cb = ao['constraint_bindings'] || ao['constraint_binding']
|
|
217
|
+
if cb
|
|
218
|
+
cb = itemizer(cb, cons_bind)
|
|
219
|
+
end
|
|
220
|
+
OpenEHR::AM::Archetype::Ontology::ArchetypeOntology.new(
|
|
221
|
+
:primary_language => ao['primary_language'],
|
|
222
|
+
:languages_available => ao['languages_available'],
|
|
223
|
+
:terminologies_available => ao['terminologies_available'],
|
|
224
|
+
:term_definitions => td,
|
|
225
|
+
:constraint_definitions => cd,
|
|
226
|
+
:term_bindings => tb,
|
|
227
|
+
:constraint_bindings => cb)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def itemizer(defs, itemize)
|
|
231
|
+
defs.inject({ }) do |term_defs, langs|
|
|
232
|
+
lang, items = langs
|
|
233
|
+
terms = items['items'].inject({ }) do |items, term|
|
|
234
|
+
code, item = term
|
|
235
|
+
item = itemize.call code, item
|
|
236
|
+
items.update Hash[code => item]
|
|
237
|
+
end
|
|
238
|
+
term_defs.update Hash[lang => terms]
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
}
|
|
242
|
+
end # of arch_ontology
|
|
243
|
+
end # of ADLGrammar
|
|
244
|
+
end # of Parser
|
|
245
|
+
end # of openEHR
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
require 'polyglot'
|
|
4
|
+
require 'treetop'
|
|
5
|
+
include OpenEHR::Parser
|
|
6
|
+
include OpenEHR::AM::Archetype
|
|
7
|
+
include OpenEHR::RM::Support::Identification
|
|
8
|
+
include OpenEHR::RM::DataTypes::Text
|
|
9
|
+
|
|
10
|
+
module OpenEHR
|
|
11
|
+
module Parser
|
|
12
|
+
class ADLParser < Base
|
|
13
|
+
def initialize(filename)
|
|
14
|
+
super(filename)
|
|
15
|
+
file = File.open(filename, 'r:bom|utf-8')
|
|
16
|
+
data = file.read
|
|
17
|
+
Treetop.load(File.dirname(__FILE__)+'/adl_grammar.tt')
|
|
18
|
+
ap = ADLGrammarParser.new
|
|
19
|
+
@result = ap.parse(data)
|
|
20
|
+
file.close
|
|
21
|
+
unless @result
|
|
22
|
+
puts ap.failure_reason
|
|
23
|
+
puts ap.failure_line
|
|
24
|
+
puts ap.failure_column
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def parse
|
|
29
|
+
archetype_id = ArchetypeID.new(:value => @result.archetype_id)
|
|
30
|
+
definition = @result.definition
|
|
31
|
+
ontology = @result.ontology
|
|
32
|
+
original_language = nil
|
|
33
|
+
if @result.original_language
|
|
34
|
+
original_language = @result.original_language
|
|
35
|
+
else
|
|
36
|
+
terminology_id = TerminologyID.new(:value => 'ISO639-1')
|
|
37
|
+
original_language = CodePhrase.new(:terminology_id => terminology_id,
|
|
38
|
+
:code_string =>ontology.primary_language)
|
|
39
|
+
end
|
|
40
|
+
archetype = Archetype.new(:archetype_id => archetype_id,
|
|
41
|
+
:adl_version => @result.adl_version,
|
|
42
|
+
:concept => @result.concept,
|
|
43
|
+
:original_language => original_language,
|
|
44
|
+
:translations => @result.translations,
|
|
45
|
+
:description => @result.description,
|
|
46
|
+
:definition => @result.definition,
|
|
47
|
+
:ontology => @result.ontology)
|
|
48
|
+
return archetype
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end # of Parser
|
|
52
|
+
end # of OpenEHR
|
|
@@ -0,0 +1,1527 @@
|
|
|
1
|
+
require 'shared_token_grammar'
|
|
2
|
+
require 'openehr/assumed_library_types'
|
|
3
|
+
require 'openehr/am/archetype/constraint_model'
|
|
4
|
+
require 'openehr/am/openehr_profile/data_types/text'
|
|
5
|
+
require 'cadl_node'
|
|
6
|
+
|
|
7
|
+
module OpenEHR
|
|
8
|
+
module Parser
|
|
9
|
+
grammar CADL
|
|
10
|
+
# include OpenEHR::Parser::CADL
|
|
11
|
+
|
|
12
|
+
rule V_CADL_TEXT
|
|
13
|
+
c_complex_object '' {
|
|
14
|
+
def value
|
|
15
|
+
c_complex_object.value
|
|
16
|
+
end
|
|
17
|
+
}
|
|
18
|
+
/ assertions '' {
|
|
19
|
+
def value
|
|
20
|
+
assertions.value
|
|
21
|
+
end
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
rule c_complex_object
|
|
26
|
+
head:c_complex_object_head SYM_MATCHES SYM_START_CBLOCK body:c_complex_object_body SYM_END_CBLOCK space {
|
|
27
|
+
def value(node = ArchetypeNode.new)
|
|
28
|
+
args = head.value
|
|
29
|
+
args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
30
|
+
:lower => 1, :upper => 1)
|
|
31
|
+
node.id = args[:node_id]
|
|
32
|
+
if node.root? or node.id.nil?
|
|
33
|
+
args[:path] = node.path
|
|
34
|
+
else
|
|
35
|
+
args[:path] = node.path + '[' + node.id + ']'
|
|
36
|
+
end
|
|
37
|
+
args.update body.value(node)
|
|
38
|
+
OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
|
|
39
|
+
end
|
|
40
|
+
}
|
|
41
|
+
/ c_complex_object_head '' {
|
|
42
|
+
def value(node = ArchetypeNode.new)
|
|
43
|
+
args = c_complex_object_head.value
|
|
44
|
+
args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
45
|
+
:lower => 1, :upper => 1)
|
|
46
|
+
node.id = args[:node_id]
|
|
47
|
+
args[:path] = node.path
|
|
48
|
+
OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
|
|
49
|
+
end
|
|
50
|
+
}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
rule c_complex_object_head
|
|
54
|
+
c_complex_object_id c_occurrences {
|
|
55
|
+
def value
|
|
56
|
+
args = c_complex_object_id.value
|
|
57
|
+
args[:occurrences] = c_occurrences.value
|
|
58
|
+
args
|
|
59
|
+
end
|
|
60
|
+
}
|
|
61
|
+
/ c_complex_object_id '' {
|
|
62
|
+
def value
|
|
63
|
+
c_complex_object_id.value
|
|
64
|
+
end
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
rule c_complex_object_id
|
|
69
|
+
ti:type_identifier lo:V_LOCAL_TERM_CODE_REF space {
|
|
70
|
+
def value
|
|
71
|
+
{:rm_type_name => ti.value,
|
|
72
|
+
:node_id => lo.value}
|
|
73
|
+
end
|
|
74
|
+
}
|
|
75
|
+
/ ti:type_identifier space {
|
|
76
|
+
def value
|
|
77
|
+
{:rm_type_name => ti.value}
|
|
78
|
+
end
|
|
79
|
+
}
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
rule c_complex_object_body
|
|
83
|
+
c_any '' {
|
|
84
|
+
def value(node)
|
|
85
|
+
Hash[:attributes => [c_any.value(node)]]
|
|
86
|
+
end
|
|
87
|
+
}
|
|
88
|
+
/ c_attributes '' {
|
|
89
|
+
def value(node)
|
|
90
|
+
Hash[:attributes => c_attributes.value(node)]
|
|
91
|
+
end
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
rule c_object
|
|
96
|
+
c_dv_quantity '' {
|
|
97
|
+
def value(node)
|
|
98
|
+
c_dv_quantity.value(node)
|
|
99
|
+
end
|
|
100
|
+
}
|
|
101
|
+
/ c_ordinal '' {
|
|
102
|
+
def value(node)
|
|
103
|
+
args = c_ordinal.value
|
|
104
|
+
args[:path] = node.path
|
|
105
|
+
args[:rm_type_name] = 'DvOrdinal'
|
|
106
|
+
args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
107
|
+
:upper => 1, :lower => 1)
|
|
108
|
+
OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CDvOrdinal.new(
|
|
109
|
+
args)
|
|
110
|
+
end
|
|
111
|
+
}
|
|
112
|
+
/ c_primitive_object '' {
|
|
113
|
+
def value(node)
|
|
114
|
+
c_primitive_object.value
|
|
115
|
+
end
|
|
116
|
+
}
|
|
117
|
+
/ c_complex_object '' {
|
|
118
|
+
def value(node)
|
|
119
|
+
c_complex_object.value(node)
|
|
120
|
+
end
|
|
121
|
+
}
|
|
122
|
+
/ c_code_phrase '' {
|
|
123
|
+
def value(node)
|
|
124
|
+
c_code_phrase.value(node)
|
|
125
|
+
end
|
|
126
|
+
}
|
|
127
|
+
/ constraint_ref '' {
|
|
128
|
+
def value(node)
|
|
129
|
+
constraint_ref.value(node)
|
|
130
|
+
end
|
|
131
|
+
}
|
|
132
|
+
/ archetype_slot '' {
|
|
133
|
+
def value(node)
|
|
134
|
+
archetype_slot.value(node)
|
|
135
|
+
end
|
|
136
|
+
}
|
|
137
|
+
/ archetype_internal_ref '' {
|
|
138
|
+
def value(node = nil)
|
|
139
|
+
archetype_internal_ref.value(node)
|
|
140
|
+
end
|
|
141
|
+
}
|
|
142
|
+
/ V_C_DOMAIN_TYPE '' {
|
|
143
|
+
def value(node = nil)
|
|
144
|
+
p elemetns
|
|
145
|
+
end
|
|
146
|
+
}
|
|
147
|
+
# / ERR_V_C_DOMAIN_TYPE
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
rule archetype_internal_ref
|
|
151
|
+
SYM_USE_NODE type_identifier c_occurrences object_path space {
|
|
152
|
+
def value(node)
|
|
153
|
+
OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
|
|
154
|
+
:rm_type_name => type_identifier.value,
|
|
155
|
+
:occurrences => c_occurrences.value,
|
|
156
|
+
:path => node.path,
|
|
157
|
+
:target_path => object_path.value)
|
|
158
|
+
end
|
|
159
|
+
}
|
|
160
|
+
/ SYM_USE_NODE type_identifier object_path space {
|
|
161
|
+
def value(node = nil)
|
|
162
|
+
OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
|
|
163
|
+
:rm_type_name => type_identifier.value,
|
|
164
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
165
|
+
:lower => 1, :upper => 1),
|
|
166
|
+
:path => node.path,
|
|
167
|
+
:target_path => object_path.value)
|
|
168
|
+
end
|
|
169
|
+
}
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
rule archetype_slot
|
|
173
|
+
c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK space {
|
|
174
|
+
def value(node)
|
|
175
|
+
args = c_archetype_slot_head.value(node)
|
|
176
|
+
args[:includes] = c_includes.value
|
|
177
|
+
args[:excludes] = c_excludes.value
|
|
178
|
+
OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
|
|
179
|
+
end
|
|
180
|
+
}
|
|
181
|
+
/ c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes SYM_END_CBLOCK space {
|
|
182
|
+
def value(node)
|
|
183
|
+
args = c_archetype_slot_head.value(node)
|
|
184
|
+
args[:includes] = c_includes.value
|
|
185
|
+
OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
|
|
186
|
+
end
|
|
187
|
+
}
|
|
188
|
+
/ c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_excludes SYM_END_CBLOCK space {
|
|
189
|
+
def value(node)
|
|
190
|
+
args = c_archetype_slot_head.value(node)
|
|
191
|
+
args[:excludes] = c_excludes.value
|
|
192
|
+
OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
|
|
193
|
+
end
|
|
194
|
+
}
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
rule c_archetype_slot_head
|
|
198
|
+
c_archetype_slot_id white_space c_occurrences {
|
|
199
|
+
def value(node)
|
|
200
|
+
args = c_archetype_slot_id.value(node)
|
|
201
|
+
args[:occurrences] = c_occurrences.value
|
|
202
|
+
args
|
|
203
|
+
end
|
|
204
|
+
}
|
|
205
|
+
/ c_archetype_slot_id white_space {
|
|
206
|
+
def value(node)
|
|
207
|
+
args = c_archetype_slot_id.value(node)
|
|
208
|
+
args[:occurrences] = OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
209
|
+
:upper => 1, :lower => 1)
|
|
210
|
+
args
|
|
211
|
+
end
|
|
212
|
+
}
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
rule c_archetype_slot_id
|
|
216
|
+
SYM_ALLOW_ARCHETYPE type_identifier lt:V_LOCAL_TERM_CODE_REF {
|
|
217
|
+
def value(node)
|
|
218
|
+
{:rm_type_name => type_identifier.value,
|
|
219
|
+
:node_id => lt.value,
|
|
220
|
+
:path => node.path + "[#{lt.value}]"}
|
|
221
|
+
end
|
|
222
|
+
}
|
|
223
|
+
/ SYM_ALLOW_ARCHETYPE type_identifier {
|
|
224
|
+
def value(node)
|
|
225
|
+
{:rm_type_name => type_identifier.value,
|
|
226
|
+
:path => node.path}
|
|
227
|
+
end
|
|
228
|
+
}
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
rule c_primitive_object
|
|
232
|
+
c_primitive '' {
|
|
233
|
+
def value
|
|
234
|
+
c_primitive.value
|
|
235
|
+
end
|
|
236
|
+
}
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
rule c_primitive
|
|
240
|
+
c_boolean '' {
|
|
241
|
+
def value
|
|
242
|
+
c_boolean.value
|
|
243
|
+
end
|
|
244
|
+
}
|
|
245
|
+
/ c_date_time '' {
|
|
246
|
+
def value
|
|
247
|
+
c_date_time.value
|
|
248
|
+
end
|
|
249
|
+
}
|
|
250
|
+
/ c_time '' {
|
|
251
|
+
def value
|
|
252
|
+
c_time.value
|
|
253
|
+
end
|
|
254
|
+
}
|
|
255
|
+
/ c_date '' {
|
|
256
|
+
def value
|
|
257
|
+
c_date.value
|
|
258
|
+
end
|
|
259
|
+
}
|
|
260
|
+
/ c_duration '' {
|
|
261
|
+
def value
|
|
262
|
+
c_duration.value
|
|
263
|
+
end
|
|
264
|
+
}
|
|
265
|
+
/ c_real '' {
|
|
266
|
+
def value
|
|
267
|
+
c_real.value
|
|
268
|
+
end
|
|
269
|
+
}
|
|
270
|
+
/ c_integer '' {
|
|
271
|
+
def value
|
|
272
|
+
c_integer.value
|
|
273
|
+
end
|
|
274
|
+
}
|
|
275
|
+
/ c_string '' {
|
|
276
|
+
def value
|
|
277
|
+
c_string.value
|
|
278
|
+
end
|
|
279
|
+
}
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
rule c_any
|
|
283
|
+
'*' space {
|
|
284
|
+
def value(node)
|
|
285
|
+
OpenEHR::AM::Archetype::ConstraintModel::CAttribute.new(
|
|
286
|
+
:path => node.path, :rm_attribute_name => 'ANY',
|
|
287
|
+
:exsitence => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
288
|
+
:lower => 1, :upper => 1))
|
|
289
|
+
end
|
|
290
|
+
}
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
rule c_attributes
|
|
294
|
+
c_attribute more_attr:(c_attribute white_space)* {
|
|
295
|
+
def value(node)
|
|
296
|
+
attributes.map {|c| c.value(node)}
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def attributes
|
|
300
|
+
[c_attribute] + more_attr.elements.map {|e| e.c_attribute}
|
|
301
|
+
end
|
|
302
|
+
}
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
rule c_attribute
|
|
306
|
+
c_attr_head c_attr_body {
|
|
307
|
+
def value(node)
|
|
308
|
+
val = c_attr_head.value(node)
|
|
309
|
+
child_node = ArchetypeNode.new(node)
|
|
310
|
+
child_node.path = val.path
|
|
311
|
+
val.children = c_attr_body.value(child_node)
|
|
312
|
+
val
|
|
313
|
+
end
|
|
314
|
+
}
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
rule c_attr_head
|
|
318
|
+
id:(V_ATTRIBUTE_IDENTIFIER) white_space c_existence c_cardinality {
|
|
319
|
+
def value(node)
|
|
320
|
+
if node.root?
|
|
321
|
+
path = node.path + id.value
|
|
322
|
+
elsif node.id
|
|
323
|
+
path = node.path + "[#{node.id}]/" + id.value
|
|
324
|
+
elsif
|
|
325
|
+
path = node.path + '/' + id.value
|
|
326
|
+
end
|
|
327
|
+
OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
|
|
328
|
+
:rm_attribute_name => id.value,
|
|
329
|
+
:path => path,
|
|
330
|
+
:existence => c_existence.value,
|
|
331
|
+
:cardinality => c_cardinality.value)
|
|
332
|
+
end
|
|
333
|
+
}
|
|
334
|
+
/ id:V_ATTRIBUTE_IDENTIFIER white_space c_existence {
|
|
335
|
+
def value(node)
|
|
336
|
+
if node.root?
|
|
337
|
+
path = node.path + id.value
|
|
338
|
+
elsif node.id
|
|
339
|
+
path = node.path + "[#{node.id}]/" + id.value
|
|
340
|
+
elsif
|
|
341
|
+
path = node.path + '/' + id.value
|
|
342
|
+
end
|
|
343
|
+
OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
|
|
344
|
+
:rm_attribute_name => id.value,
|
|
345
|
+
:path => path,
|
|
346
|
+
:existence => c_existence.value)
|
|
347
|
+
end
|
|
348
|
+
}
|
|
349
|
+
/ id:(V_ATTRIBUTE_IDENTIFIER) white_space c_cardinality {
|
|
350
|
+
def value(node)
|
|
351
|
+
if node.root?
|
|
352
|
+
path = node.path + id.value
|
|
353
|
+
elsif node.id
|
|
354
|
+
path = node.path + "[#{node.id}]/" + id.value
|
|
355
|
+
elsif
|
|
356
|
+
path = node.path + '/' + id.value
|
|
357
|
+
end
|
|
358
|
+
OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
|
|
359
|
+
:rm_attribute_name => id.value,
|
|
360
|
+
:path => path,
|
|
361
|
+
:cardinality => c_cardinality.value)
|
|
362
|
+
end
|
|
363
|
+
}
|
|
364
|
+
/ id:(V_ATTRIBUTE_IDENTIFIER) white_space {
|
|
365
|
+
def value(node)
|
|
366
|
+
if node.root?
|
|
367
|
+
path = node.path + id.value
|
|
368
|
+
elsif node.id
|
|
369
|
+
path = node.path + "[#{node.id}]/" + id.value
|
|
370
|
+
elsif
|
|
371
|
+
path = node.path + '/' + id.value
|
|
372
|
+
end
|
|
373
|
+
OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
|
|
374
|
+
:rm_attribute_name => id.value, :path => path)
|
|
375
|
+
end
|
|
376
|
+
}
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
rule c_attr_body
|
|
380
|
+
SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK space {
|
|
381
|
+
def value(node)
|
|
382
|
+
c_attr_values.value(node)
|
|
383
|
+
end
|
|
384
|
+
}
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
rule c_attr_values
|
|
388
|
+
c_any '' {
|
|
389
|
+
def value(node)
|
|
390
|
+
[c_any.value(node)]
|
|
391
|
+
end
|
|
392
|
+
}
|
|
393
|
+
/ c_object more_co:(c_object '')* {
|
|
394
|
+
def value(node)
|
|
395
|
+
c_objects.map {|c| c.value(node)}
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def c_objects
|
|
399
|
+
[c_object] + more_co.elements.map {|e| e.c_object }
|
|
400
|
+
end
|
|
401
|
+
}
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
rule c_includes
|
|
405
|
+
SYM_INCLUDE assertions {
|
|
406
|
+
def value
|
|
407
|
+
assertions.value
|
|
408
|
+
end
|
|
409
|
+
}
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
rule c_excludes
|
|
413
|
+
SYM_EXCLUDE assertions {
|
|
414
|
+
def value
|
|
415
|
+
assertions.value
|
|
416
|
+
end
|
|
417
|
+
}
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
rule c_existence
|
|
421
|
+
SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK space {
|
|
422
|
+
def value
|
|
423
|
+
existence_spec.value
|
|
424
|
+
end
|
|
425
|
+
}
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
rule existence_spec
|
|
429
|
+
lo:V_INTEGER SYM_ELLIPSIS up:V_INTEGER {
|
|
430
|
+
def value
|
|
431
|
+
OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value, :upper => up.value)
|
|
432
|
+
end
|
|
433
|
+
}
|
|
434
|
+
/ V_INTEGER '' {
|
|
435
|
+
def value
|
|
436
|
+
OpenEHR::AssumedLibraryTypes::Interval.new(:lower => V_INTEGER.value, :upper => V_INTEGER.value)
|
|
437
|
+
end
|
|
438
|
+
}
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
rule c_cardinality
|
|
442
|
+
SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK space {
|
|
443
|
+
def value
|
|
444
|
+
cardinality_spec.value
|
|
445
|
+
end
|
|
446
|
+
}
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
rule cardinality_spec
|
|
450
|
+
occurrence_spec ';' white_space SYM_ORDERED ';' white_space SYM_UNIQUE {
|
|
451
|
+
def value
|
|
452
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
453
|
+
:interval => occurrence_spec.value,
|
|
454
|
+
:is_unique => true,
|
|
455
|
+
:is_orderd => true)
|
|
456
|
+
end
|
|
457
|
+
}
|
|
458
|
+
/ occurrence_spec ';' white_space SYM_ORDERED {
|
|
459
|
+
def value
|
|
460
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
461
|
+
:interval => occurrence_spec.value,
|
|
462
|
+
:is_orderd => true)
|
|
463
|
+
end
|
|
464
|
+
}
|
|
465
|
+
/ occurrence_spec ';' white_space SYM_UNORDERD ';' white_space SYM_UNIQUE {
|
|
466
|
+
def value
|
|
467
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
468
|
+
:interval => occurrence_spec.value,
|
|
469
|
+
:is_unique => true,
|
|
470
|
+
:is_orderd => false)
|
|
471
|
+
end
|
|
472
|
+
}
|
|
473
|
+
/ occurrence_spec ';' white_space SYM_UNORDERD {
|
|
474
|
+
def value
|
|
475
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
476
|
+
:interval => occurrence_spec.value,
|
|
477
|
+
:is_orderd => false)
|
|
478
|
+
end
|
|
479
|
+
}
|
|
480
|
+
/ occurrence_spec SYM_UNIQUE ';' white_space SYM_ORDERED {
|
|
481
|
+
def value
|
|
482
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
483
|
+
:interval => occurrence_spec.value,
|
|
484
|
+
:is_unique => true,
|
|
485
|
+
:is_orderd => true)
|
|
486
|
+
end
|
|
487
|
+
}
|
|
488
|
+
/ occurrence_spec SYM_UNIQUE ';' white_space SYM_UNORDERD {
|
|
489
|
+
def value
|
|
490
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
491
|
+
:interval => occurrence_spec.value,
|
|
492
|
+
:is_unique => true,
|
|
493
|
+
:is_ordered => false)
|
|
494
|
+
end
|
|
495
|
+
}
|
|
496
|
+
/ occurrence_spec SYM_UNIQUE {
|
|
497
|
+
def value
|
|
498
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
499
|
+
:interval => occurrence_spec.value,
|
|
500
|
+
:is_unique => true)
|
|
501
|
+
end
|
|
502
|
+
}
|
|
503
|
+
/ occurrence_spec space {
|
|
504
|
+
def value
|
|
505
|
+
OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
|
|
506
|
+
:interval => occurrence_spec.value)
|
|
507
|
+
end
|
|
508
|
+
}
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
rule c_occurrences
|
|
512
|
+
SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK space {
|
|
513
|
+
def value
|
|
514
|
+
occurrence_spec.value
|
|
515
|
+
end
|
|
516
|
+
}
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
rule occurrence_spec
|
|
520
|
+
st:integer_value SYM_ELLIPSIS ed:cardinality_limit_value {
|
|
521
|
+
def value
|
|
522
|
+
if ed.value == '*'
|
|
523
|
+
OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
524
|
+
:lower => st.value)
|
|
525
|
+
else
|
|
526
|
+
OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
527
|
+
:lower => st.value,
|
|
528
|
+
:upper => ed.value)
|
|
529
|
+
end
|
|
530
|
+
end
|
|
531
|
+
}
|
|
532
|
+
/ cardinality_limit_value '' {
|
|
533
|
+
def value
|
|
534
|
+
OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
535
|
+
:lower => cardinality_limit_value.value,
|
|
536
|
+
:upper => cardinality_limit_value.value)
|
|
537
|
+
end
|
|
538
|
+
}
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
rule cardinality_limit_value
|
|
542
|
+
integer_value '' {
|
|
543
|
+
def value
|
|
544
|
+
text_value.to_i
|
|
545
|
+
end
|
|
546
|
+
}
|
|
547
|
+
/ '*' {
|
|
548
|
+
def value
|
|
549
|
+
'*'
|
|
550
|
+
end
|
|
551
|
+
}
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
rule c_integer
|
|
555
|
+
c_integer_spec ';' white_space integer_value {
|
|
556
|
+
def value
|
|
557
|
+
args = c_integer_spec.value
|
|
558
|
+
args[:assumed_value] = integer_value.value
|
|
559
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(args)
|
|
560
|
+
end
|
|
561
|
+
}
|
|
562
|
+
/ c_integer_spec '' {
|
|
563
|
+
def value
|
|
564
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(
|
|
565
|
+
c_integer_spec.value)
|
|
566
|
+
end
|
|
567
|
+
}
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
rule c_integer_spec
|
|
571
|
+
integer_list_value '' {
|
|
572
|
+
def value
|
|
573
|
+
{:list => integer_list_value.value}
|
|
574
|
+
end
|
|
575
|
+
}
|
|
576
|
+
/ integer_interval_value '' {
|
|
577
|
+
def value
|
|
578
|
+
{:range => integer_interval_value.value}
|
|
579
|
+
end
|
|
580
|
+
}
|
|
581
|
+
/ integer_value !'..' '' {
|
|
582
|
+
def value
|
|
583
|
+
{:list => [integer_value.value]}
|
|
584
|
+
end
|
|
585
|
+
}
|
|
586
|
+
/ occurrence_spec '' {
|
|
587
|
+
def value
|
|
588
|
+
{:range => occurrence_spec.value}
|
|
589
|
+
end
|
|
590
|
+
}
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
rule c_real_spec
|
|
594
|
+
real_list_value '' {
|
|
595
|
+
def value
|
|
596
|
+
{:list => real_list_value.value}
|
|
597
|
+
end
|
|
598
|
+
}
|
|
599
|
+
/ real_interval_value '' {
|
|
600
|
+
def value
|
|
601
|
+
{:range => real_interval_value.value}
|
|
602
|
+
end
|
|
603
|
+
}
|
|
604
|
+
/ real_value '' {
|
|
605
|
+
def value
|
|
606
|
+
{:list => [real_value.value]}
|
|
607
|
+
end
|
|
608
|
+
}
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
rule c_real
|
|
612
|
+
c_real_spec ';' white_space real_value {
|
|
613
|
+
def value
|
|
614
|
+
args = c_real_spec.value
|
|
615
|
+
args[:assumed_value] = real_value.value
|
|
616
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(args)
|
|
617
|
+
end
|
|
618
|
+
}
|
|
619
|
+
/ c_real_spec '' {
|
|
620
|
+
def value
|
|
621
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(
|
|
622
|
+
c_real_spec.value)
|
|
623
|
+
end
|
|
624
|
+
}
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
rule c_date_constraint
|
|
628
|
+
date_interval_value '' {
|
|
629
|
+
def value
|
|
630
|
+
{:range => date_interval_value.value}
|
|
631
|
+
end
|
|
632
|
+
}
|
|
633
|
+
/ date_list_value '' {
|
|
634
|
+
def value
|
|
635
|
+
{:list => date_list_value.value}
|
|
636
|
+
end
|
|
637
|
+
}
|
|
638
|
+
/ date_value '' {
|
|
639
|
+
def value
|
|
640
|
+
{:list => [date_value.value]}
|
|
641
|
+
end
|
|
642
|
+
}
|
|
643
|
+
/ con:V_ISO8601_DATE_CONSTRAINT_PATTERN '' {
|
|
644
|
+
def value
|
|
645
|
+
{:pattern => con.text_value}
|
|
646
|
+
end
|
|
647
|
+
}
|
|
648
|
+
end
|
|
649
|
+
|
|
650
|
+
rule c_date
|
|
651
|
+
c_date_constraint ';' white_space date_value {
|
|
652
|
+
def value
|
|
653
|
+
args = c_date_constraint.value
|
|
654
|
+
args[:assumed_value] = date_value.value
|
|
655
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
|
|
656
|
+
args)
|
|
657
|
+
end
|
|
658
|
+
}
|
|
659
|
+
/ c_date_constraint '' {
|
|
660
|
+
def value
|
|
661
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
|
|
662
|
+
c_date_constraint.value)
|
|
663
|
+
end
|
|
664
|
+
}
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
rule c_time_constraint
|
|
668
|
+
time_interval_value '' {
|
|
669
|
+
def value
|
|
670
|
+
{:range => time_interval_value.value}
|
|
671
|
+
end
|
|
672
|
+
}
|
|
673
|
+
/ time_list_value '' {
|
|
674
|
+
def value
|
|
675
|
+
{:list => time_list_value.value}
|
|
676
|
+
end
|
|
677
|
+
}
|
|
678
|
+
/ time_value '' {
|
|
679
|
+
def value
|
|
680
|
+
{:list => [time_value.value]}
|
|
681
|
+
end
|
|
682
|
+
}
|
|
683
|
+
/ tc:V_ISO8601_TIME_CONSTRAINT_PATTERN '' {
|
|
684
|
+
def value
|
|
685
|
+
{:pattern => tc.text_value}
|
|
686
|
+
end
|
|
687
|
+
}
|
|
688
|
+
end
|
|
689
|
+
|
|
690
|
+
rule c_time
|
|
691
|
+
c_time_constraint ';' white_space time_value {
|
|
692
|
+
def value
|
|
693
|
+
args = c_time_constraint.value
|
|
694
|
+
args[:assumed_value] = time_value.value
|
|
695
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
|
|
696
|
+
args)
|
|
697
|
+
end
|
|
698
|
+
}
|
|
699
|
+
/ c_time_constraint '' {
|
|
700
|
+
def value
|
|
701
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
|
|
702
|
+
c_time_constraint.value)
|
|
703
|
+
end
|
|
704
|
+
}
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
rule c_date_time_constraint
|
|
708
|
+
date_time_interval_value '' {
|
|
709
|
+
def value
|
|
710
|
+
{:range => date_time_interval_value.value}
|
|
711
|
+
end
|
|
712
|
+
}
|
|
713
|
+
/ date_time_value '' {
|
|
714
|
+
def value
|
|
715
|
+
{:list => [date_time_value.value]}
|
|
716
|
+
end
|
|
717
|
+
}
|
|
718
|
+
/ dtc:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN '' {
|
|
719
|
+
def value
|
|
720
|
+
{:pattern => dtc.text_value}
|
|
721
|
+
end
|
|
722
|
+
}
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
rule c_date_time
|
|
726
|
+
c_date_time_constraint ';' white_space date_time_value {
|
|
727
|
+
def value
|
|
728
|
+
args = c_date_time_constraint.value
|
|
729
|
+
args[:assumed_value] = date_time_value.value
|
|
730
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
|
|
731
|
+
args)
|
|
732
|
+
end
|
|
733
|
+
}
|
|
734
|
+
/ c_date_time_constraint '' {
|
|
735
|
+
def value
|
|
736
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
|
|
737
|
+
c_date_time_constraint.value)
|
|
738
|
+
end
|
|
739
|
+
}
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
rule c_duration_constraint
|
|
743
|
+
duration_pattern '/' duration_interval_value '' {
|
|
744
|
+
def value
|
|
745
|
+
{:pattern => duration_pattern.value}
|
|
746
|
+
end
|
|
747
|
+
}
|
|
748
|
+
/ duration_pattern '' {
|
|
749
|
+
def value
|
|
750
|
+
{:pattern => duration_pattern.value}
|
|
751
|
+
end
|
|
752
|
+
}
|
|
753
|
+
/ duration_interval_value '' {
|
|
754
|
+
def value
|
|
755
|
+
{:range => duration_interval_value.value}
|
|
756
|
+
end
|
|
757
|
+
}
|
|
758
|
+
/ duration_value '' {
|
|
759
|
+
def value
|
|
760
|
+
{:list => [duration_value.value]}
|
|
761
|
+
end
|
|
762
|
+
}
|
|
763
|
+
end
|
|
764
|
+
|
|
765
|
+
rule duration_pattern
|
|
766
|
+
dp:V_ISO8601_DURATION_CONSTRAINT_PATTERN '' {
|
|
767
|
+
def value
|
|
768
|
+
dp.text_value
|
|
769
|
+
end
|
|
770
|
+
}
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
rule c_duration
|
|
774
|
+
c_duration_constraint ';' white_space duration_value '' {
|
|
775
|
+
def value
|
|
776
|
+
args = c_duration_constraint.value
|
|
777
|
+
args[:assumed_value] = duration_value.value
|
|
778
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
|
|
779
|
+
args)
|
|
780
|
+
end
|
|
781
|
+
}
|
|
782
|
+
/ c_duration_constraint '' {
|
|
783
|
+
def value
|
|
784
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
|
|
785
|
+
c_duration_constraint.value)
|
|
786
|
+
end
|
|
787
|
+
}
|
|
788
|
+
end
|
|
789
|
+
|
|
790
|
+
rule c_string_spec
|
|
791
|
+
string_list_value ',' white_space SYM_LIST_CONTINUE {
|
|
792
|
+
def value
|
|
793
|
+
{:list => string_list_value.value}
|
|
794
|
+
end
|
|
795
|
+
}
|
|
796
|
+
/ string_list_value '' {
|
|
797
|
+
def value
|
|
798
|
+
{:list => string_list_value.value}
|
|
799
|
+
end
|
|
800
|
+
}
|
|
801
|
+
/ pat:V_REGEXP '' {
|
|
802
|
+
def value
|
|
803
|
+
{:pattern => pat.value}
|
|
804
|
+
end
|
|
805
|
+
}
|
|
806
|
+
/ str:V_STRING '' {
|
|
807
|
+
def value
|
|
808
|
+
{:list => [str.value]}
|
|
809
|
+
end
|
|
810
|
+
}
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
rule c_string
|
|
814
|
+
c_string_spec white_space ';' white_space string_value {
|
|
815
|
+
def value
|
|
816
|
+
args = c_string_spec.value
|
|
817
|
+
args[:assumed_value] = string_value.value
|
|
818
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
|
|
819
|
+
args)
|
|
820
|
+
end
|
|
821
|
+
}
|
|
822
|
+
/ c_string_spec '' {
|
|
823
|
+
def value
|
|
824
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
|
|
825
|
+
c_string_spec.value)
|
|
826
|
+
end
|
|
827
|
+
}
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
rule c_boolean_spec
|
|
831
|
+
SYM_TRUE ',' white_space SYM_FALSE {
|
|
832
|
+
def value
|
|
833
|
+
{:true_valid => true, :false_valid => true}
|
|
834
|
+
end
|
|
835
|
+
}
|
|
836
|
+
/ SYM_TRUE white_space '' {
|
|
837
|
+
def value
|
|
838
|
+
{:true_valid => true, :false_valid => false}
|
|
839
|
+
end
|
|
840
|
+
}
|
|
841
|
+
/ SYM_FALSE white_space ',' white_space SYM_TRUE {
|
|
842
|
+
def value
|
|
843
|
+
{:true_valid => true, :false_valid => true}
|
|
844
|
+
end
|
|
845
|
+
}
|
|
846
|
+
/ SYM_FALSE white_space '' {
|
|
847
|
+
def value
|
|
848
|
+
{:false_valid => true, :true_valid => false}
|
|
849
|
+
end
|
|
850
|
+
}
|
|
851
|
+
end
|
|
852
|
+
|
|
853
|
+
rule c_boolean
|
|
854
|
+
c_boolean_spec ';' white_space boolean_value {
|
|
855
|
+
def value
|
|
856
|
+
args = c_boolean_spec.value
|
|
857
|
+
args[:assumed_value] = boolean_value.value
|
|
858
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
|
|
859
|
+
args)
|
|
860
|
+
end
|
|
861
|
+
}
|
|
862
|
+
/ c_boolean_spec '' {
|
|
863
|
+
def value
|
|
864
|
+
OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
|
|
865
|
+
c_boolean_spec.value)
|
|
866
|
+
end
|
|
867
|
+
}
|
|
868
|
+
end
|
|
869
|
+
|
|
870
|
+
rule constraint_ref
|
|
871
|
+
vltcr:V_LOCAL_TERM_CODE_REF '' {
|
|
872
|
+
def value(node)
|
|
873
|
+
OpenEHR::AM::Archetype::ConstraintModel::ConstraintRef.new(
|
|
874
|
+
:path => node.path,
|
|
875
|
+
:rm_type_name => 'ConstraintRef',
|
|
876
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(:upper => 1, :lower => 1),
|
|
877
|
+
:reference => vltcr.value)
|
|
878
|
+
end
|
|
879
|
+
}
|
|
880
|
+
end
|
|
881
|
+
|
|
882
|
+
rule V_REGEXP
|
|
883
|
+
(('=' / '!') '~')? (('/' ('\/' / !'/' .)* '/') / ('^' (!'^' .)* '^') ) {
|
|
884
|
+
def value
|
|
885
|
+
text_value
|
|
886
|
+
end
|
|
887
|
+
}
|
|
888
|
+
end
|
|
889
|
+
|
|
890
|
+
rule code_string
|
|
891
|
+
NAMECHAR+ '' {
|
|
892
|
+
def value
|
|
893
|
+
text_value
|
|
894
|
+
end
|
|
895
|
+
}
|
|
896
|
+
end
|
|
897
|
+
|
|
898
|
+
rule code_string_list
|
|
899
|
+
first:code_string more:(',' space code_string)+ space {
|
|
900
|
+
def value
|
|
901
|
+
codes.map {|c| c.value}
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
def codes
|
|
905
|
+
[first] + more.elements.map {|e| e.code_string}
|
|
906
|
+
end
|
|
907
|
+
}
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
rule code_string_spec
|
|
911
|
+
code_string_list '' {
|
|
912
|
+
def value
|
|
913
|
+
code_string_list.value
|
|
914
|
+
end
|
|
915
|
+
}
|
|
916
|
+
/ code_string '' {
|
|
917
|
+
def value
|
|
918
|
+
[code_string.value]
|
|
919
|
+
end
|
|
920
|
+
}
|
|
921
|
+
end
|
|
922
|
+
|
|
923
|
+
rule c_code_phrase
|
|
924
|
+
ti:V_TERM_CODE code_string_spec ';' space code_string ']' space {
|
|
925
|
+
def value(node)
|
|
926
|
+
::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
|
|
927
|
+
:rm_type_name => 'CodePhrase',
|
|
928
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
929
|
+
:upper => 1, :lower => 1),
|
|
930
|
+
:terminology_id => ti.value, :code_list => code_string_spec.value,
|
|
931
|
+
:assumed_value => code_string.value,
|
|
932
|
+
:path => node.path)
|
|
933
|
+
end
|
|
934
|
+
}
|
|
935
|
+
/ ti:V_TERM_CODE code_string_spec ']' space {
|
|
936
|
+
def value(node)
|
|
937
|
+
::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
|
|
938
|
+
:rm_type_name => 'CodePhrase',
|
|
939
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
940
|
+
:upper => 1, :lower => 1),
|
|
941
|
+
:terminology_id => ti.value, :code_list => code_string_spec.value,
|
|
942
|
+
:path => node.path)
|
|
943
|
+
end
|
|
944
|
+
}
|
|
945
|
+
/ ti:V_TERM_CODE ']' space {
|
|
946
|
+
def value(node)
|
|
947
|
+
::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
|
|
948
|
+
:rm_type_name => 'CodePhrase',
|
|
949
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
950
|
+
:upper => 1, :lower => 1),
|
|
951
|
+
:terminology_id => ti.value, :code_list => [], :path => node.path)
|
|
952
|
+
end
|
|
953
|
+
}
|
|
954
|
+
end
|
|
955
|
+
|
|
956
|
+
rule SYM_C_DV_ORDINAL
|
|
957
|
+
'C_DV_ORDINAL' space
|
|
958
|
+
end
|
|
959
|
+
|
|
960
|
+
rule c_ordinal
|
|
961
|
+
c_ordinal_spec ';' space integer_value space {
|
|
962
|
+
def value
|
|
963
|
+
args = c_ordinal_spec.value
|
|
964
|
+
args[:assumed_value] = integer_value.value
|
|
965
|
+
args
|
|
966
|
+
end
|
|
967
|
+
}
|
|
968
|
+
/ c_ordinal_spec space '' {
|
|
969
|
+
def value
|
|
970
|
+
c_ordinal_spec.value
|
|
971
|
+
end
|
|
972
|
+
}
|
|
973
|
+
/ SYM_C_DV_ORDINAL SYM_LT white_space SYM_GT space {
|
|
974
|
+
def value
|
|
975
|
+
{:list => nil}
|
|
976
|
+
end
|
|
977
|
+
}
|
|
978
|
+
end
|
|
979
|
+
|
|
980
|
+
rule c_ordinal_spec
|
|
981
|
+
ordinal_list '' {
|
|
982
|
+
def value
|
|
983
|
+
{:list => ordinal_list.value}
|
|
984
|
+
end
|
|
985
|
+
}
|
|
986
|
+
/ ordinal '' {
|
|
987
|
+
def value
|
|
988
|
+
{:list => [ordinal.value]}
|
|
989
|
+
end
|
|
990
|
+
}
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
rule ordinal_list
|
|
994
|
+
first:ordinal more:(',' space ordinal)+ {
|
|
995
|
+
def value
|
|
996
|
+
ordinals.map {|o| o.value}
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
def ordinals
|
|
1000
|
+
[first] + more.elements.map {|e| e.ordinal}
|
|
1001
|
+
end
|
|
1002
|
+
}
|
|
1003
|
+
end
|
|
1004
|
+
|
|
1005
|
+
rule ordinal
|
|
1006
|
+
integer_value SYM_INTERVAL_DELIM vqtc:V_QUALIFIED_TERM_CODE_REF !SYM_INTERVAL_DELIM '' {
|
|
1007
|
+
def value
|
|
1008
|
+
symbol = ::OpenEHR::RM::DataTypes::Text::DvCodedText.new(
|
|
1009
|
+
:value => vqtc.text_value, :defining_code => vqtc.value)
|
|
1010
|
+
::OpenEHR::RM::DataTypes::Quantity::DvOrdinal.new(
|
|
1011
|
+
:value => integer_value.value,
|
|
1012
|
+
:symbol => symbol)
|
|
1013
|
+
end
|
|
1014
|
+
}
|
|
1015
|
+
end
|
|
1016
|
+
|
|
1017
|
+
rule c_dv_quantity
|
|
1018
|
+
SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1019
|
+
prop:property? ql:quantity_list? aqv:assumed_quantity_value?
|
|
1020
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1021
|
+
/ SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1022
|
+
prop:property? aqv:assumed_quantity_value? ql:quantity_list?
|
|
1023
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1024
|
+
/ SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1025
|
+
aqv:assumed_quantity_value? prop:property? ql:quantity_list?
|
|
1026
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1027
|
+
/ SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1028
|
+
aqv:assumed_quantity_value? ql:quantity_list? prop:property?
|
|
1029
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1030
|
+
/ SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1031
|
+
ql:quantity_list? aqv:assumed_quantity_value? prop:property?
|
|
1032
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1033
|
+
/ SYM_C_DV_QUANTITY SYM_START_DBLOCK
|
|
1034
|
+
ql:quantity_list? prop:property? aqv:assumed_quantity_value?
|
|
1035
|
+
SYM_END_DBLOCK <CDvQuantityItems>
|
|
1036
|
+
end
|
|
1037
|
+
|
|
1038
|
+
rule SYM_C_DV_QUANTITY
|
|
1039
|
+
'C_DV_QUANTITY' space
|
|
1040
|
+
end
|
|
1041
|
+
|
|
1042
|
+
rule property
|
|
1043
|
+
SYM_PROPERTY SYM_EQ SYM_START_DBLOCK
|
|
1044
|
+
prop:V_QUALIFIED_TERM_CODE_REF SYM_END_DBLOCK {
|
|
1045
|
+
def value
|
|
1046
|
+
prop.value
|
|
1047
|
+
end
|
|
1048
|
+
}
|
|
1049
|
+
end
|
|
1050
|
+
|
|
1051
|
+
rule SYM_PROPERTY
|
|
1052
|
+
'property' space
|
|
1053
|
+
end
|
|
1054
|
+
|
|
1055
|
+
rule quantity_list
|
|
1056
|
+
SYM_QUANTITY_LIST SYM_EQ SYM_START_DBLOCK
|
|
1057
|
+
c_quantity_items SYM_END_DBLOCK {
|
|
1058
|
+
def value(node)
|
|
1059
|
+
c_quantity_items.value(node)
|
|
1060
|
+
end
|
|
1061
|
+
}
|
|
1062
|
+
end
|
|
1063
|
+
|
|
1064
|
+
rule assumed_quantity_value
|
|
1065
|
+
SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1066
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1067
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1068
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1069
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1070
|
+
/ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1071
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1072
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1073
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1074
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1075
|
+
/ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1076
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1077
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1078
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1079
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1080
|
+
/ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1081
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1082
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1083
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1084
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1085
|
+
/ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1086
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1087
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1088
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1089
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1090
|
+
/ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
|
|
1091
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
|
|
1092
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1093
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
|
|
1094
|
+
SYM_END_DBLOCK <AssumedValueItems>
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1097
|
+
rule SYM_QUANTITY_LIST
|
|
1098
|
+
'list' space
|
|
1099
|
+
end
|
|
1100
|
+
|
|
1101
|
+
rule c_quantity_items
|
|
1102
|
+
c_quantity_item more_cdv:(c_quantity_item white_space)* {
|
|
1103
|
+
def value(node)
|
|
1104
|
+
quantities.map {|q| q.value(node)}
|
|
1105
|
+
end
|
|
1106
|
+
|
|
1107
|
+
def quantities
|
|
1108
|
+
[c_quantity_item] + more_cdv.elements.map {|e| e.c_quantity_item}
|
|
1109
|
+
end
|
|
1110
|
+
}
|
|
1111
|
+
end
|
|
1112
|
+
|
|
1113
|
+
rule c_quantity_item
|
|
1114
|
+
'[' V_STRING ']' white_space SYM_EQ SYM_START_DBLOCK
|
|
1115
|
+
SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
|
|
1116
|
+
mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK int:real_interval_value SYM_END_DBLOCK)?
|
|
1117
|
+
prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK int:integer_interval_value SYM_END_DBLOCK)?
|
|
1118
|
+
SYM_END_DBLOCK {
|
|
1119
|
+
def value(node)
|
|
1120
|
+
magnitude, precision = nil
|
|
1121
|
+
magnitude = mag.int.value unless mag.empty?
|
|
1122
|
+
precision = prec.int.value unless prec.empty?
|
|
1123
|
+
OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CQuantityItem.new(
|
|
1124
|
+
:path => node.path, :rm_type_name => 'DvQuantity',
|
|
1125
|
+
:occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
|
|
1126
|
+
:upper => 1, :lower => 1),
|
|
1127
|
+
:units => units.value,
|
|
1128
|
+
:magnitude => magnitude, :precision => precision)
|
|
1129
|
+
end
|
|
1130
|
+
}
|
|
1131
|
+
end
|
|
1132
|
+
|
|
1133
|
+
rule SYM_UNITS
|
|
1134
|
+
'units' space
|
|
1135
|
+
end
|
|
1136
|
+
|
|
1137
|
+
rule SYM_MAGNITUDE
|
|
1138
|
+
'magnitude' space
|
|
1139
|
+
end
|
|
1140
|
+
|
|
1141
|
+
rule SYM_PRECISION
|
|
1142
|
+
'precision' space
|
|
1143
|
+
end
|
|
1144
|
+
|
|
1145
|
+
rule SYM_ASSUMED_VALUE
|
|
1146
|
+
'assumed_value' space
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
rule V_C_DOMAIN_TYPE
|
|
1150
|
+
'('? [A-Z] IDCHAR* ')'? [ \n]* '<' [^>]* '>'
|
|
1151
|
+
end
|
|
1152
|
+
|
|
1153
|
+
# assertion block
|
|
1154
|
+
|
|
1155
|
+
rule V_ASSERTION_TEXT
|
|
1156
|
+
assertions '' {
|
|
1157
|
+
def value
|
|
1158
|
+
assertions.value
|
|
1159
|
+
end
|
|
1160
|
+
}
|
|
1161
|
+
end
|
|
1162
|
+
|
|
1163
|
+
rule assertions
|
|
1164
|
+
assertion more_a:(assertion '')* {
|
|
1165
|
+
def value
|
|
1166
|
+
assertions.map {|a| a.value}
|
|
1167
|
+
end
|
|
1168
|
+
|
|
1169
|
+
def assertions
|
|
1170
|
+
[assertion] + more_a.elements.map {|a| a.assertion}
|
|
1171
|
+
end
|
|
1172
|
+
}
|
|
1173
|
+
end
|
|
1174
|
+
|
|
1175
|
+
rule assertion
|
|
1176
|
+
id:(any_identifier ':')? boolean_expression space {
|
|
1177
|
+
def value
|
|
1178
|
+
if (id && !id.empty?)
|
|
1179
|
+
OpenEHR::AM::Archetype::Assertion::Assertion.new(
|
|
1180
|
+
:tag => id.value, :expression => boolean_expression.value,
|
|
1181
|
+
:string_expression => id.text_value + boolean_expression.text_value)
|
|
1182
|
+
else
|
|
1183
|
+
OpenEHR::AM::Archetype::Assertion::Assertion.new(
|
|
1184
|
+
:expression => boolean_expression.value,
|
|
1185
|
+
:string_expression => boolean_expression.text_value)
|
|
1186
|
+
end
|
|
1187
|
+
end
|
|
1188
|
+
}
|
|
1189
|
+
end
|
|
1190
|
+
|
|
1191
|
+
rule boolean_expression
|
|
1192
|
+
boolean_node '' {
|
|
1193
|
+
def value
|
|
1194
|
+
boolean_node.value
|
|
1195
|
+
end
|
|
1196
|
+
}
|
|
1197
|
+
/ boolean_leaf '' {
|
|
1198
|
+
def value
|
|
1199
|
+
boolean_leaf.value
|
|
1200
|
+
end
|
|
1201
|
+
}
|
|
1202
|
+
end
|
|
1203
|
+
|
|
1204
|
+
rule boolean_node
|
|
1205
|
+
SYM_EXISTS absolute_path {
|
|
1206
|
+
def value
|
|
1207
|
+
item = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
|
|
1208
|
+
:type => 'String',
|
|
1209
|
+
:item => absolute_path.value,
|
|
1210
|
+
:reference_type => 'CONSTANT')
|
|
1211
|
+
OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
|
|
1212
|
+
:type => 'Boolean',
|
|
1213
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXISTS,
|
|
1214
|
+
:operand => item,
|
|
1215
|
+
:precedence_overridden => false)
|
|
1216
|
+
end
|
|
1217
|
+
}
|
|
1218
|
+
/ relative_path white_space SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK {
|
|
1219
|
+
def value
|
|
1220
|
+
left_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
|
|
1221
|
+
:type => 'String',
|
|
1222
|
+
:item => relative_path.value,
|
|
1223
|
+
:reference_type => 'Constant')
|
|
1224
|
+
right_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
|
|
1225
|
+
:item => c_primitive.value,
|
|
1226
|
+
:type => c_primitive.value.type,
|
|
1227
|
+
:reference_type => 'Constant')
|
|
1228
|
+
op = OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MATCHES
|
|
1229
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1230
|
+
:type => 'Boolean',
|
|
1231
|
+
:operator => op,
|
|
1232
|
+
:right_operand => right_op,
|
|
1233
|
+
:left_operand => left_op,
|
|
1234
|
+
:reference_type => 'Constraint')
|
|
1235
|
+
end
|
|
1236
|
+
}
|
|
1237
|
+
/ SYM_NOT boolean_leaf '' {
|
|
1238
|
+
def value
|
|
1239
|
+
OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
|
|
1240
|
+
:type => 'Boolean',
|
|
1241
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NOT,
|
|
1242
|
+
:operand => boolean_leaf.value,
|
|
1243
|
+
:precedence_overridden => false)
|
|
1244
|
+
end
|
|
1245
|
+
}
|
|
1246
|
+
/ arithmetic_leaf SYM_EQ arithmetic_expression {
|
|
1247
|
+
def value
|
|
1248
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1249
|
+
:type => 'Boolean',
|
|
1250
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EQ,
|
|
1251
|
+
:left_operand => arithmetic_leaf.value,
|
|
1252
|
+
:right_operand => arithmetic_expression.value,
|
|
1253
|
+
:reference_type => 'Constraint')
|
|
1254
|
+
end
|
|
1255
|
+
}
|
|
1256
|
+
/ arithmetic_leaf SYM_NE arithmetic_expression {
|
|
1257
|
+
def value
|
|
1258
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1259
|
+
:type => 'Boolean',
|
|
1260
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NE,
|
|
1261
|
+
:left_operand => arithmetic_leaf.value,
|
|
1262
|
+
:right_operand => arithmetic_expression.value,
|
|
1263
|
+
:reference_type => 'Constraint')
|
|
1264
|
+
end
|
|
1265
|
+
}
|
|
1266
|
+
/ arithmetic_leaf SYM_LT arithmetic_expression {
|
|
1267
|
+
def value
|
|
1268
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1269
|
+
:type => 'Boolean',
|
|
1270
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LT,
|
|
1271
|
+
:left_operand => arithmetic_leaf.value,
|
|
1272
|
+
:right_operand => arithmetic_expression.value,
|
|
1273
|
+
:reference_type => 'Constraint')
|
|
1274
|
+
end
|
|
1275
|
+
}
|
|
1276
|
+
/ arithmetic_leaf SYM_GT arithmetic_expression {
|
|
1277
|
+
def value
|
|
1278
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1279
|
+
:type => 'Boolean',
|
|
1280
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GT,
|
|
1281
|
+
:left_operand => arithmetic_leaf.value,
|
|
1282
|
+
:right_operand => arithmetic_expression.value,
|
|
1283
|
+
:reference_type => 'Constraint')
|
|
1284
|
+
end
|
|
1285
|
+
}
|
|
1286
|
+
/ arithmetic_leaf SYM_LE arithmetic_expression {
|
|
1287
|
+
def value
|
|
1288
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1289
|
+
:type => 'Boolean',
|
|
1290
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LE,
|
|
1291
|
+
:left_operand => arithmetic_leaf.value,
|
|
1292
|
+
:right_operand => arithmetic_expression.value,
|
|
1293
|
+
:reference_type => 'Constraint')
|
|
1294
|
+
end
|
|
1295
|
+
}
|
|
1296
|
+
/ arithmetic_leaf SYM_GE arithmetic_expression {
|
|
1297
|
+
def value
|
|
1298
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1299
|
+
:type => 'Boolean',
|
|
1300
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GE,
|
|
1301
|
+
:left_operand => arithmetic_leaf.value,
|
|
1302
|
+
:right_operand => arithmetic_expression.value,
|
|
1303
|
+
:reference_type => 'Constraint')
|
|
1304
|
+
end
|
|
1305
|
+
}
|
|
1306
|
+
/ boolean_leaf SYM_AND boolean_expression {
|
|
1307
|
+
def value
|
|
1308
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1309
|
+
:type => 'Boolean',
|
|
1310
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_AND,
|
|
1311
|
+
:left_operand => boolean_leaf.value,
|
|
1312
|
+
:right_operand => boolean_expression.value,
|
|
1313
|
+
:reference_type => 'Constraint')
|
|
1314
|
+
end
|
|
1315
|
+
}
|
|
1316
|
+
/ boolean_leaf SYM_OR boolean_expression {
|
|
1317
|
+
def value
|
|
1318
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1319
|
+
:type => 'Boolean',
|
|
1320
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_OR,
|
|
1321
|
+
:left_operand => boolean_leaf.value,
|
|
1322
|
+
:right_operand => boolean_expression.value,
|
|
1323
|
+
:reference_type => 'Constraint')
|
|
1324
|
+
end
|
|
1325
|
+
}
|
|
1326
|
+
/ boolean_leaf SYM_XOR boolean_expression {
|
|
1327
|
+
def value
|
|
1328
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1329
|
+
:type => 'Boolean',
|
|
1330
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_XOR,
|
|
1331
|
+
:left_operand => boolean_leaf.value,
|
|
1332
|
+
:right_operand => boolean_expression.value,
|
|
1333
|
+
:reference_type => 'Constraint')
|
|
1334
|
+
end
|
|
1335
|
+
}
|
|
1336
|
+
/ boolean_leaf SYM_IMPLIES boolean_expression {
|
|
1337
|
+
def value
|
|
1338
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1339
|
+
:type => 'Boolean',
|
|
1340
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_IMPLIES,
|
|
1341
|
+
:left_operand => boolean_leaf.value,
|
|
1342
|
+
:right_operand => boolean_expression.value,
|
|
1343
|
+
:reference_type => 'Constraint')
|
|
1344
|
+
end
|
|
1345
|
+
}
|
|
1346
|
+
end
|
|
1347
|
+
|
|
1348
|
+
rule boolean_leaf
|
|
1349
|
+
'(' boolean_expression ')' {
|
|
1350
|
+
def value
|
|
1351
|
+
boolean_expression.value
|
|
1352
|
+
end
|
|
1353
|
+
}
|
|
1354
|
+
/ SYM_TRUE '' {
|
|
1355
|
+
def value
|
|
1356
|
+
OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
|
|
1357
|
+
:type => 'Boolean',
|
|
1358
|
+
:item => true,
|
|
1359
|
+
:reference_type => 'CONSTANT')
|
|
1360
|
+
end
|
|
1361
|
+
}
|
|
1362
|
+
/ SYM_FALSE '' {
|
|
1363
|
+
def value
|
|
1364
|
+
OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
|
|
1365
|
+
:type => 'Boolean',
|
|
1366
|
+
:item => false,
|
|
1367
|
+
:reference_type => 'CONSTANT')
|
|
1368
|
+
end
|
|
1369
|
+
}
|
|
1370
|
+
end
|
|
1371
|
+
|
|
1372
|
+
rule arithmetic_expression
|
|
1373
|
+
arithmetic_node '' {
|
|
1374
|
+
def value
|
|
1375
|
+
arithmetic_node.value
|
|
1376
|
+
end
|
|
1377
|
+
}
|
|
1378
|
+
/ arithmetic_leaf '' {
|
|
1379
|
+
def value
|
|
1380
|
+
arithmetic_leaf.value
|
|
1381
|
+
end
|
|
1382
|
+
}
|
|
1383
|
+
end
|
|
1384
|
+
|
|
1385
|
+
rule arithmetic_node
|
|
1386
|
+
arithmetic_leaf '+' arithmetic_expression {
|
|
1387
|
+
def value
|
|
1388
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1389
|
+
:type => 'Boolean',
|
|
1390
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_PLUS,
|
|
1391
|
+
:left_operand => arithmetic_leaf.value,
|
|
1392
|
+
:right_operand => arithmetic_expression.value,
|
|
1393
|
+
:reference_type => 'Constraint')
|
|
1394
|
+
end
|
|
1395
|
+
}
|
|
1396
|
+
/ arithmetic_leaf '-' arithmetic_expression {
|
|
1397
|
+
def value
|
|
1398
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1399
|
+
:type => 'Boolean',
|
|
1400
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MINUS,
|
|
1401
|
+
:left_operand => arithmetic_leaf.value,
|
|
1402
|
+
:right_operand => arithmetic_expression.value,
|
|
1403
|
+
:reference_type => 'Constraint')
|
|
1404
|
+
end
|
|
1405
|
+
}
|
|
1406
|
+
/ arithmetic_leaf '*' arithmetic_expression {
|
|
1407
|
+
def value
|
|
1408
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1409
|
+
:type => 'Boolean',
|
|
1410
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MULTIPLY,
|
|
1411
|
+
:left_operand => arithmetic_leaf.value,
|
|
1412
|
+
:right_operand => arithmetic_expression.value,
|
|
1413
|
+
:reference_type => 'Constraint')
|
|
1414
|
+
end
|
|
1415
|
+
}
|
|
1416
|
+
/ arithmetic_leaf '/' arithmetic_expression {
|
|
1417
|
+
def value
|
|
1418
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1419
|
+
:type => 'Boolean',
|
|
1420
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_DIVIDE,
|
|
1421
|
+
:left_operand => arithmetic_leaf.value,
|
|
1422
|
+
:right_operand => arithmetic_expression.value,
|
|
1423
|
+
:reference_type => 'Constraint')
|
|
1424
|
+
end
|
|
1425
|
+
}
|
|
1426
|
+
/ arithmetic_leaf '^' arithmetic_expression {
|
|
1427
|
+
def value
|
|
1428
|
+
OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
|
|
1429
|
+
:type => 'Boolean',
|
|
1430
|
+
:operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXP,
|
|
1431
|
+
:left_operand => arithmetic_leaf.value,
|
|
1432
|
+
:right_operand => arithmetic_expression.value,
|
|
1433
|
+
:reference_type => 'Constraint')
|
|
1434
|
+
end
|
|
1435
|
+
}
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
rule arithmetic_leaf
|
|
1439
|
+
'(' arithmetic_expression ')' space {
|
|
1440
|
+
def value
|
|
1441
|
+
arithmetic_expression.value
|
|
1442
|
+
end
|
|
1443
|
+
}
|
|
1444
|
+
/ integer_value '' {
|
|
1445
|
+
def value
|
|
1446
|
+
OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
|
|
1447
|
+
:type => 'Integer',
|
|
1448
|
+
:item => integer_value.value,
|
|
1449
|
+
:reference_type => 'CONSTANT')
|
|
1450
|
+
end
|
|
1451
|
+
}
|
|
1452
|
+
/ real_value '' {
|
|
1453
|
+
def value
|
|
1454
|
+
OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
|
|
1455
|
+
:type => 'Real',
|
|
1456
|
+
:item => real_value.value,
|
|
1457
|
+
:reference_type => 'CONSTANT')
|
|
1458
|
+
end
|
|
1459
|
+
}
|
|
1460
|
+
/ absolute_path space {
|
|
1461
|
+
def value
|
|
1462
|
+
OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
|
|
1463
|
+
:type => 'String',
|
|
1464
|
+
:item => absolute_path.value,
|
|
1465
|
+
:reference_type => 'CONSTANT')
|
|
1466
|
+
|
|
1467
|
+
end
|
|
1468
|
+
}
|
|
1469
|
+
end
|
|
1470
|
+
|
|
1471
|
+
# path block
|
|
1472
|
+
rule object_path
|
|
1473
|
+
movable_path '' {
|
|
1474
|
+
def value
|
|
1475
|
+
movable_path.value
|
|
1476
|
+
end
|
|
1477
|
+
}
|
|
1478
|
+
/ absolute_path '' {
|
|
1479
|
+
def value
|
|
1480
|
+
absolute_path.value
|
|
1481
|
+
end
|
|
1482
|
+
}
|
|
1483
|
+
/ relative_path '' {
|
|
1484
|
+
def value
|
|
1485
|
+
relative_path.value
|
|
1486
|
+
end
|
|
1487
|
+
}
|
|
1488
|
+
end
|
|
1489
|
+
|
|
1490
|
+
rule movable_path
|
|
1491
|
+
SYM_MOVABLE_LEADER relative_path '' {
|
|
1492
|
+
def value
|
|
1493
|
+
text_value
|
|
1494
|
+
end
|
|
1495
|
+
}
|
|
1496
|
+
end
|
|
1497
|
+
|
|
1498
|
+
rule absolute_path
|
|
1499
|
+
'/' relative_path? '' {
|
|
1500
|
+
def value
|
|
1501
|
+
text_value
|
|
1502
|
+
end
|
|
1503
|
+
}
|
|
1504
|
+
end
|
|
1505
|
+
|
|
1506
|
+
rule relative_path
|
|
1507
|
+
path_segment ('/' path_segment)* '' {
|
|
1508
|
+
def value
|
|
1509
|
+
text_value
|
|
1510
|
+
end
|
|
1511
|
+
}
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
rule path_segment
|
|
1515
|
+
V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF? '' {
|
|
1516
|
+
def value
|
|
1517
|
+
text_value
|
|
1518
|
+
end
|
|
1519
|
+
}
|
|
1520
|
+
end
|
|
1521
|
+
|
|
1522
|
+
rule SYM_MOVABLE_LEADER
|
|
1523
|
+
'//'
|
|
1524
|
+
end
|
|
1525
|
+
end
|
|
1526
|
+
end
|
|
1527
|
+
end
|