lib/openehr/parser/adl_grammar.tt in openehr-1.1.0 vs lib/openehr/parser/adl_grammar.tt in openehr-1.1.1
- old
+ new
@@ -1,20 +1,17 @@
-require 'shared_token_grammar'
-require 'dadl_grammar'
-require 'cadl_grammar'
-require 'adl'
+require 'openehr/assumed_library_types'
+require 'openehr/rm/data_types/quantity'
+require 'openehr/am/archetype/constraint_model'
+require 'openehr/am/openehr_profile/data_types/text'
+require 'openehr/am/openehr_profile/data_types/quantity'
+require 'adl_helper'
module OpenEHR
module Parser
grammar ADLGrammar
-
- include SharedToken
- include DADLGrammar
- include CADL
-
rule archetype
- arch_identification
+ arch_identification
spec:(arch_specialisation)?
arch_concept
lang:(arch_language)?
desc:(arch_description)?
arch_definition
@@ -238,8 +235,3095 @@
term_defs.update Hash[lang => terms]
end
end
}
end # of arch_ontology
+
+# cADL grammar section
+
+ rule V_CADL_TEXT
+ c_complex_object '' {
+ def value
+ c_complex_object.value
+ end
+ }
+ / assertions '' {
+ def value
+ assertions.value
+ end
+ }
+ end
+
+ rule c_complex_object
+ head:c_complex_object_head SYM_MATCHES SYM_START_CBLOCK body:c_complex_object_body SYM_END_CBLOCK space {
+ def value(node = ArchetypeNode.new)
+ args = head.value
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => 1, :upper => 1)
+ node.id = args[:node_id]
+ if node.root? or node.id.nil?
+ args[:path] = node.path
+ else
+ args[:path] = node.path + '[' + node.id + ']'
+ end
+ args.update body.value(node)
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
+ end
+ }
+ / c_complex_object_head '' {
+ def value(node = ArchetypeNode.new)
+ args = c_complex_object_head.value
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => 1, :upper => 1)
+ node.id = args[:node_id]
+ args[:path] = node.path
+ OpenEHR::AM::Archetype::ConstraintModel::CComplexObject.new(args)
+ end
+ }
+ end
+
+ rule c_complex_object_head
+ c_complex_object_id c_occurrences {
+ def value
+ args = c_complex_object_id.value
+ args[:occurrences] = c_occurrences.value
+ args
+ end
+ }
+ / c_complex_object_id '' {
+ def value
+ c_complex_object_id.value
+ end
+ }
+ end
+
+ rule c_complex_object_id
+ ti:type_identifier lo:V_LOCAL_TERM_CODE_REF space {
+ def value
+ {:rm_type_name => ti.value,
+ :node_id => lo.value}
+ end
+ }
+ / ti:type_identifier space {
+ def value
+ {:rm_type_name => ti.value}
+ end
+ }
+ end
+
+ rule c_complex_object_body
+ c_any '' {
+ def value(node)
+ Hash[:attributes => [c_any.value(node)]]
+ end
+ }
+ / c_attributes '' {
+ def value(node)
+ Hash[:attributes => c_attributes.value(node)]
+ end
+ }
+ end
+
+ rule c_object
+ c_dv_quantity '' {
+ def value(node)
+ c_dv_quantity.value(node)
+ end
+ }
+ / c_ordinal '' {
+ def value(node)
+ args = c_ordinal.value
+ args[:path] = node.path
+ args[:rm_type_name] = 'DvOrdinal'
+ args[:occurrences] ||= OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1)
+ OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CDvOrdinal.new(
+ args)
+ end
+ }
+ / c_primitive_object '' {
+ def value(node)
+ c_primitive_object.value
+ end
+ }
+ / c_complex_object '' {
+ def value(node)
+ c_complex_object.value(node)
+ end
+ }
+ / c_code_phrase '' {
+ def value(node)
+ c_code_phrase.value(node)
+ end
+ }
+ / constraint_ref '' {
+ def value(node)
+ constraint_ref.value(node)
+ end
+ }
+ / archetype_slot '' {
+ def value(node)
+ archetype_slot.value(node)
+ end
+ }
+ / archetype_internal_ref '' {
+ def value(node = nil)
+ archetype_internal_ref.value(node)
+ end
+ }
+ / V_C_DOMAIN_TYPE '' {
+ def value(node = nil)
+ p elemetns
+ end
+ }
+# / ERR_V_C_DOMAIN_TYPE
+ end
+
+ rule archetype_internal_ref
+ SYM_USE_NODE type_identifier c_occurrences object_path space {
+ def value(node)
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
+ :rm_type_name => type_identifier.value,
+ :occurrences => c_occurrences.value,
+ :path => node.path,
+ :target_path => object_path.value)
+ end
+ }
+ / SYM_USE_NODE type_identifier object_path space {
+ def value(node = nil)
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeInternalRef.new(
+ :rm_type_name => type_identifier.value,
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => 1, :upper => 1),
+ :path => node.path,
+ :target_path => object_path.value)
+ end
+ }
+ end
+
+ rule archetype_slot
+ c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes c_excludes SYM_END_CBLOCK space {
+ def value(node)
+ args = c_archetype_slot_head.value(node)
+ args[:includes] = c_includes.value
+ args[:excludes] = c_excludes.value
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
+ end
+ }
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_includes SYM_END_CBLOCK space {
+ def value(node)
+ args = c_archetype_slot_head.value(node)
+ args[:includes] = c_includes.value
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
+ end
+ }
+ / c_archetype_slot_head SYM_MATCHES SYM_START_CBLOCK c_excludes SYM_END_CBLOCK space {
+ def value(node)
+ args = c_archetype_slot_head.value(node)
+ args[:excludes] = c_excludes.value
+ OpenEHR::AM::Archetype::ConstraintModel::ArchetypeSlot.new(args)
+ end
+ }
+ end
+
+ rule c_archetype_slot_head
+ c_archetype_slot_id white_space c_occurrences {
+ def value(node)
+ args = c_archetype_slot_id.value(node)
+ args[:occurrences] = c_occurrences.value
+ args
+ end
+ }
+ / c_archetype_slot_id white_space {
+ def value(node)
+ args = c_archetype_slot_id.value(node)
+ args[:occurrences] = OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1)
+ args
+ end
+ }
+ end
+
+ rule c_archetype_slot_id
+ SYM_ALLOW_ARCHETYPE type_identifier lt:V_LOCAL_TERM_CODE_REF {
+ def value(node)
+ {:rm_type_name => type_identifier.value,
+ :node_id => lt.value,
+ :path => node.path + "[#{lt.value}]"}
+ end
+ }
+ / SYM_ALLOW_ARCHETYPE type_identifier {
+ def value(node)
+ {:rm_type_name => type_identifier.value,
+ :path => node.path}
+ end
+ }
+ end
+
+ rule c_primitive_object
+ c_primitive '' {
+ def value
+ c_primitive.value
+ end
+ }
+ end
+
+ rule c_primitive
+ c_boolean '' {
+ def value
+ c_boolean.value
+ end
+ }
+ / c_date_time '' {
+ def value
+ c_date_time.value
+ end
+ }
+ / c_time '' {
+ def value
+ c_time.value
+ end
+ }
+ / c_date '' {
+ def value
+ c_date.value
+ end
+ }
+ / c_duration '' {
+ def value
+ c_duration.value
+ end
+ }
+ / c_real '' {
+ def value
+ c_real.value
+ end
+ }
+ / c_integer '' {
+ def value
+ c_integer.value
+ end
+ }
+ / c_string '' {
+ def value
+ c_string.value
+ end
+ }
+ end
+
+ rule c_any
+ '*' space {
+ def value(node)
+ OpenEHR::AM::Archetype::ConstraintModel::CAttribute.new(
+ :path => node.path, :rm_attribute_name => 'ANY',
+ :exsitence => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => 1, :upper => 1))
+ end
+ }
+ end
+
+ rule c_attributes
+ c_attribute more_attr:(c_attribute white_space)* {
+ def value(node)
+ attributes.map {|c| c.value(node)}
+ end
+
+ def attributes
+ [c_attribute] + more_attr.elements.map {|e| e.c_attribute}
+ end
+ }
+ end
+
+ rule c_attribute
+ c_attr_head c_attr_body {
+ def value(node)
+ val = c_attr_head.value(node)
+ child_node = ArchetypeNode.new(node)
+ child_node.path = val.path
+ val.children = c_attr_body.value(child_node)
+ val
+ end
+ }
+ end
+
+ rule c_attr_head
+ id:(V_ATTRIBUTE_IDENTIFIER) white_space c_existence c_cardinality {
+ def value(node)
+ if node.root?
+ path = node.path + id.value
+ elsif node.id
+ path = node.path + "[#{node.id}]/" + id.value
+ elsif
+ path = node.path + '/' + id.value
+ end
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
+ :rm_attribute_name => id.value,
+ :path => path,
+ :existence => c_existence.value,
+ :cardinality => c_cardinality.value)
+ end
+ }
+ / id:V_ATTRIBUTE_IDENTIFIER white_space c_existence {
+ def value(node)
+ if node.root?
+ path = node.path + id.value
+ elsif node.id
+ path = node.path + "[#{node.id}]/" + id.value
+ elsif
+ path = node.path + '/' + id.value
+ end
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
+ :rm_attribute_name => id.value,
+ :path => path,
+ :existence => c_existence.value)
+ end
+ }
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space c_cardinality {
+ def value(node)
+ if node.root?
+ path = node.path + id.value
+ elsif node.id
+ path = node.path + "[#{node.id}]/" + id.value
+ elsif
+ path = node.path + '/' + id.value
+ end
+ OpenEHR::AM::Archetype::ConstraintModel::CMultipleAttribute.new(
+ :rm_attribute_name => id.value,
+ :path => path,
+ :cardinality => c_cardinality.value)
+ end
+ }
+ / id:(V_ATTRIBUTE_IDENTIFIER) white_space {
+ def value(node)
+ if node.root?
+ path = node.path + id.value
+ elsif node.id
+ path = node.path + "[#{node.id}]/" + id.value
+ elsif
+ path = node.path + '/' + id.value
+ end
+ OpenEHR::AM::Archetype::ConstraintModel::CSingleAttribute.new(
+ :rm_attribute_name => id.value, :path => path)
+ end
+ }
+ end
+
+ rule c_attr_body
+ SYM_MATCHES SYM_START_CBLOCK c_attr_values SYM_END_CBLOCK space {
+ def value(node)
+ c_attr_values.value(node)
+ end
+ }
+ end
+
+ rule c_attr_values
+ c_any '' {
+ def value(node)
+ [c_any.value(node)]
+ end
+ }
+ / c_object more_co:(c_object '')* {
+ def value(node)
+ c_objects.map {|c| c.value(node)}
+ end
+
+ def c_objects
+ [c_object] + more_co.elements.map {|e| e.c_object }
+ end
+ }
+ end
+
+ rule c_includes
+ SYM_INCLUDE assertions {
+ def value
+ assertions.value
+ end
+ }
+ end
+
+ rule c_excludes
+ SYM_EXCLUDE assertions {
+ def value
+ assertions.value
+ end
+ }
+ end
+
+ rule c_existence
+ SYM_EXISTENCE SYM_MATCHES SYM_START_CBLOCK existence_spec SYM_END_CBLOCK space {
+ def value
+ existence_spec.value
+ end
+ }
+ end
+
+ rule existence_spec
+ lo:V_INTEGER SYM_ELLIPSIS up:V_INTEGER {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value, :upper => up.value)
+ end
+ }
+ / V_INTEGER '' {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => V_INTEGER.value, :upper => V_INTEGER.value)
+ end
+ }
+ end
+
+ rule c_cardinality
+ SYM_CARDINALITY SYM_MATCHES SYM_START_CBLOCK cardinality_spec SYM_END_CBLOCK space {
+ def value
+ cardinality_spec.value
+ end
+ }
+ end
+
+ rule cardinality_spec
+ occurrence_spec ';' white_space SYM_ORDERED ';' white_space SYM_UNIQUE {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_unique => true,
+ :is_orderd => true)
+ end
+ }
+ / occurrence_spec ';' white_space SYM_ORDERED {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_orderd => true)
+ end
+ }
+ / occurrence_spec ';' white_space SYM_UNORDERD ';' white_space SYM_UNIQUE {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_unique => true,
+ :is_orderd => false)
+ end
+ }
+ / occurrence_spec ';' white_space SYM_UNORDERD {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_orderd => false)
+ end
+ }
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_ORDERED {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_unique => true,
+ :is_orderd => true)
+ end
+ }
+ / occurrence_spec SYM_UNIQUE ';' white_space SYM_UNORDERD {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_unique => true,
+ :is_ordered => false)
+ end
+ }
+ / occurrence_spec SYM_UNIQUE {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value,
+ :is_unique => true)
+ end
+ }
+ / occurrence_spec space {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Cardinality.new(
+ :interval => occurrence_spec.value)
+ end
+ }
+ end
+
+ rule c_occurrences
+ SYM_OCCURRENCES SYM_MATCHES SYM_START_CBLOCK occurrence_spec SYM_END_CBLOCK space {
+ def value
+ occurrence_spec.value
+ end
+ }
+ end
+
+ rule occurrence_spec
+ st:integer_value SYM_ELLIPSIS ed:cardinality_limit_value {
+ def value
+ if ed.value == '*'
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => st.value)
+ else
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => st.value,
+ :upper => ed.value)
+ end
+ end
+ }
+ / cardinality_limit_value '' {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => cardinality_limit_value.value,
+ :upper => cardinality_limit_value.value)
+ end
+ }
+ end
+
+ rule cardinality_limit_value
+ integer_value '' {
+ def value
+ text_value.to_i
+ end
+ }
+ / '*' {
+ def value
+ '*'
+ end
+ }
+ end
+
+ rule c_integer
+ c_integer_spec ';' white_space integer_value {
+ def value
+ args = c_integer_spec.value
+ args[:assumed_value] = integer_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(args)
+ end
+ }
+ / c_integer_spec '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CInteger.new(
+ c_integer_spec.value)
+ end
+ }
+ end
+
+ rule c_integer_spec
+ integer_list_value '' {
+ def value
+ {:list => integer_list_value.value}
+ end
+ }
+ / integer_interval_value '' {
+ def value
+ {:range => integer_interval_value.value}
+ end
+ }
+ / integer_value !'..' '' {
+ def value
+ {:list => [integer_value.value]}
+ end
+ }
+ / occurrence_spec '' {
+ def value
+ {:range => occurrence_spec.value}
+ end
+ }
+ end
+
+ rule c_real_spec
+ real_list_value '' {
+ def value
+ {:list => real_list_value.value}
+ end
+ }
+ / real_interval_value '' {
+ def value
+ {:range => real_interval_value.value}
+ end
+ }
+ / real_value '' {
+ def value
+ {:list => [real_value.value]}
+ end
+ }
+ end
+
+ rule c_real
+ c_real_spec ';' white_space real_value {
+ def value
+ args = c_real_spec.value
+ args[:assumed_value] = real_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(args)
+ end
+ }
+ / c_real_spec '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CReal.new(
+ c_real_spec.value)
+ end
+ }
+ end
+
+ rule c_date_constraint
+ date_interval_value '' {
+ def value
+ {:range => date_interval_value.value}
+ end
+ }
+ / date_list_value '' {
+ def value
+ {:list => date_list_value.value}
+ end
+ }
+ / date_value '' {
+ def value
+ {:list => [date_value.value]}
+ end
+ }
+ / con:V_ISO8601_DATE_CONSTRAINT_PATTERN '' {
+ def value
+ {:pattern => con.text_value}
+ end
+ }
+ end
+
+ rule c_date
+ c_date_constraint ';' white_space date_value {
+ def value
+ args = c_date_constraint.value
+ args[:assumed_value] = date_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
+ args)
+ end
+ }
+ / c_date_constraint '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDate.new(
+ c_date_constraint.value)
+ end
+ }
+ end
+
+ rule c_time_constraint
+ time_interval_value '' {
+ def value
+ {:range => time_interval_value.value}
+ end
+ }
+ / time_list_value '' {
+ def value
+ {:list => time_list_value.value}
+ end
+ }
+ / time_value '' {
+ def value
+ {:list => [time_value.value]}
+ end
+ }
+ / tc:V_ISO8601_TIME_CONSTRAINT_PATTERN '' {
+ def value
+ {:pattern => tc.text_value}
+ end
+ }
+ end
+
+ rule c_time
+ c_time_constraint ';' white_space time_value {
+ def value
+ args = c_time_constraint.value
+ args[:assumed_value] = time_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
+ args)
+ end
+ }
+ / c_time_constraint '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CTime.new(
+ c_time_constraint.value)
+ end
+ }
+ end
+
+ rule c_date_time_constraint
+ date_time_interval_value '' {
+ def value
+ {:range => date_time_interval_value.value}
+ end
+ }
+ / date_time_value '' {
+ def value
+ {:list => [date_time_value.value]}
+ end
+ }
+ / dtc:V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN '' {
+ def value
+ {:pattern => dtc.text_value}
+ end
+ }
+ end
+
+ rule c_date_time
+ c_date_time_constraint ';' white_space date_time_value {
+ def value
+ args = c_date_time_constraint.value
+ args[:assumed_value] = date_time_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
+ args)
+ end
+ }
+ / c_date_time_constraint '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDateTime.new(
+ c_date_time_constraint.value)
+ end
+ }
+ end
+
+ rule c_duration_constraint
+ duration_pattern '/' duration_interval_value '' {
+ def value
+ {:pattern => duration_pattern.value}
+ end
+ }
+ / duration_pattern '' {
+ def value
+ {:pattern => duration_pattern.value}
+ end
+ }
+ / duration_interval_value '' {
+ def value
+ {:range => duration_interval_value.value}
+ end
+ }
+ / duration_value '' {
+ def value
+ {:list => [duration_value.value]}
+ end
+ }
+ end
+
+ rule duration_pattern
+ dp:V_ISO8601_DURATION_CONSTRAINT_PATTERN '' {
+ def value
+ dp.text_value
+ end
+ }
+ end
+
+ rule c_duration
+ c_duration_constraint ';' white_space duration_value '' {
+ def value
+ args = c_duration_constraint.value
+ args[:assumed_value] = duration_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
+ args)
+ end
+ }
+ / c_duration_constraint '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CDuration.new(
+ c_duration_constraint.value)
+ end
+ }
+ end
+
+ rule c_string_spec
+ string_list_value ',' white_space SYM_LIST_CONTINUE {
+ def value
+ {:list => string_list_value.value}
+ end
+ }
+ / string_list_value '' {
+ def value
+ {:list => string_list_value.value}
+ end
+ }
+ / pat:V_REGEXP '' {
+ def value
+ {:pattern => pat.value}
+ end
+ }
+ / str:V_STRING '' {
+ def value
+ {:list => [str.value]}
+ end
+ }
+ end
+
+ rule c_string
+ c_string_spec white_space ';' white_space string_value {
+ def value
+ args = c_string_spec.value
+ args[:assumed_value] = string_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
+ args)
+ end
+ }
+ / c_string_spec '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CString.new(
+ c_string_spec.value)
+ end
+ }
+ end
+
+ rule c_boolean_spec
+ SYM_TRUE ',' white_space SYM_FALSE {
+ def value
+ {:true_valid => true, :false_valid => true}
+ end
+ }
+ / SYM_TRUE white_space '' {
+ def value
+ {:true_valid => true, :false_valid => false}
+ end
+ }
+ / SYM_FALSE white_space ',' white_space SYM_TRUE {
+ def value
+ {:true_valid => true, :false_valid => true}
+ end
+ }
+ / SYM_FALSE white_space '' {
+ def value
+ {:false_valid => true, :true_valid => false}
+ end
+ }
+ end
+
+ rule c_boolean
+ c_boolean_spec ';' white_space boolean_value {
+ def value
+ args = c_boolean_spec.value
+ args[:assumed_value] = boolean_value.value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
+ args)
+ end
+ }
+ / c_boolean_spec '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::Primitive::CBoolean.new(
+ c_boolean_spec.value)
+ end
+ }
+ end
+
+ rule constraint_ref
+ vltcr:V_LOCAL_TERM_CODE_REF '' {
+ def value(node)
+ OpenEHR::AM::Archetype::ConstraintModel::ConstraintRef.new(
+ :path => node.path,
+ :rm_type_name => 'ConstraintRef',
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(:upper => 1, :lower => 1),
+ :reference => vltcr.value)
+ end
+ }
+ end
+
+ rule V_REGEXP
+ (('=' / '!') '~')? (('/' ('\/' / !'/' .)* '/') / ('^' (!'^' .)* '^') ) {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule code_string
+ NAMECHAR+ '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule code_string_list
+ first:code_string more:(',' space code_string)+ space {
+ def value
+ codes.map {|c| c.value}
+ end
+
+ def codes
+ [first] + more.elements.map {|e| e.code_string}
+ end
+ }
+ end
+
+ rule code_string_spec
+ code_string_list '' {
+ def value
+ code_string_list.value
+ end
+ }
+ / code_string '' {
+ def value
+ [code_string.value]
+ end
+ }
+ end
+
+ rule c_code_phrase
+ ti:V_TERM_CODE code_string_spec ';' space code_string ']' space {
+ def value(node)
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
+ :rm_type_name => 'CodePhrase',
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1),
+ :terminology_id => ti.value, :code_list => code_string_spec.value,
+ :assumed_value => code_string.value,
+ :path => node.path)
+ end
+ }
+ / ti:V_TERM_CODE code_string_spec ']' space {
+ def value(node)
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
+ :rm_type_name => 'CodePhrase',
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1),
+ :terminology_id => ti.value, :code_list => code_string_spec.value,
+ :path => node.path)
+ end
+ }
+ / ti:V_TERM_CODE ']' space {
+ def value(node)
+ ::OpenEHR::AM::OpenEHRProfile::DataTypes::Text::CCodePhrase.new(
+ :rm_type_name => 'CodePhrase',
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1),
+ :terminology_id => ti.value, :code_list => [], :path => node.path)
+ end
+ }
+ end
+
+ rule SYM_C_DV_ORDINAL
+ 'C_DV_ORDINAL' space
+ end
+
+ rule c_ordinal
+ c_ordinal_spec ';' space integer_value space {
+ def value
+ args = c_ordinal_spec.value
+ args[:assumed_value] = integer_value.value
+ args
+ end
+ }
+ / c_ordinal_spec space '' {
+ def value
+ c_ordinal_spec.value
+ end
+ }
+ / SYM_C_DV_ORDINAL SYM_LT white_space SYM_GT space {
+ def value
+ {:list => nil}
+ end
+ }
+ end
+
+ rule c_ordinal_spec
+ ordinal_list '' {
+ def value
+ {:list => ordinal_list.value}
+ end
+ }
+ / ordinal '' {
+ def value
+ {:list => [ordinal.value]}
+ end
+ }
+ end
+
+ rule ordinal_list
+ first:ordinal more:(',' space ordinal)+ {
+ def value
+ ordinals.map {|o| o.value}
+ end
+
+ def ordinals
+ [first] + more.elements.map {|e| e.ordinal}
+ end
+ }
+ end
+
+ rule ordinal
+ integer_value SYM_INTERVAL_DELIM vqtc:V_QUALIFIED_TERM_CODE_REF !SYM_INTERVAL_DELIM '' {
+ def value
+ symbol = ::OpenEHR::RM::DataTypes::Text::DvCodedText.new(
+ :value => vqtc.text_value, :defining_code => vqtc.value)
+ ::OpenEHR::RM::DataTypes::Quantity::DvOrdinal.new(
+ :value => integer_value.value,
+ :symbol => symbol)
+ end
+ }
+ end
+
+ rule c_dv_quantity
+ SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ prop:property? ql:quantity_list? aqv:assumed_quantity_value?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ prop:property? aqv:assumed_quantity_value? ql:quantity_list?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ aqv:assumed_quantity_value? prop:property? ql:quantity_list?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ aqv:assumed_quantity_value? ql:quantity_list? prop:property?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ ql:quantity_list? aqv:assumed_quantity_value? prop:property?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ / SYM_C_DV_QUANTITY SYM_START_DBLOCK
+ ql:quantity_list? prop:property? aqv:assumed_quantity_value?
+ SYM_END_DBLOCK <CDvQuantityItems>
+ end
+
+ rule SYM_C_DV_QUANTITY
+ 'C_DV_QUANTITY' space
+ end
+
+ rule property
+ SYM_PROPERTY SYM_EQ SYM_START_DBLOCK
+ prop:V_QUALIFIED_TERM_CODE_REF SYM_END_DBLOCK {
+ def value
+ prop.value
+ end
+ }
+ end
+
+ rule SYM_PROPERTY
+ 'property' space
+ end
+
+ rule quantity_list
+ SYM_QUANTITY_LIST SYM_EQ SYM_START_DBLOCK
+ c_quantity_items SYM_END_DBLOCK {
+ def value(node)
+ c_quantity_items.value(node)
+ end
+ }
+ end
+
+ rule assumed_quantity_value
+ SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ SYM_END_DBLOCK <AssumedValueItems>
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ SYM_END_DBLOCK <AssumedValueItems>
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ SYM_END_DBLOCK <AssumedValueItems>
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ SYM_END_DBLOCK <AssumedValueItems>
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ SYM_END_DBLOCK <AssumedValueItems>
+ / SYM_ASSUMED_VALUE SYM_EQ SYM_START_DBLOCK
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK val:real_value SYM_END_DBLOCK)?
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK val:integer_value SYM_END_DBLOCK)?
+ SYM_END_DBLOCK <AssumedValueItems>
+ end
+
+ rule SYM_QUANTITY_LIST
+ 'list' space
+ end
+
+ rule c_quantity_items
+ c_quantity_item more_cdv:(c_quantity_item white_space)* {
+ def value(node)
+ quantities.map {|q| q.value(node)}
+ end
+
+ def quantities
+ [c_quantity_item] + more_cdv.elements.map {|e| e.c_quantity_item}
+ end
+ }
+ end
+
+ rule c_quantity_item
+ '[' V_STRING ']' white_space SYM_EQ SYM_START_DBLOCK
+ SYM_UNITS SYM_EQ SYM_START_DBLOCK units:V_STRING SYM_END_DBLOCK
+ mag:(SYM_MAGNITUDE SYM_EQ SYM_START_DBLOCK int:real_interval_value SYM_END_DBLOCK)?
+ prec:(SYM_PRECISION SYM_EQ SYM_START_DBLOCK int:integer_interval_value SYM_END_DBLOCK)?
+ SYM_END_DBLOCK {
+ def value(node)
+ magnitude, precision = nil
+ magnitude = mag.int.value unless mag.empty?
+ precision = prec.int.value unless prec.empty?
+ OpenEHR::AM::OpenEHRProfile::DataTypes::Quantity::CQuantityItem.new(
+ :path => node.path, :rm_type_name => 'DvQuantity',
+ :occurrences => OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => 1, :lower => 1),
+ :units => units.value,
+ :magnitude => magnitude, :precision => precision)
+ end
+ }
+ end
+
+ rule SYM_UNITS
+ 'units' space
+ end
+
+ rule SYM_MAGNITUDE
+ 'magnitude' space
+ end
+
+ rule SYM_PRECISION
+ 'precision' space
+ end
+
+ rule SYM_ASSUMED_VALUE
+ 'assumed_value' space
+ end
+
+ rule V_C_DOMAIN_TYPE
+ '('? [A-Z] IDCHAR* ')'? [ \n]* '<' [^>]* '>'
+ end
+
+# assertion block
+
+ rule V_ASSERTION_TEXT
+ assertions '' {
+ def value
+ assertions.value
+ end
+ }
+ end
+
+ rule assertions
+ assertion more_a:(assertion '')* {
+ def value
+ assertions.map {|a| a.value}
+ end
+
+ def assertions
+ [assertion] + more_a.elements.map {|a| a.assertion}
+ end
+ }
+ end
+
+ rule assertion
+ id:(any_identifier ':')? boolean_expression space {
+ def value
+ if (id && !id.empty?)
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
+ :tag => id.value, :expression => boolean_expression.value,
+ :string_expression => id.text_value + boolean_expression.text_value)
+ else
+ OpenEHR::AM::Archetype::Assertion::Assertion.new(
+ :expression => boolean_expression.value,
+ :string_expression => boolean_expression.text_value)
+ end
+ end
+ }
+ end
+
+ rule boolean_expression
+ boolean_node '' {
+ def value
+ boolean_node.value
+ end
+ }
+ / boolean_leaf '' {
+ def value
+ boolean_leaf.value
+ end
+ }
+ end
+
+ rule boolean_node
+ SYM_EXISTS absolute_path {
+ def value
+ item = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
+ :type => 'String',
+ :item => absolute_path.value,
+ :reference_type => 'CONSTANT')
+ OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXISTS,
+ :operand => item,
+ :precedence_overridden => false)
+ end
+ }
+ / relative_path white_space SYM_MATCHES SYM_START_CBLOCK c_primitive SYM_END_CBLOCK {
+ def value
+ left_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
+ :type => 'String',
+ :item => relative_path.value,
+ :reference_type => 'Constant')
+ right_op = OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
+ :item => c_primitive.value,
+ :type => c_primitive.value.type,
+ :reference_type => 'Constant')
+ op = OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MATCHES
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => op,
+ :right_operand => right_op,
+ :left_operand => left_op,
+ :reference_type => 'Constraint')
+ end
+ }
+ / SYM_NOT boolean_leaf '' {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprUnaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NOT,
+ :operand => boolean_leaf.value,
+ :precedence_overridden => false)
+ end
+ }
+ / arithmetic_leaf SYM_EQ arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EQ,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf SYM_NE arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_NE,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf SYM_LT arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LT,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf SYM_GT arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GT,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf SYM_LE arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_LE,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf SYM_GE arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_GE,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / boolean_leaf SYM_AND boolean_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_AND,
+ :left_operand => boolean_leaf.value,
+ :right_operand => boolean_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / boolean_leaf SYM_OR boolean_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_OR,
+ :left_operand => boolean_leaf.value,
+ :right_operand => boolean_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / boolean_leaf SYM_XOR boolean_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_XOR,
+ :left_operand => boolean_leaf.value,
+ :right_operand => boolean_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / boolean_leaf SYM_IMPLIES boolean_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_IMPLIES,
+ :left_operand => boolean_leaf.value,
+ :right_operand => boolean_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ end
+
+ rule boolean_leaf
+ '(' boolean_expression ')' {
+ def value
+ boolean_expression.value
+ end
+ }
+ / SYM_TRUE '' {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
+ :type => 'Boolean',
+ :item => true,
+ :reference_type => 'CONSTANT')
+ end
+ }
+ / SYM_FALSE '' {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprLeaf.new(
+ :type => 'Boolean',
+ :item => false,
+ :reference_type => 'CONSTANT')
+ end
+ }
+ end
+
+ rule arithmetic_expression
+ arithmetic_node '' {
+ def value
+ arithmetic_node.value
+ end
+ }
+ / arithmetic_leaf '' {
+ def value
+ arithmetic_leaf.value
+ end
+ }
+ end
+
+ rule arithmetic_node
+ arithmetic_leaf '+' arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_PLUS,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf '-' arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MINUS,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf '*' arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_MULTIPLY,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf '/' arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_DIVIDE,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ / arithmetic_leaf '^' arithmetic_expression {
+ def value
+ OpenEHR::AM::Archetype::Assertion::ExprBinaryOperator.new(
+ :type => 'Boolean',
+ :operator => OpenEHR::AM::Archetype::Assertion::OperatorKind::OP_EXP,
+ :left_operand => arithmetic_leaf.value,
+ :right_operand => arithmetic_expression.value,
+ :reference_type => 'Constraint')
+ end
+ }
+ end
+
+ rule arithmetic_leaf
+ '(' arithmetic_expression ')' space {
+ def value
+ arithmetic_expression.value
+ end
+ }
+ / integer_value '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
+ :type => 'Integer',
+ :item => integer_value.value,
+ :reference_type => 'CONSTANT')
+ end
+ }
+ / real_value '' {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
+ :type => 'Real',
+ :item => real_value.value,
+ :reference_type => 'CONSTANT')
+ end
+ }
+ / absolute_path space {
+ def value
+ OpenEHR::AM::Archetype::ConstraintModel::ExprLeaf.new(
+ :type => 'String',
+ :item => absolute_path.value,
+ :reference_type => 'CONSTANT')
+
+ end
+ }
+ end
+
+# path block
+ rule object_path
+ movable_path '' {
+ def value
+ movable_path.value
+ end
+ }
+ / absolute_path '' {
+ def value
+ absolute_path.value
+ end
+ }
+ / relative_path '' {
+ def value
+ relative_path.value
+ end
+ }
+ end
+
+ rule movable_path
+ SYM_MOVABLE_LEADER relative_path '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule absolute_path
+ '/' relative_path? '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule relative_path
+ path_segment ('/' path_segment)* '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule path_segment
+ V_ATTRIBUTE_IDENTIFIER V_LOCAL_TERM_CODE_REF? '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule SYM_MOVABLE_LEADER
+ '//'
+ end # of cADL grammar
+
+# biginning of dADL grammar
+
+ rule V_DADL_TEXT
+ attr_vals space {
+ def value
+ attr_vals.value
+ end
+ }
+ / complex_object_block space {
+ def value
+ complex_object_block.value
+ end
+ }
+ end
+
+ rule attr_vals
+ first:attr_val second:(';'? space attr_val space)* {
+ def value
+ attrs.inject({ }) {|val, a| val.update a.value}
+ end
+
+ def attrs
+ [first] + second.elements.map {|e| e.attr_val}
+ end
+ }
+ end
+
+ rule attr_val
+ attr_id SYM_EQ object_block {
+ def value
+ {attr_id.value => object_block.value}
+ end
+ }
+ end
+
+ rule attr_id
+ id:V_ATTRIBUTE_IDENTIFIER white_space {
+ def value
+ id.value
+ end
+ }
+ end
+
+ rule object_block
+ complex_object_block space {
+ def value
+ complex_object_block.value
+ end
+ }
+ / primitive_object_block space {
+ def value
+ primitive_object_block.value
+ end
+ }
+ end
+
+ rule complex_object_block
+ single_attr_object_block '' {
+ def value
+ single_attr_object_block.value
+ end
+ }
+ / multiple_attr_object_block '' {
+ def value
+ multiple_attr_object_block.value
+ end
+ }
+ end
+
+ rule multiple_attr_object_block
+ type_identifier? untyped_multiple_attr_object_block {
+ def value
+ untyped_multiple_attr_object_block.value
+ end
+ }
+ end
+
+ rule untyped_multiple_attr_object_block
+ multiple_attr_object_block_head keyed_objects SYM_END_DBLOCK {
+ def value
+ keyed_objects.value
+ end
+ }
+ end
+
+ rule multiple_attr_object_block_head
+ SYM_START_DBLOCK
+ end
+
+ rule keyed_objects
+ keyed_object+ {
+ def value
+ elements.inject({ }) {|val, e| val.update e.value}
+ end
+ }
+ end
+
+ rule keyed_object
+ object_key SYM_EQ object_block {
+ def value
+ {object_key.value => object_block.value}
+ end
+ }
+ end
+
+ rule object_key
+ '[' simple_value ']' white_space {
+ def value
+ simple_value.value
+ end
+ }
+ end
+
+ rule single_attr_object_block
+ type_identifier? untyped_single_attr_object_block {
+ def value
+ untyped_single_attr_object_block.value
+ end
+ }
+ end
+
+ rule untyped_single_attr_object_block
+ single_attr_object_complex_head attr_vals SYM_END_DBLOCK {
+ def value
+ elements[1].value
+ end
+ }
+ / single_attr_object_complex_head SYM_END_DBLOCK {
+ def value
+ nil
+ end
+ }
+ end
+
+ rule single_attr_object_complex_head
+ SYM_START_DBLOCK
+ end
+
+ rule primitive_object_block
+ type_identifier? untyped_primitive_object_block {
+ def value
+ untyped_primitive_object_block.value
+ end
+ }
+ end
+
+ rule untyped_primitive_object_block
+ SYM_START_DBLOCK primitive_object_value SYM_END_DBLOCK {
+ def value
+ primitive_object_value.value
+ end
+ }
+ end
+
+ rule primitive_object_value
+ term_code_list_value '' {
+ def value
+ term_code_list_value.value
+ end
+ }
+ / term_code '' {
+ def value
+ term_code.value
+ end
+ }
+ / simple_list_value '' {
+ def value
+ simple_list_value.value
+ end
+ }
+ / simple_interval_value '' {
+ def value
+ simple_interval_value.value
+ end
+ }
+ / simple_value '' {
+ def value
+ simple_value.value
+ end
+ }
+ end
+
+ rule simple_value
+ integer_value '' {
+ def value
+ integer_value.value
+ end
+ }
+ / real_value '' {
+ def value
+ real_value.value
+ end
+ }
+ / boolean_value '' {
+ def value
+ boolean_value.value
+ end
+ }
+ / uri_value '' {
+ def value
+ uri_value.value
+ end
+ }
+ / date_value '' {
+ def value
+ date_value.value
+ end
+ }
+ / time_value '' {
+ def value
+ time_value.value
+ end
+ }
+ / date_time_value '' {
+ def value
+ date_time_value.value
+ end
+ }
+ / duration_value '' {
+ def value
+ duration_value.value
+ end
+ }
+ / string_value '' {
+ def value
+ string_value.value
+ end
+ }
+ / character_value '' {
+ def value
+ character_value.value
+ end
+ }
+ end
+
+ rule simple_list_value
+ integer_list_value '' {
+ def value
+ integer_list_value.value
+ end
+ }
+ / real_list_value '' {
+ def value
+ real_list_value.value
+ end
+ }
+ / boolean_list_value '' {
+ def value
+ boolean_list_value.value
+ end
+ }
+ / character_list_value '' {
+ def value
+ character_list_value.value
+ end
+ }
+ / date_list_value '' {
+ def value
+ date_list_value.value
+ end
+ }
+ / time_list_value '' {
+ def value
+ time_list_value.value
+ end
+ }
+ / date_time_list_value '' {
+ def value
+ date_time_list_value.value
+ end
+ }
+ / duration_list_value '' {
+ def value
+ duration_list_value.value
+ end
+ }
+ / string_list_value '' {
+ def value
+ string_list_value.value
+ end
+ }
+ end
+
+ rule simple_interval_value
+ integer_interval_value '' {
+ def value
+ integer_interval_value.value
+ end
+ }
+ / real_interval_value '' {
+ def value
+ real_interval_value.value
+ end
+ }
+ / date_interval_value '' {
+ def value
+ date_interval_value.value
+ end
+ }
+ / time_interval_value '' {
+ def value
+ time_interval_value.value
+ end
+ }
+ / date_time_interval_value '' {
+ def value
+ date_time_interval_value.value
+ end
+ }
+ / duration_interval_value '' {
+ def value
+ duration_interval_value.value
+ end
+ }
+ end
+
+ rule term_code
+ vtref:V_QUALIFIED_TERM_CODE_REF '' {
+ def value
+ vtref.value
+ end
+ }
+ end
+
+ rule term_code_list_value
+ first:term_code more:(',' term_code)+ {
+ def value
+ term_codes.map {|t| t.value}
+ end
+
+ def term_codes
+ [first] + more.elements.map {|e| e.term_code}
+ end
+ }
+ / term_code ',' SYM_LIST_CONTINUE {
+ def value
+ [term_code.value]
+ end
+ }
+ end
+
+ rule uri_value
+ uri:V_URI '' {
+ def value
+ uri.value
+ end
+ }
+ end # of dADL grammar
+
+# beginning of shared token section
+
+ rule any_identifier
+ type_identifier '' {
+ def value
+ type_identifier.value
+ end
+ }
+ / V_ATTRIBUTE_IDENTIFIER '' {
+ def value
+ V_ATTRIBUTE_IDENTIFIER.value
+ end
+ }
+ end
+
+ rule type_identifier
+ '(' id:V_GENERIC_TYPE_IDENTIFIER ')' white_space {
+ def value
+ id.value
+ end
+ }
+ / id:V_GENERIC_TYPE_IDENTIFIER white_space {
+ def value
+ id.value
+ end
+ }
+ / '(' id:V_TYPE_IDENTIFIER ')' white_space {
+ def value
+ id.value
+ end
+ }
+ / id:V_TYPE_IDENTIFIER white_space {
+ def value
+ id.value
+ end
+ }
+ end
+
+ rule boolean_value
+ SYM_TRUE {
+ def value
+ true
+ end
+ }
+ / SYM_FALSE {
+ def value
+ false
+ end
+ }
+ end
+
+ rule boolean_list_value
+ boolean_value (',' white_space more_bool:(boolean_value ''))+ {
+ def value
+ booelans.map {|b| b.value}
+ end
+
+ def booleans
+ [boolean_value] + more_bool.elements.map { |b| b.boolean_value }
+ end
+ }
+ / boolean_value white_space SYM_LIST_CONTINUE {
+ def value
+ [boolean_value.value]
+ end
+ }
+ end
+
+ rule integer_value
+ [+-]? V_INTEGER '' {
+ def value
+ text_value.to_i
+ end
+ }
+ end
+
+ rule integer_list_value
+ integer_value more_i:(',' white_space integer_value)+ {
+ def value
+ integers.map { |i| i.value }
+ end
+
+ def integers
+ [integer_value] + more_i.elements.map { |i| i.integer_value }
+ end
+ }
+ / integer_value ',' white_space SYM_LIST_CONTINUE {
+ def value
+ [integer_value.value]
+ end
+ }
+ end
+
+ rule integer_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_ELLIPSIS SYM_LT up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_ELLIPSIS up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:integer_value SYM_ELLIPSIS SYM_LT up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:integer_value SYM_ELLIPSIS up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE iv:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => iv.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:integer_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule real_value
+ ('+' / '-')? V_REAL {
+ def value
+ text_value.to_f
+ end
+ }
+ end
+
+ rule real_list_value
+ real_value more_i:(',' white_space real_value)* {
+ def value
+ reals.map { |i| i.value }
+ end
+
+ def reals
+ [real_value] + more_i.elements.map { |i| i.real_value }
+ end
+ }
+ / real_value ',' white_space SYM_LIST_CONTINUE {
+ def value
+ [real_value.value]
+ end
+ }
+ end
+
+ rule real_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_ELLIPSIS SYM_LT up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_ELLIPSIS up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:real_value SYM_ELLIPSIS SYM_LT up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:real_value SYM_ELLIPSIS up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE lo:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:real_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule character_value
+ V_CHAR '' {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule character_list_value
+ character_value (',' white_space more_chars:(character_value))+ {
+ def value
+ characters.map {|c| c.value }
+ end
+
+ def characters
+ [character_value] + more_chars.elements.map {|c| c.character_value}
+ end
+ }
+ / character_value ',' SYM_LIST_CONTINUE {
+ def value
+ [character_value.value]
+ end
+ }
+ end
+
+ rule string_value
+ str:V_STRING '' {
+ def value
+ str.value
+ end
+ }
+ end
+
+ rule string_list_value
+ first:string_value second:(',' white_space string_value)+ {
+ def value
+ strings.map {|s| s.value}
+ end
+
+ def strings
+ [first] + second.elements.map {|s| s.string_value}
+ end
+ }
+ / str:V_STRING ',' white_space SYM_LIST_CONTINUE {
+ def value
+ [str.value]
+ end
+ }
+ end
+
+ rule date_value
+ ed:V_ISO8601_EXTENDED_DATE '' {
+ def value
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDate.new(
+ :value => ed.text_value)
+ end
+ }
+ end
+
+ rule date_list_value
+ date_value more_dates:(',' white_space date_value)+ {
+ def value
+ dates.map {|d| d.value}
+ end
+
+ def dates
+ [date_value] + more_dates.elements.map {|d| d.date_value}
+ end
+ }
+ / date_value ',' white_space SYM_LIST_CONTINUE {
+ def value
+ [date_value.value]
+ end
+ }
+ end
+
+ rule date_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_ELLIPSIS SYM_LT up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_ELLIPSIS up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:date_value SYM_ELLIPSIS SYM_LT up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:date_value SYM_ELLIPSIS up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE val:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:date_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule time_value
+ ti:V_ISO8601_EXTENDED_TIME '' {
+ def value
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvTime.new(
+ :value => ti.text_value)
+ end
+ }
+ end
+
+ rule time_list_value
+ time_value more_t:(',' white_space time_value)+ {
+ def value
+ times.map {|t| t.value}
+ end
+
+ def times
+ [time_value] + more_t.elements.map {|t| t.time_value}
+ end
+ }
+ / time_value ',' white_space SYM_LIST_CONTINUE {
+ def value
+ [time_value.value]
+ end
+ }
+ end
+
+ rule time_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_ELLIPSIS SYM_LT up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_ELLIPSIS up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:time_value SYM_ELLIPSIS SYM_LT up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:time_value SYM_ELLIPSIS up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE tv:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => tv.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule date_time_value
+ dt:V_ISO8601_EXTENDED_DATE_TIME '' {
+ def value
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDateTime.new(
+ :value => dt.text_value)
+ end
+ }
+ end
+
+ rule date_time_list_value
+ date_time_value (',' more_dt:date_time_value)+ {
+ def value
+ date_times.map {|t| t.value}
+ end
+
+ def date_times
+ [date_time_value] + more_dt.elements.map {|dt| dt.date_time_value}
+ end
+ }
+ / date_time_value ',' SYM_LIST_CONTINUE {
+ def value
+ [date_time_value.value]
+ end
+ }
+ end
+
+ rule date_time_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_ELLIPSIS SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_ELLIPSIS up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:date_time_value SYM_ELLIPSIS SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:date_time_value SYM_ELLIPSIS up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE dt:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => dt.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:date_time_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule duration_value
+ du:V_ISO8601_DURATION '' {
+ def value
+ ::OpenEHR::RM::DataTypes::Quantity::DateTime::DvDuration.new(
+ :value => du.text_value)
+ end
+ }
+ end
+
+ rule duration_list_value
+ duration_value more_d:(',' duration_value)+ {
+ def value
+ durations.map {|d| d.value}
+ end
+
+ def durations
+ [duration_value] + more_d.elements.map {|d| d.duration_value}
+ end
+ }
+ / duration_value ',' SYM_LIST_CONTINUE {
+ def value
+ [duration_value.value]
+ end
+ }
+ end
+
+ rule duration_interval_value
+ SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_ELLIPSIS SYM_LT up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_ELLIPSIS up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => false,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:duration_value SYM_ELLIPSIS SYM_LT up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM lo:duration_value SYM_ELLIPSIS up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(:lower => lo.value,
+ :upper => up.value,
+ :lower_included => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LT up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_LE up:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => up.value,
+ :lower_unbounded => true,
+ :upper_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GT lo:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => lo.value,
+ :uppper_unbounded => true,
+ :lower_included => false)
+ end
+ }
+ / SYM_INTERVAL_DELIM SYM_GE val:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :lower => val.value,
+ :upper_unbounded => true,
+ :lower_included => true)
+ end
+ }
+ / SYM_INTERVAL_DELIM val:duration_value SYM_INTERVAL_DELIM {
+ def value
+ OpenEHR::AssumedLibraryTypes::Interval.new(
+ :upper => val.value,
+ :lower => val.value,
+ :upper_included => true,
+ :lower_included => true)
+ end
+ }
+ end
+
+ rule ALPHANUM
+ [a-zA-Z0-9]
+ end
+
+ rule IDCHAR
+ [a-zA-Z0-9_]
+ end
+
+ rule NAMECHAR
+ [a-zA-Z0-9\._\-]
+ end
+
+ rule NAMECHAR_SPACE
+ [a-zA-Z0-9\._\- ]
+ end
+
+ rule NAMECHAR_PAREN
+ [a-zA-Z0-9\._\-\(\)]
+ end
+
+ rule NAMESTR
+ [a-zA-Z] [a-zA-Z0-9_]+
+ end
+
+ rule space
+ COMMENT* white_space
+ end
+
+ rule COMMENT
+ white_space '--' [^\n]* "\n"
+ end
+
+ rule white_space
+ [ \t\r\n]*
+ end
+
+ rule Minus_code
+ '-'
+ end
+
+ rule Plus_Code
+ '+'
+ end
+
+ rule Star_code
+ '*'
+ end
+
+ rule Slash_code
+ '/'
+ end
+
+ rule Carret_code
+ '^'
+ end
+
+ rule Dot_code
+ '.'
+ end
+
+ rule Semicolon_code
+ ';'
+ end
+
+ rule Colon_code
+ ':'
+ end
+
+ rule Comma_code
+ ','
+ end
+
+ rule Expclamation_code
+ '!'
+ end
+
+ rule Left_parenthesis_code
+ '('
+ end
+
+ rule Right_parenthesis_code
+ ')'
+ end
+
+ rule Dollar_code
+ '$'
+ end
+
+ rule SYM_DT_UNKNOWN
+ '??'
+ end
+
+ rule Question_mark_code
+ '?'
+ end
+
+ rule SYM_INTERVAL_DELIM
+ '|'
+ end
+
+ rule Left_bracket_code
+ '[' space
+ end
+
+ rule Right_bracket_codde
+ ']'
+ end
+
+ rule SYM_EQ
+ '=' white_space
+ end
+
+ rule SYM_GE
+ ('=>' / '>=') white_space
+ end
+
+ rule SYM_LE
+ ('<=' / '=>') white_space
+ end
+
+ rule SYM_LT
+ '<' white_space
+ end
+
+ rule SYM_GT
+ '>' white_space
+ end
+
+ rule SYM_START_DBLOCK
+ '<' space
+ end
+
+ rule SYM_END_DBLOCK
+ '>' space
+ end
+
+ rule SYM_START_CBLOCK
+ '{' space
+ end
+
+ rule SYM_END_CBLOCK
+ '}'
+ end
+
+ rule SYM_ELLIPSIS
+ '..'
+ end
+
+ rule SYM_LIST_CONTINUE
+ '...'
+ end
+
+ rule SYM_INFINITY
+ [Ii] [Nn] [Ff] [Ii] [Nn] [Ii] [Tt] [Yy] space
+ end
+
+ rule SYM_ARCHETYPE
+ [Aa] [Rr] [Cc] [Hh] [Ee] [Tt] [Yy] [Pp] [Ee] space
+ end
+
+ rule SYM_MATCHES
+ ([Mm] [Aa] [Tt] [Cc] [Hh] [Ee] [Ss] / [Ii] [Ss] '_' [Ii] [Nn]) white_space
+ end
+
+ rule SYM_THEN
+ [Tt] [Hh] [Ee] [Nn] space
+ end
+
+ rule SYM_ELSE
+ [Ee] [Ll] [Ss] [Ee] space
+ end
+
+ rule SYM_AND
+ [Aa] [Nn] [Dd] space
+ end
+
+ rule SYM_OR
+ [Oo] [Rr] space
+ end
+
+ rule SYM_XOR
+ [Xx] [Oo] [Rr] space
+ end
+
+ rule SYM_NOT
+ [Nn] [Oo] [Tt] space
+ end
+
+ rule SYM_IMPLIES
+ [Ii] [Mm] [Pp] [Ll] [Ii] [Ee] [Ss] space
+ end
+
+ rule SYM_TRUE
+ [Tt] [Rr] [Uu] [Ee] space
+ end
+
+ rule SYM_FALSE
+ [Ff] [Aa] [Ll] [Ss] [Ee] space
+ end
+
+ rule SYM_FORALL
+ [Ff] [Oo] [Rr] '_' [Aa] [Ll] [Ll] space
+ end
+
+ rule SYM_EXISTS
+ [Ee] [Xx] [Ii] [Ss] [Tt] [Ss] space
+ end
+
+ rule SYM_EXISTENCE
+ [Ee] [Xx] [Ii] [Ss] [Tt] [Ee] [Nn] [Cc] [Ee] space
+ end
+
+ rule SYM_OCCURRENCES
+ [Oo] [Cc] [Cc] [Uu] [Rr] [Rr] [Ee] [Nn] [Cc] [Ee] [Ss] white_space
+ end
+
+ rule SYM_CARDINALITY
+ [Cc] [Aa] [Rr] [Dd] [Ii] [Nn] [Aa] [Ll] [Ii] [Tt] [Yy] white_space
+ end
+
+ rule SYM_ORDERED
+ [Oo] [Rr] [Dd] [Ee] [Rr] [Ee] [Dd] white_space
+ end
+
+ rule SYM_UNORDERD
+ [Uu] [Nn] [Oo] [Rr] [Dd] [Ee] [Rr] [Ee] [Dd] white_space
+ end
+
+ rule SYM_UNIQUE
+ [Uu] [Nn] [Ii] [Qq] [Uu] [Ee] space
+ end
+
+ rule SYM_INFINITY
+ [Ii] [Nn] [Ff] [Ii] [Nn] [Ii] [Tt] [Yy] space
+ end
+
+ rule SYM_USE_NODE
+ [Uu] [Ss] [Ee] '_' [Nn] [Oo] [Dd] [Ee] space
+ end
+
+ rule SYM_ALLOW_ARCHETYPE
+ ([Aa] [Ll] [Ll] [Oo] [Ww] / [Uu] [Ss] [Ee]) '_' [Aa] [Rr] [Cc] [Hh] [Ee] [Tt] [Yy] [Pp] [Ee] space
+ end
+
+ rule SYM_INCLUDE
+ [Ii] [Nn] [Cc] [Ll] [Uu] [Dd] [Ee] space
+ end
+
+ rule SYM_EXCLUDE
+ [Ee] [Xx] [Cc] [Ll] [Uu] [Dd] [Ee] space
+ end
+
+ rule SYM_TEMPLATE_COMPONENT
+ [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] ' _' [Cc] [Oo] [Mm] [Pp] [Oo] [Nn] [Ee] [Nn] [Tt] space
+ end
+
+ rule SYM_TEMPLATE
+ [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] space
+ end
+
+ rule SYM_OPERATIONAL_TEMPLATE
+ [Oo] [Pp] [Ee] [Rr] [Aa] [Tt] [Ii] [Oo] [Nn] [Aa] [Ll] '_' [Tt] [Ee] [Mm] [Pp] [Ll] [Aa] [Tt] [Ee] space
+ end
+
+ rule SYM_ADL_VERSION
+ [Aa] [Dd] [Ll] '_' [Vv] [Ee] [Rr] [Ss] [Ii] [Oo] [Nn] space
+ end
+
+ rule SYM_IS_CONTROLLED
+ [Cc] [Oo] [Nn] [Tt] [Rr] [Oo] [Ll] [Ll] [Ee] [Dd] space
+ end
+
+ rule SYM_IS_GENERATED
+ [Gg] [Ee] [Nn] [Ee] [Rr] [Aa] [Tt] [Ee] [Dd] space
+ end
+
+ rule SYM_SPECIALIZE
+ [Ss] [Pp] [Ee] [Cc] [Ii] [Aa] [Ll] [Ii] [SsZz] [Ee] space
+ end
+
+ rule SYM_CONCEPT
+ [Cc] [Oo] [Nn] [Cc] [Ee] [Pp] [Tt] space
+ end
+
+ rule SYM_LANGUAGE
+ [Ll] [Aa] [Nn] [Gg] [Uu] [Aa] [Gg] [Ee] space
+ end
+
+ rule SYM_DESCRIPTION
+ [Dd] [Ee] [Ss] [Cc] [Rr] [Ii] [Pp] [Tt] [Ii] [Oo] [Nn] space
+ end
+
+ rule SYM_DEFINITION
+ [Dd] [Ee] [Ff] [Ii] [Nn] [Ii] [Tt] [Ii] [Oo] [Nn] space
+ end
+
+ rule SYM_INVARIANT
+ [Ii] [Nn] [Vv] [Aa] [Rr] [Ii] [Aa] [Nn] [Tt] space
+ end
+
+ rule SYM_ONTOLOGY
+ [Oo] [Nn] [Tt] [Oo] [Ll] [Oo] [Gg] [Yy] space
+ end
+
+ rule SYM_ANNOTATIONS
+ [Aa] [Nn] [Nn] [Oo] [Tt] [Aa] [Tt] [Ii] [Oo] [Nn] [Ss] space
+ end
+
+ rule V_VERSION_STRING
+ [0-9]+ '.' [0-9]+ ('.' [0-9]+)* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_ARCHETYPE_ID
+ NAMESTR ('-' NAMESTR) 2..2 '.' NAMESTR ('-' NAMESTR)* '.v' [1-9] [0-9]* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_IDENTIFIER
+ [a-zA-Z] [a-zA-Z0-9_]* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_URI
+ [a-z]+ '://' [^<>|\\{}^~"\[\] ]* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_QUALIFIED_TERM_CODE_REF
+ '[' ti:(NAMECHAR_PAREN+) '::' cs:(NAMECHAR+) ']' {
+ def value
+ term_id = OpenEHR::RM::Support::Identification::TerminologyID.new(
+ :value => ti.text_value)
+ OpenEHR::RM::DataTypes::Text::CodePhrase.new(
+ :terminology_id => term_id, :code_string => cs.text_value)
+ end
+ }
+ end
+
+ rule ERR_V_QUALIFIED_TERM_CODE_REF
+ '[' er:(NAMECHAR_PAREN+ '::' NAMECHAR_SPACE+) ']' {
+ def value
+ er.text_value
+ end
+ }
+ end
+
+ rule V_LOCAL_TERM_CODE_REF
+ '[' lt:(ALPHANUM NAMECHAR*) ']' {
+ def value
+ lt.text_value
+ end
+ }
+ end
+
+ rule V_LOCAL_CODE
+ 'a' [ct] [0-9\.]+ {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_TERM_CODE
+ '[' code:([a-zA-Z0-9()._\-]+) '::' white_space {
+ def value
+ ::OpenEHR::RM::Support::Identification::TerminologyID.new(
+ :value => code.text_value)
+ end
+ }
+ end
+
+ rule V_ISO8601_EXTENDED_DATE_TIME
+ ([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)?)
+ end
+
+ rule V_ISO8601_EXTENDED_TIME
+ [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)?
+ end
+
+ rule V_ISO8601_EXTENDED_DATE
+ [0-9] 4..4 '-' [0-1] [0-9] '-' [0-3] [0-9] / [0-9] 4..4 '-' [0-1] [0-9]
+ end
+
+ rule V_ISO8601_DURATION
+ '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])?
+ / '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])?
+ / '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])?
+ / 'P' ([0-9]+ [yY]) ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])?
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM]) ([0-9]+ [wW])? ([0-9]+ [dD])?
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW]) ([0-9]+ [dD])?
+ / 'P' ([0-9]+ [yY])? ([0-9]+ [mM])? ([0-9]+ [wW])? ([0-9]+ [dD])
+ end
+
+ rule V_ISO8601_DATE_CONSTRAINT_PATTERN
+ [yY] [yY] [yY] [yY] '-' [mM?X] [mM?X] '-' [dD?X] [dD?X]
+ end
+
+ rule V_ISO8601_TIME_CONSTRAINT_PATTERN
+ [hH] [hH] ':' [mM?X] [mM?X] ':' [sS?X] [sS?X]
+ end
+
+ rule V_ISO8601_DATE_TIME_CONSTRAINT_PATTERN
+ [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]
+ end
+
+ rule V_ISO8601_DURATION_CONSTRAINT_PATTERN
+ 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH] [mM]? [sS]?
+ / 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH]? [mM] [sS]?
+ / 'P' [yY]? [mM]? [wW]? [dD]? 'T' [hH]? [mM]? [sS]
+ / 'P' [yY] [mM]? [wW]? [dD]?
+ / 'P' [yY]? [mM] [wW]? [dD]?
+ / 'P' [yY]? [mM]? [wW] [dD]?
+ / 'P' [yY]? [mM]? [wW]? [dD]
+ end
+
+ rule V_TYPE_IDENTIFIER
+ [A-Z] IDCHAR* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_GENERIC_TYPE_IDENTIFIER
+ [A-Z] IDCHAR* '<' [a-zA-Z0-9,_]+ '>' { # <>
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_ATTRIBUTE_IDENTIFIER
+ [a-z] IDCHAR* {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_INTEGER
+ [0-9]+ [eE] [+-]? [0-9] {
+ def value
+ text_value.to_i
+ end
+ }
+ / [1-9] [0-9]+ {
+ def value
+ text_value.to_i
+ end
+ }
+ / [0-9] {
+ def value
+ text_value.to_i
+ end
+ }
+ end
+
+ rule V_REAL
+ [0-9]+ '.' [0-9]+ [eE] [+-]? [0-9]+ / [1-9] [0-9]+ '.' [0-9]+ / [0-9] '.' [0-9]+ {
+ def value
+ text_value.to_f
+ end
+ }
+ end
+
+ rule V_CHAR
+ [^\\\n\"] {
+ def value
+ text_value
+ end
+ }
+ end
+
+ rule V_STRING
+ '"' str:(('\"' / !'"' .)*) '"' {
+ def value
+ str.text_value.tr_s('\\\\', '\\')
+ end
+ }
+ end # of Shared Token section
end # of ADLGrammar
end # of Parser
end # of openEHR