void ParseRefinementPattern(ParsedElement parameter)
        {
            if (parameter is IdentifierExpression)
            {
                var patternId = ((IdentifierExpression)parameter).Value;

                switch (patternId)
                {
                case "case":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.Case
                    };
                    break;

                case "milestone":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.Milestone
                    };
                    break;

                case "introduce_guard":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.IntroduceGuard
                    };
                    break;

                case "divide_and_conquer":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.DivideAndConquer
                    };
                    break;

                case "unmonitorability":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.Unmonitorability
                    };
                    break;

                case "uncontrollability":
                    parsedRefinementPattern = new ParsedRefinementPattern {
                        Name = ParsedRefinementPatternName.Uncontrollability
                    };
                    break;

                default:
                    throw new NotImplementedException("Refinement pattern '" + patternId + "' is not defined.");
                }
            }
        }
        public ParsedElement ParsedAttribute(string identifier, NParsedAttributeValue parameters, NParsedAttributeValue value)
        {
            parsedRefinementPattern = null;
            contextIdentifier       = null;

            if (parameters != null)
            {
                ParseParameter(identifier, parameters);
            }

            var parsedRefinees = new List <ParsedRefinee>();

            if (value is NParsedAttributeAtomic)
            {
                AddChild((NParsedAttributeAtomic)value, parsedRefinees);
            }
            else if (value is NParsedAttributeList)
            {
                foreach (var item in ((NParsedAttributeList)value).Values)
                {
                    if (item is NParsedAttributeAtomic)
                    {
                        AddChild((NParsedAttributeAtomic)item, parsedRefinees);
                    }
                    else if (item is NParsedAttributeBracket)
                    {
                        var child            = ((NParsedAttributeBracket)item).Item;
                        var parameters_child = ((NParsedAttributeBracket)item).Parameter;

                        var refinee = new ParsedRefinee();

                        if (child is IdentifierExpression)
                        {
                            refinee.Identifier = ((IdentifierExpression)child).Value;
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }

                        // TODO fix this
                        if (parameters_child is NParsedAttributeAtomic)
                        {
                            var parameter_child = ((NParsedAttributeAtomic)parameters_child).Value;
                            if (parameter_child is ParsedFloat)
                            {
                                refinee.Parameters = new ParsedPrimitiveRefineeParameter <double>(((ParsedFloat)parameter_child).Value);
                            }
                            else if (parameter_child is ParsedInteger)
                            {
                                refinee.Parameters = new ParsedPrimitiveRefineeParameter <double>(((ParsedInteger)parameter_child).Value);
                            }
                            else
                            {
                                throw new NotImplementedException(parameter_child.GetType().ToString() + " " + parameter_child.ToString());
                            }
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }

                        parsedRefinees.Add(refinee);
                    }
                    else
                    {
                        throw new NotImplementedException("Attribute '" + identifier + "' only accept a list of identifiers. (Received: " +
                                                          string.Join(",", parsedRefinees.Select(x => x.GetType().ToString())) + ")");
                    }
                }
            }
            else
            {
                throw new NotImplementedException("Attribute '" + identifier + "' only accept an atomic value or a list of atomic values.");
            }

            // TODO Remove casting and toList
            return(new ParsedRefinedByAttribute()
            {
                ParsedRefinees = parsedRefinees,
                RefinementPattern = parsedRefinementPattern,
                ContextIdentifier = contextIdentifier,
            });
        }