protected override bool TryParseOffset(string offset, OffsetAxis axis, FileRange range, out IXmlComponentPointOffset result)
        {
            if (!offset.Contains("$"))
            {
                // Does not contain a variable
                return(base.TryParseOffset(offset, axis, range, out result));
            }

            offset = offset.Replace("(", "").Replace(")", "");

            var variableIndex = offset.IndexOf("$");
            var variableName  = offset.Substring(variableIndex + 1);

            // Check variable exists
            if (!definitionsSection.Definitions.TryGetValue(variableName, out var variableValues))
            {
                logger.Log(LogLevel.Error, range, $"Variable '{variableName}' does not exist", null);
                result = null;
                return(false);
            }

            // Check all possible values are valid
            var parsedValues = new ConditionalCollection <double>();

            foreach (var variableValue in variableValues)
            {
                if (!double.TryParse(variableValue.Value, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var parsedValue))
                {
                    logger.Log(LogLevel.Error, range, $"Value '{variableValue.Value}' for ${variableName} is not a valid decimal", null);
                    result = null;
                    return(false);
                }

                parsedValues.Add(new TypeDescription.Conditions.Conditional <double>(parsedValue, variableValue.Conditions));
            }

            result = new ComponentPointOffsetWithDefinition(offset.First() == '-', parsedValues, axis);
            return(true);
        }
        protected virtual bool TryParseOffset(string offset, OffsetAxis axis, FileRange range, out IXmlComponentPointOffset result)
        {
            if (offset.Length == 0)
            {
                _logger.Log(LogLevel.Error, range, $"Expected a number before '{axis.ToString().ToLowerInvariant()}'", null);
                result = null;
                return(false);
            }

            if (!double.TryParse(offset, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var offsetValue))
            {
                _logger.Log(LogLevel.Error, range, $"Unable to parse '{offset}' as double", null);
                result = null;
                return(false);
            }

            result = new XmlComponentPointOffset(offsetValue, axis);
            return(true);
        }