Skip to content

FHIR Mapping Language Parser

FHIR Mapping Language parser and lexer utilities.

FhirMappingLanguageLexer

Path: fhircraft.fhir.mapper.lexer.FhirMappingLanguageLexer

FhirMappingLanguageLexer(debug=False)

Bases: FhirPathLexer

A Lexical analyzer for JsonPath.

Methods:

Name Description
tokenize

Maps a string to an iterator over tokens. In other words: [char] -> [token]

t_ignore_WHITESPACE

[\s]

t_METADATA_DECLARATION

\/\/\/

t_ignore_DOCUMENTATION

\/{2}(.*)

t_RIGHT_ARROW

->

t_DATETIME

@\d{4}(?:-\d{2}(?:-\d{2})?)?T(?:\d{2}(?::\d{2}(?::\d{2}(?:.\d{3}(?:[+|-]\d{2}(?::\d{2})?)?)?)?)?)?

t_DATE

@\d{4}(?:-\d{2}(?:-\d{2})?)?

t_BOOLEAN

true|false

t_TIME

\@T\d{2}(?::\d{2}(?::\d{2}(?:.\d{3}(?:[+|-]\d{2}(?::\d{2})?)?)?)?)?

t_NUMBER

-?\d+(.\d+)?

t_STRING

(\'([^\'])?\')|(\"([^\"])?\")

t_GROUPTYPE

<>|<>

t_DOUBLE_EQUAL

==

t_DELIMITEDIDENTIFIER

`[a-zA-Z][a-zA-Z0-9-][^`]*`

t_error_invalid_function

"

Source code in fhircraft/fhir/mapper/lexer.py
def __init__(self, debug=False):
    self.debug = debug
    if self.__doc__ is None:
        raise FhirMappingLanguageLexerError(
            "Docstrings have been removed by design of PLY."
        )
    # Create the lexer once during initialization for better performance
    self.lexer = ply.lex.lex(module=self, debug=debug)

tokenize

tokenize(string)

Maps a string to an iterator over tokens. In other words: [char] -> [token]

Source code in fhircraft/fhir/mapper/lexer.py
def tokenize(self, string):
    """
    Maps a string to an iterator over tokens. In other words: [char] -> [token]
    """

    # Reuse the existing lexer instead of creating a new one each time
    self.lexer.latest_newline = 0
    self.lexer.string_value = None
    self.lexer.input(string)

    while True:
        t = self.lexer.token()
        if t is None:
            break
        t.col = t.lexpos - self.lexer.latest_newline
        yield t

    if self.lexer.string_value is not None:
        raise FhirMappingLanguageLexerError(
            "Unexpected EOF in string literal or identifier"
        )

t_ignore_WHITESPACE

t_ignore_WHITESPACE(t)

[\s]

Source code in fhircraft/fhir/mapper/lexer.py
def t_ignore_WHITESPACE(self, t):
    r"[\s]"
    if t.value == "\n":
        t.lexer.lineno += 1
        t.lexer.latest_newline = t.lexpos

t_METADATA_DECLARATION

t_METADATA_DECLARATION(t)

\/\/\/

Source code in fhircraft/fhir/mapper/lexer.py
def t_METADATA_DECLARATION(self, t):
    r"\/\/\/"
    return t

t_ignore_DOCUMENTATION

t_ignore_DOCUMENTATION(t)

\/{2}(.*)

Source code in fhircraft/fhir/mapper/lexer.py
def t_ignore_DOCUMENTATION(self, t):
    r"\/{2}(.*)"
    for substring in ["//", "/*", "*/"]:
        t.value = t.value.replace(substring, "")
    t.value = t.value.strip()

t_RIGHT_ARROW

t_RIGHT_ARROW(t)

->

Source code in fhircraft/fhir/mapper/lexer.py
def t_RIGHT_ARROW(self, t):
    r"->"
    return t

t_DATETIME

t_DATETIME(t)

@\d{4}(?:-\d{2}(?:-\d{2})?)?T(?:\d{2}(?::\d{2}(?::\d{2}(?:.\d{3}(?:[+|-]\d{2}(?::\d{2})?)?)?)?)?)?

Source code in fhircraft/fhir/mapper/lexer.py
def t_DATETIME(self, t):
    r"@\d{4}(?:-\d{2}(?:-\d{2})?)?T(?:\d{2}(?:\:\d{2}(?:\:\d{2}(?:.\d{3}(?:[\+|\-]\d{2}(?:\:\d{2})?)?)?)?)?)?"
    return t

t_DATE

t_DATE(t)

@\d{4}(?:-\d{2}(?:-\d{2})?)?

Source code in fhircraft/fhir/mapper/lexer.py
def t_DATE(self, t):
    r"@\d{4}(?:-\d{2}(?:-\d{2})?)?"
    return t

t_BOOLEAN

t_BOOLEAN(t)

true|false

Source code in fhircraft/fhir/mapper/lexer.py
def t_BOOLEAN(self, t):
    r"true|false"
    return t

t_TIME

t_TIME(t)

\@T\d{2}(?::\d{2}(?::\d{2}(?:.\d{3}(?:[+|-]\d{2}(?::\d{2})?)?)?)?)?

Source code in fhircraft/fhir/mapper/lexer.py
def t_TIME(self, t):
    r"\@T\d{2}(?:\:\d{2}(?:\:\d{2}(?:\.\d{3}(?:[+|-]\d{2}(?:\:\d{2})?)?)?)?)?"
    return t

t_NUMBER

t_NUMBER(t)

-?\d+(.\d+)?

Source code in fhircraft/fhir/mapper/lexer.py
def t_NUMBER(self, t):
    r"-?\d+(\.\d+)?"
    if "." in t.value:
        t.value = float(t.value)
        t.type = "DECIMAL"
    else:
        t.value = int(t.value)
        t.type = "INTEGER"
    return t

t_STRING

t_STRING(t)

(\'([^\'])?\')|(\"([^\"])?\")

Source code in fhircraft/fhir/mapper/lexer.py
def t_STRING(self, t):
    r"(\'([^\']*)?\')|(\"([^\"]*)?\")"
    if t.value.startswith("'") and t.value.endswith("'"):
        t.value = t.value.strip("'")
    else:
        t.value = t.value.strip('"')
    return t

t_GROUPTYPE

t_GROUPTYPE(t)

<>|<>

Source code in fhircraft/fhir/mapper/lexer.py
def t_GROUPTYPE(self, t):
    r"<<types>>|<<type\+>>"
    t.value = t.value.strip("<").strip(">")
    t.value = {"types": "types", "type+": "type-and-types"}[t.value]
    return t

t_DOUBLE_EQUAL

t_DOUBLE_EQUAL(t)

==

Source code in fhircraft/fhir/mapper/lexer.py
def t_DOUBLE_EQUAL(self, t):
    r"=="
    return t

t_DELIMITEDIDENTIFIER

t_DELIMITEDIDENTIFIER(t)

`[a-zA-Z][a-zA-Z0-9-][^`]*`

Source code in fhircraft/fhir/mapper/lexer.py
def t_DELIMITEDIDENTIFIER(self, t):
    r"\`[a-zA-Z][a-zA-Z0-9\-][^\`]*\`"
    t.value = t.value.strip("`")
    return t

t_error_invalid_function

t_error_invalid_function(t)

"

Source code in fhircraft/fhir/mapper/lexer.py
def t_error_invalid_function(self, t):
    r""" " """
    pass

FhirMappingLanguageLexerError

Path: fhircraft.fhir.mapper.lexer.FhirMappingLanguageLexerError

Bases: Exception

FhirMappingLanguageParser

Path: fhircraft.fhir.mapper.parser.FhirMappingLanguageParser

FhirMappingLanguageParser(debug=False, lexer_class=None)

Bases: FhirPathParser

An LALR-parser for the FHIR Mapping Language

Methods:

Name Description
p_mapper_structureMap

structureMap : m_metadata m_mapId m_conceptmap m_structure_list m_imports_list m_const_list m_group_mapper_list

p_mapper_metadata

m_metadata : m_metadata m_metadata_entry

p_mapper_metadata_entry

m_metadata_entry : METADATA_DECLARATION m_identifier EQUAL m_metadata_value

p_mapper_metadata_value

m_metadata_value : m_literal

p_mapper_mapId

m_mapId : MAP m_url EQUAL m_identifier

p_conceptmap

m_conceptmap : CONCEPTMAP m_conceptmap_name '{' m_conceptmap_prefix_list m_conceptmap_mapping_list '}'

p_conceptmap_name

m_conceptmap_name : m_identifier

p_conceptmap_prefix_list

m_conceptmap_prefix_list : m_conceptmap_prefix_list m_conceptmap_prefix

p_conceptmap_prefix

m_conceptmap_prefix : PREFIX m_identifier EQUAL m_url

p_conceptmap_mapping_list

m_conceptmap_mapping_list : m_conceptmap_mapping_list m_conceptmap_mapping

p_conceptmap_mapping

m_conceptmap_mapping : m_identifier ':' m_conceptmap_code m_conceptmap_operator m_identifier ':' m_conceptmap_code

p_conceptmap_code

m_conceptmap_code : m_identifier

p_conceptmap_operator

m_conceptmap_operator : EQUAL

p_mapper_structure_list

m_structure_list : m_structure_list m_structure

p_mapper_imports_list

m_imports_list : m_imports_list m_imports

p_mapper_const_list

m_const_list : m_const_list m_const

p_mapper_group_mapper_list

m_group_mapper_list : m_group_mapper_list m_group

p_mapper_structure

m_structure : USES m_url m_structureAlias AS m_model_mode

p_mapper_structureAlias

m_structureAlias : ALIAS m_identifier

p_mapper_model_mode

m_model_mode : SOURCE

p_mapper_imports

m_imports : IMPORTS m_url

p_mapper_const

m_const : LET m_identifier EQUAL m_fhirpath ';'

p_mapper_extending_group

m_group : GROUP m_identifier m_parameters m_extends GROUPTYPE m_rules

p_mapper_group

m_group : GROUP m_identifier m_parameters GROUPTYPE m_rules

p_mapper_parameters

m_parameters : '(' m_parameter_list ')'

p_mapper_parameter_list

m_parameter_list : m_parameter ',' m_parameter

p_mapper_parameter

m_parameter : m_inputMode m_identifier m_type

p_mapper_type

m_type : ':' m_identifier

p_mapper_inputMode

m_inputMode : SOURCE

p_mapper_extends

m_extends : EXTENDS m_identifier

p_mapper_empty_rules

m_rules : '{' '}'

p_mapper_rules

m_rules : '{' m_rule_list '}'

p_mapper_rule_list

m_rule_list : m_rule_delimited

p_mapper_rule_delimited

m_rule_delimited : m_rule ';'

p_mapper_rule_named

m_rule : m_rule m_rule_name

p_mapping_rule

m_rule : m_rule_only_sources

p_mapper_rule_only_sources

m_rule_only_sources : m_rule_source_list m_dependent

p_identifier_list

m_identifier_list : m_identifier_list ',' m_identifier

p_mapper_rule_full

m_rule : m_rule_source_list RIGHT_ARROW m_rule_target_list m_dependent

p_mapper_rule_name

m_rule_name : m_identifier

p_mapper_rule_source_list

m_rule_source_list : m_rule_source_list ',' m_rule_source

p_mapper_rule_source

m_rule_source : m_rule_path m_source_modifiers

p_mapper_source_modifiers

m_source_modifiers : m_source_modifiers m_source_modifier

p_mapper_source_modifier

m_source_modifier : m_sourceType

p_mapper_rule_context

m_rule_path : m_identifier

p_mapper_rule_context_with_element

m_rule_path : m_identifier '.' m_identifier

p_mapper_rule_context_with_subelements

m_rule_path : m_rule_path '.' m_identifier

p_mapper_sourceType

m_sourceType : ':' m_identifier

p_mapper_sourceCardinality

m_sourceCardinality : INTEGER '.' '.' INTEGER

p_mapper_sourceDefault

m_sourceDefault : DEFAULT '(' m_fhirpath ')'

p_mapper_sourceListMode

m_sourceListMode : FIRST

p_mapper_alias

m_alias : AS m_identifier

p_mapper_whereClause

m_whereClause : WHERE '(' m_fhirpath ')'

p_mapper_checkClause

m_checkClause : CHECK '(' m_fhirpath ')'

p_mapper_log

m_log : LOG '(' m_fhirpath ')'

p_mapper_rule_target_list

m_rule_target_list : m_rule_target_list ',' m_rule_target

p_mapper_rule_target_with_invocation

m_rule_target : m_invocation m_target_modifier_list

p_mapper_rule_target

m_rule_target : m_rule_path EQUAL m_transform m_target_modifier_list

p_mapper_target_modifier_list

m_target_modifier_list : m_target_modifier_list m_target_modifier

p_mapper_target_modifier

m_target_modifier : m_alias

p_mapper_targetListMode

m_targetListMode : FIRST

p_mapper_transform

m_transform : m_transform_fhirpath

p_mapper_transform_rule_path

m_transform_rule_path : m_rule_path

p_mapper_transform_fhirpath

m_transform_fhirpath : '(' m_fhirpath ')'

p_mapper_transform_literal

m_transform_literal : m_literal

p_mapper_transform_invocation

m_transform_invocation : m_invocation

p_mapper_dependent_rules

m_dependent : THEN m_rules

p_mapper_dependent_invocation_list

m_dependent : THEN m_invocation_list

p_mapper_dependent_mixed

m_dependent : THEN m_invocation_list m_rules

p_mapper_invocation_list

m_invocation_list : m_invocation_list ',' m_invocation

p_mapper_invocation_with_parameters

m_invocation : m_identifier '(' m_param_list ')'

p_mapper_invocation

m_invocation : m_identifier '(' ')'

p_mapper_param_list

m_param_list : m_param_list ',' m_param

p_mapper_param

m_param : m_param_id

p_mapper_param_literal

m_param_literal : m_literal

p_mapper_param_id

m_param_id : m_identifier

p_mapper_fhirPath

m_fhirpath : expression

p_mapper_url

m_url : DELIMITEDIDENTIFIER

p_mapper_identifier

m_identifier : IDENTIFIER

p_mapper_literal

m_literal : INTEGER

p_mapper_time

m_time : TIME

p_mapper_date

m_date : DATE

p_mapper_datetime

m_datetime : DATETIME

p_mapper_empty

m_empty :

Source code in fhircraft/fhir/mapper/parser.py
def __init__(self, debug=False, lexer_class=None):
    if self.__doc__ is None:
        raise FhirMappingLanguageParserError(
            "Docstrings have been removed! By design of PLY, "
        )

    self.debug = debug
    self.lexer_class = (
        lexer_class or FhirMappingLanguageLexer
    )  # Crufty but works around statefulness in PLY
    self.lexer = self.lexer_class()
    # Since PLY has some crufty aspects and dumps files, we try to keep them local
    # However, we need to derive the name of the output Python file :-/
    output_directory = os.path.dirname(__file__)
    try:
        module_name = os.path.splitext(os.path.split(__file__)[1])[0]
    except:
        module_name = __name__

    start_symbol = "structureMap"
    parsing_table_module = "_".join([module_name, start_symbol, "parsetab"])

    # Generate the parse table
    self.parser = ply.yacc.yacc(
        module=self,
        debug=self.debug,
        tabmodule=parsing_table_module,
        outputdir=output_directory,
        write_tables=False,
        start=start_symbol,
        errorlog=logger,
    )

p_mapper_structureMap

p_mapper_structureMap(p)

structureMap : m_metadata m_mapId m_conceptmap m_structure_list m_imports_list m_const_list m_group_mapper_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_structureMap(self, p):
    """structureMap : m_metadata m_mapId m_conceptmap m_structure_list m_imports_list m_const_list m_group_mapper_list"""
    # Initialize the structure map with the map id
    self.structureMap.url = p[2]["url"]
    self.structureMap.name = p[2]["name"]
    self.structureMap.status = "draft"  # Default status

    for attr, value in p[1].items():
        setattr(self.structureMap, attr, value)

    if p[3]:
        self.structureMap.contained = [p[3]]

    # Add structures, imports, constants, and groups
    if p[4]:
        self.structureMap.structure = p[4]
    if p[5]:
        self.structureMap.import_ = p[5]
    if p[6]:
        self.structureMap.const = p[6]
    if p[7]:
        self.structureMap.group = p[7]

    p[0] = self.structureMap

p_mapper_metadata

p_mapper_metadata(p)
Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_metadata(self, p):
    """
    m_metadata : m_metadata m_metadata_entry
               | m_metadata_entry
               | m_empty
    """
    if len(p) == 2:
        p[0] = p[1] if p[1] else {}
    else:
        p[0] = {**(p[1] or {}), **p[2]}

p_mapper_metadata_entry

p_mapper_metadata_entry(p)

m_metadata_entry : METADATA_DECLARATION m_identifier EQUAL m_metadata_value

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_metadata_entry(self, p):
    """
    m_metadata_entry : METADATA_DECLARATION m_identifier EQUAL m_metadata_value
    """
    if len(p) == 5:
        p[0] = {p[2]: p[4]}
    else:
        p[0] = {}

p_mapper_metadata_value

p_mapper_metadata_value(p)
Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_metadata_value(self, p):
    """
    m_metadata_value : m_literal
                     | m_empty
    """
    p[0] = p[1]

p_mapper_mapId

p_mapper_mapId(p)
MAP m_url EQUAL m_identifier

| MAP m_url EQUAL STRING | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_mapId(self, p):
    """
    m_mapId : MAP m_url EQUAL m_identifier
            | MAP m_url EQUAL STRING
            | m_empty
    """
    if len(p) == 5:
        p[0] = {"url": p[2], "name": p[4]}
    else:
        p[0] = {"url": None, "name": None}

p_conceptmap

p_conceptmap(p)
CONCEPTMAP m_conceptmap_name '{' m_conceptmap_prefix_list m_conceptmap_mapping_list '}'

| m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap(self, p):
    """
    m_conceptmap : CONCEPTMAP m_conceptmap_name '{' m_conceptmap_prefix_list  m_conceptmap_mapping_list '}'
                 | m_empty
    """
    if len(p) == 2:
        p[0] = None
    elif len(p[4]) != 2:
        raise FhirMappingLanguageParserError(
            f"Invalid concept map prefix definition at {p.lineno}:{p.col}"
        )
    else:
        source = p[4][0]
        target = p[4][1]
        p[0] = ConceptMap(
            resourceType="ConceptMap",
            status="draft",
            name=p[2],
            group=[
                ConceptMapGroup(
                    source=source,
                    target=target,
                    element=p[5],
                )
            ],
        )

p_conceptmap_name

p_conceptmap_name(p)
m_identifier

| STRING

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_name(self, p):
    """
    m_conceptmap_name : m_identifier
                     | STRING
    """
    p[0] = p[1]

p_conceptmap_prefix_list

p_conceptmap_prefix_list(p)
m_conceptmap_prefix_list m_conceptmap_prefix

| m_conceptmap_prefix | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_prefix_list(self, p):
    """
    m_conceptmap_prefix_list : m_conceptmap_prefix_list m_conceptmap_prefix
                             | m_conceptmap_prefix
                             | m_empty
    """
    self._parse_list_tokens(p)

p_conceptmap_prefix

p_conceptmap_prefix(p)

m_conceptmap_prefix : PREFIX m_identifier EQUAL m_url

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_prefix(self, p):
    """
    m_conceptmap_prefix : PREFIX m_identifier EQUAL m_url
    """
    p[0] = p[4]

p_conceptmap_mapping_list

p_conceptmap_mapping_list(p)
m_conceptmap_mapping_list m_conceptmap_mapping

| m_conceptmap_mapping | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_mapping_list(self, p):
    """
    m_conceptmap_mapping_list : m_conceptmap_mapping_list m_conceptmap_mapping
                              | m_conceptmap_mapping
                              | m_empty
    """
    self._parse_list_tokens(p)

p_conceptmap_mapping

p_conceptmap_mapping(p)

m_conceptmap_mapping : m_identifier ':' m_conceptmap_code m_conceptmap_operator m_identifier ':' m_conceptmap_code

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_mapping(self, p):
    """
    m_conceptmap_mapping : m_identifier ':' m_conceptmap_code m_conceptmap_operator m_identifier ':' m_conceptmap_code
    """
    p[0] = ConceptMapGroupElement(
        code=p[3],
        target=[ConceptMapGroupElementTarget(code=p[7], relationship=p[4])],
    )

p_conceptmap_code

p_conceptmap_code(p)
m_identifier

| STRING

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_code(self, p):
    """
    m_conceptmap_code : m_identifier
                      | STRING
    """
    p[0] = p[1]

p_conceptmap_operator

p_conceptmap_operator(p)
EQUAL

| NOT_EQUAL | DOUBLE_EQUAL | GREATER_EQUAL_THAN | LESS_EQUAL_THAN

Source code in fhircraft/fhir/mapper/parser.py
def p_conceptmap_operator(self, p):
    """
    m_conceptmap_operator : EQUAL
                          | NOT_EQUAL
                          | DOUBLE_EQUAL
                          | GREATER_EQUAL_THAN
                          | LESS_EQUAL_THAN
    """
    match p[1]:
        case "==":
            p[0] = "equivalent"
        case "=":
            p[0] = "related-to"
        case "!=":
            p[0] = "not-related-to"
        case ">=":
            p[0] = "source-is-broader-than-target"
        case "<=":
            p[0] = "source-is-narrower-than-target"
        case _:
            raise FhirMappingLanguageParserError(
                f"Invalid concept map operator '{p[1]}'"
            )

p_mapper_structure_list

p_mapper_structure_list(p)
m_structure_list m_structure

| m_structure | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_structure_list(self, p):
    """
    m_structure_list : m_structure_list m_structure
                     | m_structure
                     | m_empty
    """
    self._parse_list_tokens(p)

p_mapper_imports_list

p_mapper_imports_list(p)
m_imports_list m_imports

| m_imports | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_imports_list(self, p):
    """
    m_imports_list : m_imports_list m_imports
                      | m_imports
                      | m_empty
    """
    self._parse_list_tokens(p)

p_mapper_const_list

p_mapper_const_list(p)
m_const_list m_const

| m_const | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_const_list(self, p):
    """
    m_const_list : m_const_list m_const
                 | m_const
                 | m_empty
    """
    self._parse_list_tokens(p)

p_mapper_group_mapper_list

p_mapper_group_mapper_list(p)
m_group_mapper_list m_group

| m_group | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_group_mapper_list(self, p):
    """
    m_group_mapper_list : m_group_mapper_list m_group
                        | m_group
                        | m_empty
    """
    self._parse_list_tokens(p)

p_mapper_structure

p_mapper_structure(p)
USES m_url m_structureAlias AS m_model_mode

| USES m_url AS m_model_mode

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_structure(self, p):
    """
    m_structure : USES m_url m_structureAlias AS m_model_mode
                | USES m_url AS m_model_mode
    """
    p[0] = StructureMapStructure(
        url=p[2],
        mode=p[5] if len(p) == 6 else p[4],
        alias=p[3] if len(p) == 6 else None,
    )

p_mapper_structureAlias

p_mapper_structureAlias(p)

m_structureAlias : ALIAS m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_structureAlias(self, p):
    """
    m_structureAlias : ALIAS m_identifier
    """
    p[0] = p[2]

p_mapper_model_mode

p_mapper_model_mode(p)
SOURCE

| QUERIED | TARGET | PRODUCED

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_model_mode(self, p):
    """
    m_model_mode : SOURCE
                | QUERIED
                | TARGET
                | PRODUCED
    """
    p[0] = p[1]

p_mapper_imports

p_mapper_imports(p)

m_imports : IMPORTS m_url

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_imports(self, p):
    """
    m_imports : IMPORTS m_url
    """
    p[0] = p[2]

p_mapper_const

p_mapper_const(p)

m_const : LET m_identifier EQUAL m_fhirpath ';'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_const(self, p):
    """
    m_const : LET m_identifier EQUAL m_fhirpath ';'
    """
    p[0] = StructureMapConst(name=p[2], value=str(p[4]))

p_mapper_extending_group

p_mapper_extending_group(p)
GROUP m_identifier m_parameters m_extends GROUPTYPE m_rules

| GROUP m_identifier m_parameters m_extends m_rules

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_extending_group(self, p):
    """
    m_group : GROUP m_identifier m_parameters m_extends GROUPTYPE m_rules
            | GROUP m_identifier m_parameters m_extends m_rules
    """
    if len(p) == 7:
        # Group type specified
        extends = p[4]
        typeMode = p[5]
        rules = p[6]
    else:
        # No group type specified
        extends = p[4]
        typeMode = None
        rules = p[5]

    p[0] = StructureMapGroup(
        name=p[2],
        input=p[3],
        rule=rules,
        extends=extends,
        typeMode=typeMode,
    )

p_mapper_group

p_mapper_group(p)
GROUP m_identifier m_parameters GROUPTYPE m_rules

| GROUP m_identifier m_parameters m_rules

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_group(self, p):
    """
    m_group : GROUP m_identifier m_parameters GROUPTYPE m_rules
            | GROUP m_identifier m_parameters m_rules
    """
    if len(p) == 6:
        # Group type specified
        typeMode = p[4]
        rules = p[5]
    else:  # no optional args
        typeMode = None
        rules = p[4]

    p[0] = StructureMapGroup(
        name=p[2],
        input=p[3],
        rule=rules,
        typeMode=typeMode,
    )

p_mapper_parameters

p_mapper_parameters(p)
'(' m_parameter_list ')'

| '(' m_parameter ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_parameters(self, p):
    """
    m_parameters : '(' m_parameter_list ')'
                 | '(' m_parameter ')'
    """
    p[0] = ensure_list(p[2])

p_mapper_parameter_list

p_mapper_parameter_list(p)
m_parameter ',' m_parameter

| m_parameter_list ',' m_parameter

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_parameter_list(self, p):
    """
    m_parameter_list : m_parameter ',' m_parameter
                     | m_parameter_list ',' m_parameter
    """
    p[0] = ensure_list(p[1])
    p[0].extend(ensure_list(p[3]))

p_mapper_parameter

p_mapper_parameter(p)
m_inputMode m_identifier m_type

| m_inputMode m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_parameter(self, p):
    """
    m_parameter : m_inputMode m_identifier m_type
                | m_inputMode m_identifier
    """
    p[0] = StructureMapGroupInput(
        mode=p[1], name=p[2], type=p[3] if len(p) == 4 else None
    )

p_mapper_type

p_mapper_type(p)

m_type : ':' m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_type(self, p):
    """
    m_type : ':' m_identifier
    """
    p[0] = p[2]

p_mapper_inputMode

p_mapper_inputMode(p)
SOURCE

| TARGET

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_inputMode(self, p):
    """
    m_inputMode : SOURCE
                | TARGET
    """
    p[0] = p[1]

p_mapper_extends

p_mapper_extends(p)

m_extends : EXTENDS m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_extends(self, p):
    """
    m_extends : EXTENDS m_identifier
    """
    p[0] = p[2]

p_mapper_empty_rules

p_mapper_empty_rules(p)

m_rules : '{' '}'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_empty_rules(self, p):
    """
    m_rules : '{' '}'
    """
    p[0] = None

p_mapper_rules

p_mapper_rules(p)

m_rules : '{' m_rule_list '}'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rules(self, p):
    """
    m_rules : '{' m_rule_list '}'
    """
    p[0] = p[2]

p_mapper_rule_list

p_mapper_rule_list(p)
m_rule_delimited

| m_rule_list m_rule_delimited | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_list(self, p):
    """
    m_rule_list : m_rule_delimited
                | m_rule_list m_rule_delimited
                | m_empty
    """
    self._parse_list_tokens(p)

p_mapper_rule_delimited

p_mapper_rule_delimited(p)

m_rule_delimited : m_rule ';'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_delimited(self, p):
    """
    m_rule_delimited : m_rule ';'
    """
    p[0] = p[1]

p_mapper_rule_named

p_mapper_rule_named(p)

m_rule : m_rule m_rule_name

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_named(self, p):
    """
    m_rule : m_rule m_rule_name
    """
    p[0] = p[1]
    p[0].name = p[2]

p_mapping_rule

p_mapping_rule(p)
m_rule_only_sources

| m_rule

Source code in fhircraft/fhir/mapper/parser.py
def p_mapping_rule(self, p):
    """
    m_rule : m_rule_only_sources
           | m_rule
    """
    p[0] = p[1]

p_mapper_rule_only_sources

p_mapper_rule_only_sources(p)
m_rule_source_list m_dependent

| m_rule_source_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_only_sources(self, p):
    """
    m_rule_only_sources : m_rule_source_list m_dependent
                        | m_rule_source_list
    """
    sources = p[1]
    dependent = p[2] if len(p) == 3 else {}
    p[0] = StructureMapGroupRule(source=sources, **dependent)

p_identifier_list

p_identifier_list(p)
m_identifier_list ',' m_identifier

| m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_identifier_list(self, p):
    """
    m_identifier_list : m_identifier_list ',' m_identifier
                      | m_identifier
    """
    self._parse_list_tokens(p, comma_separated=True)

p_mapper_rule_full

p_mapper_rule_full(p)
m_rule_source_list RIGHT_ARROW m_rule_target_list m_dependent

| m_rule_source_list RIGHT_ARROW m_rule_target_list ':' m_identifier_list | m_rule_source_list RIGHT_ARROW m_rule_target_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_full(self, p):
    """
    m_rule : m_rule_source_list RIGHT_ARROW m_rule_target_list m_dependent
                   | m_rule_source_list RIGHT_ARROW m_rule_target_list ':' m_identifier_list
                   | m_rule_source_list RIGHT_ARROW m_rule_target_list
    """
    sources = p[1]
    _targets = p[3]
    dependent = p[4] if len(p) == 5 else {}

    if (
        len(sources) == 1
        and len(_targets) == 1
        and not dependent
        and not sources[0].variable
        and not _targets[0].get("variable")
        and not _targets[0].get("listMode")
        and not _targets[0].get("transform")
        and not _targets[0].get("parameter")
    ):
        if len(p) == 6:
            # Special case: multiple identity transforms
            p[0] = [
                self._process_identity_transform(
                    {"context": sources[0].context, "element": element},
                    {
                        "context": _targets[0].get("path")["context"],
                        "element": element,
                    },
                )
                for element in p[5]
            ]
        else:
            # Special case: identity transform
            p[0] = self._process_identity_transform(
                source_path={
                    "context": sources[0].context,
                    "element": sources[0].element,
                },
                target_path=_targets[0].get("path"),
            )
    else:
        p[0] = self._process_rule(sources, _targets, dependent)

p_mapper_rule_name

p_mapper_rule_name(p)
m_identifier

| STRING

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_name(self, p):
    """
    m_rule_name : m_identifier
                | STRING"""
    p[0] = p[1]

p_mapper_rule_source_list

p_mapper_rule_source_list(p)
m_rule_source_list ',' m_rule_source

| m_rule_source

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_source_list(self, p):
    """
    m_rule_source_list : m_rule_source_list ',' m_rule_source
                       | m_rule_source
    """
    self._parse_list_tokens(p, comma_separated=True)

p_mapper_rule_source

p_mapper_rule_source(p)

m_rule_source : m_rule_path m_source_modifiers

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_source(self, p):
    """
    m_rule_source : m_rule_path m_source_modifiers
    """
    p[0] = StructureMapGroupRuleSource(
        context=p[1].get("context"),
        element=p[1].get("element"),
        min=(
            str(min_value) if (min_value := p[2].get("min")) is not None else None
        ),
        max=(
            str(max_value) if (max_value := p[2].get("max")) is not None else None
        ),
        type=p[2].get("type"),
        defaultValue=p[2].get("default"),
        listMode=p[2].get("listMode"),
        variable=p[2].get("variable"),
        condition=p[2].get("condition"),
        check=p[2].get("check"),
        logMessage=p[2].get("log"),
    )

p_mapper_source_modifiers

p_mapper_source_modifiers(p)
m_source_modifiers m_source_modifier

| m_source_modifier | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_source_modifiers(self, p):
    """
    m_source_modifiers : m_source_modifiers m_source_modifier
                       | m_source_modifier
                       | m_empty
    """
    if len(p) == 2:
        p[0] = p[1] if p[1] else {}
    else:
        p[0] = p[1] or {}
        p[0].update(p[2] or {})

p_mapper_source_modifier

p_mapper_source_modifier(p)
m_sourceType

| m_sourceCardinality | m_sourceDefault | m_sourceListMode | m_alias | m_whereClause | m_checkClause | m_log

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_source_modifier(self, p):
    """
    m_source_modifier : m_sourceType
                      | m_sourceCardinality
                      | m_sourceDefault
                      | m_sourceListMode
                      | m_alias
                      | m_whereClause
                      | m_checkClause
                      | m_log
    """
    p[0] = p[1]

p_mapper_rule_context

p_mapper_rule_context(p)

m_rule_path : m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_context(self, p):
    """
    m_rule_path : m_identifier
    """
    p[0] = {"context": p[1], "element": None}

p_mapper_rule_context_with_element

p_mapper_rule_context_with_element(p)

m_rule_path : m_identifier '.' m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_context_with_element(self, p):
    """
    m_rule_path : m_identifier '.' m_identifier
    """
    p[0] = {"context": p[1], "element": p[3]}

p_mapper_rule_context_with_subelements

p_mapper_rule_context_with_subelements(p)

m_rule_path : m_rule_path '.' m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_context_with_subelements(self, p):
    """
    m_rule_path : m_rule_path '.' m_identifier
    """
    p[0] = p[1]
    p[0]["subelements"] = p[0].get("subelements", []) + [p[3]]

p_mapper_sourceType

p_mapper_sourceType(p)

m_sourceType : ':' m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_sourceType(self, p):
    """
    m_sourceType : ':' m_identifier
    """
    p[0] = {"type": p[2]}

p_mapper_sourceCardinality

p_mapper_sourceCardinality(p)
INTEGER '.' '.' INTEGER

| INTEGER '.' '.' '*'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_sourceCardinality(self, p):
    """
    m_sourceCardinality : INTEGER '.' '.' INTEGER
                        | INTEGER '.' '.' '*'
    """
    p[0] = {"min": p[1], "max": p[4]}

p_mapper_sourceDefault

p_mapper_sourceDefault(p)

m_sourceDefault : DEFAULT '(' m_fhirpath ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_sourceDefault(self, p):
    """
    m_sourceDefault : DEFAULT '(' m_fhirpath ')'
    """
    p[0] = {"default": p[3]}

p_mapper_sourceListMode

p_mapper_sourceListMode(p)
FIRST

| NOT_FIRST | LAST | NOT_LAST | ONLY_ONE

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_sourceListMode(self, p):
    """
    m_sourceListMode : FIRST
                     | NOT_FIRST
                     | LAST
                     | NOT_LAST
                     | ONLY_ONE
    """
    p[0] = {"listMode": p[1]}

p_mapper_alias

p_mapper_alias(p)

m_alias : AS m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_alias(self, p):
    """
    m_alias : AS m_identifier
    """
    p[0] = {"variable": p[2]}

p_mapper_whereClause

p_mapper_whereClause(p)

m_whereClause : WHERE '(' m_fhirpath ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_whereClause(self, p):
    """
    m_whereClause : WHERE '(' m_fhirpath ')'
    """
    p[0] = {"condition": p[3]}

p_mapper_checkClause

p_mapper_checkClause(p)

m_checkClause : CHECK '(' m_fhirpath ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_checkClause(self, p):
    """
    m_checkClause : CHECK '(' m_fhirpath ')'
    """
    p[0] = {"check": p[3]}

p_mapper_log

p_mapper_log(p)

m_log : LOG '(' m_fhirpath ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_log(self, p):
    """
    m_log : LOG '(' m_fhirpath ')'
    """
    p[0] = {"log": p[3]}

p_mapper_rule_target_list

p_mapper_rule_target_list(p)
m_rule_target_list ',' m_rule_target

| m_rule_target

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_target_list(self, p):
    """
    m_rule_target_list : m_rule_target_list ',' m_rule_target
                       | m_rule_target
    """
    self._parse_list_tokens(p, comma_separated=True)

p_mapper_rule_target_with_invocation

p_mapper_rule_target_with_invocation(p)

m_rule_target : m_invocation m_target_modifier_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_target_with_invocation(self, p):
    """
    m_rule_target : m_invocation m_target_modifier_list
    """
    p[0] = dict(
        transform=p[1].get("name"),
        parameter=p[1].get("parameters"),
        variable=p[2].get("variable"),
        listMode=p[2].get("listMode"),
    )

p_mapper_rule_target

p_mapper_rule_target(p)
m_rule_path EQUAL m_transform m_target_modifier_list

| m_rule_path m_target_modifier_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_rule_target(self, p):
    """
    m_rule_target : m_rule_path EQUAL m_transform m_target_modifier_list
                  | m_rule_path m_target_modifier_list
    """
    if len(p) == 5:
        transform = p[3]
        modifiers = p[4] or {}
        p[0] = dict(
            path=p[1],
            variable=modifiers.get("variable"),
            listMode=modifiers.get("listMode"),
            transform=(
                transform.get("name") if isinstance(transform, dict) else "copy"
            ),
            parameter=(
                transform.get("parameters")
                if isinstance(transform, dict)
                else transform if isinstance(transform, list) else [transform]
            ),
        )
    else:
        list_mode = p[2].get("listMode")
        p[0] = dict(
            path=p[1],
            variable=p[2].get("variable"),
            listMode=[list_mode] if list_mode else None,
        )

p_mapper_target_modifier_list

p_mapper_target_modifier_list(p)
m_target_modifier_list m_target_modifier

| m_target_modifier | m_empty

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_target_modifier_list(self, p):
    """
    m_target_modifier_list : m_target_modifier_list m_target_modifier
                           | m_target_modifier
                           | m_empty
    """
    if len(p) == 2:
        p[0] = p[1] if p[1] else {}
    else:
        p[0] = p[1] or {}
        p[0].update(p[2] or {})

p_mapper_target_modifier

p_mapper_target_modifier(p)

m_target_modifier : m_alias | m_targetListMode

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_target_modifier(self, p):
    """m_target_modifier : m_alias
    | m_targetListMode"""
    p[0] = p[1]

p_mapper_targetListMode

p_mapper_targetListMode(p)
FIRST

| SHARE | LAST | SINGLE

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_targetListMode(self, p):
    """
    m_targetListMode : FIRST
                     | SHARE
                     | LAST
                     | SINGLE
    """
    p[0] = {"listMode": p[1]}

p_mapper_transform

p_mapper_transform(p)
m_transform_fhirpath

| m_transform_invocation | m_transform_rule_path | m_transform_literal

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_transform(self, p):
    """
    m_transform : m_transform_fhirpath
                | m_transform_invocation
                | m_transform_rule_path
                | m_transform_literal
    """
    p[0] = p[1]

p_mapper_transform_rule_path

p_mapper_transform_rule_path(p)

m_transform_rule_path : m_rule_path

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_transform_rule_path(self, p):
    """
    m_transform_rule_path : m_rule_path
    """
    p[0] = StructureMapGroupRuleTargetParameter(valueId=p[1].get("context"))

p_mapper_transform_fhirpath

p_mapper_transform_fhirpath(p)

m_transform_fhirpath : '(' m_fhirpath ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_transform_fhirpath(self, p):
    """
    m_transform_fhirpath : '(' m_fhirpath ')'
    """
    p[0] = {
        "name": "evaluate",
        "parameters": [StructureMapGroupRuleTargetParameter(valueString=p[2])],
    }

p_mapper_transform_literal

p_mapper_transform_literal(p)

m_transform_literal : m_literal

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_transform_literal(self, p):
    """
    m_transform_literal : m_literal
    """
    p[0] = _parse_StructureMapGroupRuleTargetParameter(p[1])

p_mapper_transform_invocation

p_mapper_transform_invocation(p)

m_transform_invocation : m_invocation

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_transform_invocation(self, p):
    """
    m_transform_invocation : m_invocation
    """
    p[0] = p[1]

p_mapper_dependent_rules

p_mapper_dependent_rules(p)

m_dependent : THEN m_rules

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_dependent_rules(self, p):
    """
    m_dependent : THEN m_rules
    """
    p[0] = {"rule": p[2]}

p_mapper_dependent_invocation_list

p_mapper_dependent_invocation_list(p)

m_dependent : THEN m_invocation_list

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_dependent_invocation_list(self, p):
    """
    m_dependent : THEN m_invocation_list
    """
    p[0] = {
        "dependent": [
            StructureMapGroupRuleDependent(
                name=invocation.get("name"),
                parameter=(
                    [
                        StructureMapGroupRuleDependentParameter.model_validate(
                            param.model_dump()
                        )
                        for param in invocation.get("parameters")
                    ]
                    if invocation.get("parameters")
                    else None
                ),
            )
            for invocation in p[2]
        ]
    }

p_mapper_dependent_mixed

p_mapper_dependent_mixed(p)

m_dependent : THEN m_invocation_list m_rules

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_dependent_mixed(self, p):
    """
    m_dependent : THEN m_invocation_list m_rules
    """
    p[0] = {
        "dependent": [
            StructureMapGroupRuleDependent(
                name=invocation.get("name"),
                parameter=invocation.get("parameters"),
            )
            for invocation in p[2]
        ],
        "rule": p[3],
    }

p_mapper_invocation_list

p_mapper_invocation_list(p)
m_invocation_list ',' m_invocation

| m_invocation

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_invocation_list(self, p):
    """
    m_invocation_list : m_invocation_list ',' m_invocation
                      | m_invocation
    """
    self._parse_list_tokens(p, comma_separated=True)

p_mapper_invocation_with_parameters

p_mapper_invocation_with_parameters(p)

m_invocation : m_identifier '(' m_param_list ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_invocation_with_parameters(self, p):
    """
    m_invocation : m_identifier '(' m_param_list ')'
    """
    p[0] = {"name": p[1], "parameters": p[3]}

p_mapper_invocation

p_mapper_invocation(p)

m_invocation : m_identifier '(' ')'

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_invocation(self, p):
    """
    m_invocation : m_identifier '(' ')'
    """
    p[0] = {"name": p[1], "parameters": []}

p_mapper_param_list

p_mapper_param_list(p)
m_param_list ',' m_param

| m_param

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_param_list(self, p):
    """
    m_param_list : m_param_list ',' m_param
                 | m_param
    """
    self._parse_list_tokens(p, comma_separated=True)

p_mapper_param

p_mapper_param(p)
m_param_id

| m_param_literal

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_param(self, p):
    """
    m_param : m_param_id
            | m_param_literal
    """
    p[0] = p[1]

p_mapper_param_literal

p_mapper_param_literal(p)

m_param_literal : m_literal

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_param_literal(self, p):
    """
    m_param_literal : m_literal
    """
    p[0] = _parse_StructureMapGroupRuleTargetParameter(p[1])

p_mapper_param_id

p_mapper_param_id(p)

m_param_id : m_identifier

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_param_id(self, p):
    """
    m_param_id : m_identifier
    """
    p[0] = StructureMapGroupRuleTargetParameter(valueId=p[1])

p_mapper_fhirPath

p_mapper_fhirPath(p)

m_fhirpath : expression

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_fhirPath(self, p):
    """
    m_fhirpath : expression
    """
    expr = str(p[1])
    p[0] = expr.strip("'") if expr.startswith("'") and expr.endswith("'") else expr

p_mapper_url

p_mapper_url(p)
DELIMITEDIDENTIFIER

| STRING

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_url(self, p):
    """
    m_url : DELIMITEDIDENTIFIER
          | STRING
    """
    p[0] = p[1]

p_mapper_identifier

p_mapper_identifier(p)
IDENTIFIER

| DELIMITEDIDENTIFIER | ROOT_NODE

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_identifier(self, p):
    """
    m_identifier : IDENTIFIER
                 | DELIMITEDIDENTIFIER
                 | ROOT_NODE
    """
    p[0] = p[1]

p_mapper_literal

p_mapper_literal(p)
INTEGER

| ROOT_NODE | STRING | BOOLEAN | DECIMAL | m_date | m_time | m_datetime

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_literal(self, p):
    """
    m_literal : INTEGER
              | ROOT_NODE
              | STRING
              | BOOLEAN
              | DECIMAL
              | m_date
              | m_time
              | m_datetime
    """
    p[0] = p[1]

p_mapper_time

p_mapper_time(p)

m_time : TIME

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_time(self, p):
    """
    m_time : TIME
    """
    p[0] = literals.Time(p[1])

p_mapper_date

p_mapper_date(p)

m_date : DATE

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_date(self, p):
    """
    m_date : DATE
    """
    p[0] = literals.Date(p[1])

p_mapper_datetime

p_mapper_datetime(p)

m_datetime : DATETIME

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_datetime(self, p):
    """
    m_datetime : DATETIME
    """
    p[0] = literals.DateTime(p[1])

p_mapper_empty

p_mapper_empty(p)

m_empty :

Source code in fhircraft/fhir/mapper/parser.py
def p_mapper_empty(self, p):
    """
    m_empty :
    """
    p[0] = None

FhirMappingLanguageParserError

Path: fhircraft.fhir.mapper.parser.FhirMappingLanguageParserError

Bases: Exception

IteratorToTokenStream

Path: fhircraft.fhir.mapper.parser.IteratorToTokenStream

IteratorToTokenStream(iterator)
Source code in fhircraft/fhir/mapper/parser.py
def __init__(self, iterator):
    self.iterator = iterator

parse

parse(string: str) -> StructureMap
Source code in fhircraft/fhir/mapper/parser.py
def parse(string: str) -> StructureMap:
    return FhirMappingLanguageParser().parse(string)