public void Handle(KAOSCoreElement element, ParsedElement attribute)
        {
            foreach (var builder in attributeBuilders)
            {
                var genericArguments = builder.GetType().BaseType.GetGenericArguments();

                if (genericArguments[0].IsAssignableFrom(element.GetType()) &&
                    genericArguments[1].IsAssignableFrom(attribute.GetType()))
                {
                    var method = builder.GetType().GetMethod("Handle", new[] { genericArguments[0], genericArguments[1], typeof(KAOSModel) });
                    if (method == null)
                    {
                        throw new Exception("Cannot find method Handle with generic parameters.");
                    }
                    try
                    {
                        method.Invoke(builder, new object[] { element, attribute, model });
                    }
                    catch (TargetInvocationException e)
                    {
                        Console.WriteLine(e.InnerException);
                        throw e.InnerException;
                    }
                }
            }
        }
 public BuilderException(string message, ParsedElement element, Exception innerException = null)
     : base(string.Format("{0}\nAt {1}:{2},{3}",
                          message,
                          element.Filename,
                          element.Line,
                          element.Col), innerException)
 {
 }
Example #3
0
        public virtual string AppendHorizontalRule(string text, ParsedElement element, IChildTagsFormatter childTagsFormatter)
        {
            if (text.Length > 0)
            {
                text = EndWithNewLine(text);
            }
            text += "<alpha=#b0><s><alpha=#00><align=flush> .</align></color></s></color>";

            return(text);
        }
        public static string ParseMultiplicity(string identifier, ParsedElement secondParameter)
        {
            if (secondParameter is NParsedAttributeAtomic)
            {
                return(ParseMultiplicity(identifier, (NParsedAttributeAtomic)secondParameter));
            }

            throw new InvalidParameterAttributeException(identifier,
                                                         InvalidParameterAttributeException.ATOMIC_ONLY);
        }
Example #5
0
        public Formula BuildPredicateFormula(KAOSTools.Core.Predicate p, ParsedElement value)
        {
            var dict = new Dictionary <string, KAOSTools.Core.Entity> ();

            foreach (var attr in p.Arguments)
            {
                dict.Add(attr.Name, attr.Type);
            }

            return(BuildFormula(value, dict));
        }
        static void AddChild(NParsedAttributeAtomic value, List <string> v)
        {
            ParsedElement child = value.Value;

            if (child is IdentifierExpression)
            {
                string identifier = ((IdentifierExpression)child).Value;
                v.Add(identifier);
            }
            else
            {
                throw new ParserException();
            }
        }
        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.");
                }
            }
        }
        private static string ParseDistributionName(string identifier, ParsedElement item)
        {
            string distribution_name = null;

            if (item is IdentifierExpression)
            {
                distribution_name = ((IdentifierExpression)item).Value;
            }
            else
            {
                throw new InvalidAttributeValueException(identifier,
                                                         InvalidAttributeValueException.IDENTIFIER);
            }

            return(distribution_name);
        }
        private static void TestInvalidColonValueHelper(ParsedElement left, ParsedElement right)
        {
            var          ap            = new ArgumentAttributeParser();
            const string attIdentifier = "argument";

            var e = Assert.Catch(() => {
                ap.ParsedAttribute(attIdentifier,
                                   null,
                                   new NParsedAttributeColon(left, right));
            });

            Assert.IsInstanceOf(typeof(InvalidAttributeValueException), e);
            StringAssert.AreEqualIgnoringCase(
                string.Format(InvalidAttributeValueException.IDENTIFIER, attIdentifier),
                e.Message
                );
        }
 void ParseParameter(string identifier, ParsedElement parameters)
 {
     if (parameters is NParsedAttributeAtomic)
     {
         var parameter = ((NParsedAttributeAtomic)parameters).Value;
         ParseRefinementPattern(parameter);
     }
     else if (parameters is NParsedAttributeEqual)
     {
         var left  = ((NParsedAttributeEqual)parameters).Left;
         var right = ((NParsedAttributeEqual)parameters).Right;
         if (left is IdentifierExpression ie)
         {
             if (ie.Value == "context" & (right is IdentifierExpression))
             {
                 var ie2 = (IdentifierExpression)right;
                 contextIdentifier = ie2.Value;
             }
             else if (ie.Value == "pattern")
             {
                 ParseRefinementPattern(right);
             }
             else
             {
                 throw new NotImplementedException($"Parameter '{ie.Value}' was not recognized.");
             }
         }
         else
         {
             throw new NotImplementedException($"Parameter '{left}' was not recognized.");
         }
     }
     else if (parameters is NParsedAttributeList l)
     {
         foreach (var item in l.Values)
         {
             ParseParameter(identifier, item);
         }
     }
     else
     {
         throw new NotImplementedException("Attribute '" + identifier + "' unrecognized parameter.");
     }
 }
        private static void AddValueToList(string identifier, ParsedElement value, List <ParsedElement> v)
        {
            if (!(value is NParsedAttributeAtomic))
            {
                throw new InvalidAttributeValueException(identifier,
                                                         InvalidAttributeValueException.ATOMIC_ONLY);
            }

            var atomic = ((NParsedAttributeAtomic)value);

            if (atomic.Value is IdentifierExpression)
            {
                v.Add(atomic.Value);
            }
            else
            {
                throw new InvalidAttributeValueException(identifier,
                                                         InvalidAttributeValueException.IDENTIFIER);
            }
        }
Example #12
0
        private IList <ParsedElement> ParseHtml(Uri uri)
        {
            if (SaveUri(uri))
            {
                var htmlCode = _dataProvider.GetFrom(uri.ToString()).Result;

                var document = htmlParser.ParseDocument(htmlCode);

                var parsedElement = new ParsedElement()
                {
                    Content    = htmlCode,
                    BaseName   = uri.AbsolutePath.Length == 0 ? "index.html" : uri.AbsolutePath,
                    BaseFolder = _setting.SaveDir
                };

                var result = VisitTagA(document, uri);
                result.Add(parsedElement);
                return(result);
            }

            return(null);
        }
        private static List <double> ParseDistributionParameter(string identifier, ParsedElement param)
        {
            List <double> distribution_parameters = new List <double> ();

            if (param is NParsedAttributeAtomic)
            {
                ParseDistributionParameter(identifier, distribution_parameters, ((NParsedAttributeAtomic)param).Value);
            }
            else if (param is NParsedAttributeList)
            {
                foreach (var p in ((NParsedAttributeList)param).Values)
                {
                    ParseDistributionParameter(identifier, distribution_parameters, p);
                }
            }
            else
            {
                throw new InvalidAttributeValueException(identifier,
                                                         InvalidAttributeValueException.ATOMIC_OR_LIST);
            }

            return(distribution_parameters);
        }
        static void ParseDistributionParameter(string identifier, List <double> distribution_parameters, ParsedElement p)
        {
            if (p is NParsedAttributeAtomic)
            {
                var pp = ((NParsedAttributeAtomic)p).Value;

                if (pp is ParsedInteger)
                {
                    distribution_parameters.Add(((ParsedInteger)pp).Value);
                }
                else if (pp is ParsedFloat)
                {
                    distribution_parameters.Add(((ParsedFloat)pp).Value);
                }
                else if (pp is ParsedPercentage)
                {
                    distribution_parameters.Add(((ParsedPercentage)pp).Value / 100d);
                }
                else
                {
                    throw new InvalidAttributeValueException(identifier,
                                                             InvalidAttributeValueException.INVALID_VALUE);
                }
            }
            else
            {
                throw new InvalidAttributeValueException(identifier,
                                                         InvalidAttributeValueException.ATOMIC_ONLY);
            }
        }
Example #15
0
 public Formula BuildFormula(ParsedElement value)
 {
     var declaredVariables = new Dictionary<string, Entity> ();
     return BuildFormula (value, declaredVariables);
 }
Example #16
0
        public Formula BuildFormula(ParsedElement value)
        {
            var declaredVariables = new Dictionary <string, Entity> ();

            return(BuildFormula(value, declaredVariables));
        }
 public GivenTypeNotFound(string identifier, ParsedElement element)
     : base("Given type '" + identifier + "' is not defined", element)
 {
 }
 public EntityNotFound(string identifier, ParsedElement element)
     : base("Entity '" + identifier + "' is not defined", element)
 {
 }
Example #19
0
        public Formula BuildPredicateFormula(KAOSTools.MetaModel.Predicate p, ParsedElement value)
        {
            var dict = new Dictionary<string, KAOSTools.MetaModel.Entity> ();

            foreach (var attr in p.Arguments) {
                dict.Add (attr.Name, attr.Type);
            }

            return BuildFormula (value, dict);
        }
Example #20
0
        public ParsedSpec Run()
        {
            var vkXml = this.xmlCache.GetVkXml();

            var knownExtensions = new List <string>();

            foreach (var vkExtension in vkXml.Element("registry").Element("extensions").Elements("extension"))
            {
                string name = vkExtension.Attribute("name").Value;

                var nameParts = name.Split('_');

                string extensionSuffix = nameParts[1].ToLower();

                if (!knownExtensions.Contains(extensionSuffix))
                {
                    knownExtensions.Add(extensionSuffix);
                }
            }

            var typeXml = new Dictionary <string, ParsedType>();

            foreach (var vkType in vkXml.Element("registry").Element("types").Elements("type"))
            {
                string       name = vkType.Attribute("name")?.Value ?? vkType.Element("name").Value;
                var          categoryAttribute = vkType.Attribute("category");
                TypeCategory category          = categoryAttribute == null
                                                            ? TypeCategory.None
                                                            : (TypeCategory)Enum.Parse(typeof(TypeCategory), categoryAttribute.Value);
                string requires       = vkType.Attribute("requires")?.Value;
                string parent         = vkType.Attribute("parent")?.Value;
                string returnedOnly   = vkType.Attribute("returnedonly")?.Value;
                bool   isReturnedOnly = returnedOnly != null
                                        ? bool.Parse(returnedOnly)
                                        : false;

                bool   isTypePointer = false;
                string type          = vkType.Element("type")?.Value;
                if (type == "VK_MAKE_VERSION")
                {
                    type += vkType.Element("type").NextNode.ToString();
                }

                if (category == TypeCategory.funcpointer)
                {
                    type = ((XText)vkType.Nodes().First()).Value.Split(' ')[1];

                    if (type.EndsWith("*"))
                    {
                        type = type.TrimEnd('*');

                        isTypePointer = true;
                    }
                }


                string extension;

                string[] nameParts = GetNameParts(category == TypeCategory.funcpointer ? name.Substring(4) : name, out extension, knownExtensions);

                // VkDisplayModeKHR has two parents defined, but associated
                // handle should cover the requirements for the second
                // so just take the first
                if (parent != null)
                {
                    parent = parent.Split(',').First();
                }

                var newType = new ParsedType
                {
                    VkName         = name,
                    Category       = category,
                    Requires       = requires,
                    Parent         = parent,
                    IsReturnedOnly = isReturnedOnly,
                    NameParts      = nameParts,
                    Extension      = extension,
                    Type           = type,
                    IsTypePointer  = isTypePointer
                };

                foreach (var vkMember in vkType.Elements("member"))
                {
                    var    nameElement = vkMember.Element("name");
                    string memberName  = nameElement.Value;
                    string memberType  = vkMember.Element("type").Value;
                    string optional    = vkMember.Attribute("optional")?.Value;
                    bool   isOptional  = optional != null
                                        ? bool.Parse(optional)
                                        : false;

                    ParsedFixedLength fixedLength = new ParsedFixedLength();

                    var         typeNodes   = nameElement.NodesBeforeSelf();
                    PointerType pointerType = GetPointerType(typeNodes);

                    if (nameElement.NodesAfterSelf().Any())
                    {
                        string enumName = vkMember.Element("enum")?.Value;

                        if (enumName != null)
                        {
                            fixedLength.Value = enumName;
                            fixedLength.Type  = FixedLengthType.EnumReference;
                        }
                        else
                        {
                            fixedLength.Value = fixedLengthParser.Parse(nameElement.NextNode.ToString());
                            fixedLength.Type  = FixedLengthType.IntegerLiteral;
                        }
                    }
                    else
                    {
                        int fixedLengthIndex = memberName.IndexOf('[');

                        if (fixedLengthIndex >= 0)
                        {
                            string fixedLengthString = memberName.Substring(fixedLengthIndex);
                            memberName = memberName.Substring(0, fixedLengthIndex);

                            fixedLength.Value = fixedLengthParser.Parse(fixedLengthString);
                            fixedLength.Type  = FixedLengthType.IntegerLiteral;
                        }
                    }

                    string vkName = memberName;

                    int pointerCount = pointerType.GetPointerCount();

                    while (pointerCount > 0 && memberName.StartsWith("p"))
                    {
                        memberName = memberName.Substring(1);

                        pointerCount--;
                    }

                    ParsedLen[] dimensions = GetDimensions(name, vkMember, memberName);

                    // Capture member name without array suffix
                    string memberExtension;

                    string[] memberNameParts = GetNameParts(memberName, out memberExtension, knownExtensions, false);

                    string typeExtension;

                    string[] typeNameParts = GetNameParts(memberType, out typeExtension, knownExtensions, true);

                    string typeWithoutExtension = typeNameParts != null
                                                    ? "Vk" + string.Join("", typeNameParts.Select(CapitaliseFirst))
                                                    : null;

                    string values = vkMember.Attribute("values")?.Value;

                    if (vkName == "sType" && values == null)
                    {
                        //HACK VkDebugReportLayerFlagsEXT doesn't specify a
                        // fixed value for the sType field, so it must be
                        // scraped from the following comment.

                        if (vkMember.NextNode != null)
                        {
                            // Split on spaces and skip "Must" & "be"
                            values = ((XComment)vkMember.NextNode).Value.Trim().Split(' ')[2];
                        }
                    }

                    newType.Members.Add(new ParsedMember
                    {
                        VkName = vkName,
                        Type   = memberType,
                        TypeWithoutExtension = typeWithoutExtension,
                        TypeExtension        = typeExtension,
                        IsOptional           = isOptional,
                        FixedLength          = fixedLength,
                        PointerType          = pointerType,
                        NameParts            = memberNameParts,
                        Extension            = extension,
                        Dimensions           = dimensions,
                        Values = values
                    });
                }

                // Special parsing is required for funcpointer parameters
                if (category == TypeCategory.funcpointer)
                {
                    var functionTail = vkType.Element("name").NodesAfterSelf();

                    foreach (var typeElement in functionTail.Where(x => x.NodeType == XmlNodeType.Element).Cast <XElement>())
                    {
                        string pre  = ((XText)typeElement.PreviousNode).Value.Split(',').Last().Trim('(', ')', ';').TrimStart();
                        string post = ((XText)typeElement.NextNode).Value.Split(',').First().Trim('(', ')', ';').TrimEnd();

                        string      paramName   = new string(post.Reverse().TakeWhile(char.IsLetterOrDigit).Reverse().ToArray());
                        string      typeString  = pre + "@" + (post.Substring(0, post.Length - paramName.Length).Trim());
                        string      paramType   = typeElement.Value;
                        PointerType pointerType = MapTypeString(typeString);

                        string paramExtension;

                        string[] paramNameParts = GetNameParts(paramName, out paramExtension, knownExtensions, false);

                        newType.Members.Add(new ParsedMember
                        {
                            VkName      = paramName,
                            Type        = paramType,
                            PointerType = pointerType,
                            NameParts   = paramNameParts,
                            Extension   = paramExtension
                        });
                    }
                }

                typeXml.Add(name, newType);
            }

            var enumXml = new Dictionary <string, ParsedEnum>();

            foreach (var vkEnum in vkXml.Element("registry").Elements("enums"))
            {
                string name = vkEnum.Attribute("name").Value;
                string type = vkEnum.Attribute("type")?.Value;

                string extension;

                string[] nameParts = GetNameParts(name, out extension, knownExtensions);

                var newEnum = new ParsedEnum
                {
                    VkName    = name,
                    Type      = type,
                    NameParts = nameParts,
                    Extension = extension
                };

                foreach (var vkField in vkEnum.Elements("enum"))
                {
                    string fieldName = vkField.Attribute("name").Value;
                    bool   isBitmask = true;
                    string value     = vkField.Attribute("bitpos")?.Value;
                    string comment   = NormaliseComment(vkField.Attribute("comment")?.Value);

                    if (value == null)
                    {
                        isBitmask = false;
                        value     = vkField.Attribute("value").Value;

                        // Special case for mapping C "unsigned long long"
                        // (64-bit unsigned integer) to C# UInt64
                        if (value == "(~0ULL)")
                        {
                            value = "(~0UL)";
                        }

                        value = value.Trim('(', ')');
                    }

                    IEnumerable <string> fieldNameParts = GetEnumFieldNameParts(nameParts, fieldName, knownExtensions);

                    newEnum.Fields.Add(fieldName, new ParsedEnumField
                    {
                        VkName    = fieldName,
                        NameParts = fieldNameParts.ToArray(),
                        IsBitmask = isBitmask,
                        Value     = value,
                        Comment   = comment != null ? new List <string> {
                            comment
                        } : null
                    });
                }

                enumXml.Add(name, newEnum);
            }

            var commandXml = new Dictionary <string, ParsedCommand>();

            foreach (var vkCommand in vkXml.Element("registry").Element("commands").Elements("command"))
            {
                string name = vkCommand.Element("proto").Element("name").Value;
                string type = vkCommand.Element("proto").Element("type").Value;

                string extension;

                string[] nameParts = GetNameParts(name, out extension, knownExtensions);

                string[] verbExceptions = new[] { "cmd", "queue", "device" };

                string verb = verbExceptions.Contains(nameParts[0]) ? nameParts[1] : nameParts[0];

                string[] successCodes = vkCommand.Attribute("successcodes")?.Value?.Split(',');

                var newCommand = new ParsedCommand
                {
                    VkName       = name,
                    Type         = type,
                    NameParts    = nameParts,
                    Extension    = extension,
                    Verb         = verb,
                    SuccessCodes = successCodes
                };

                commandXml.Add(name, newCommand);

                foreach (var vkParam in vkCommand.Elements("param"))
                {
                    var nameElement = vkParam.Element("name");

                    string paramName = nameElement.Value;
                    string paramType = vkParam.Element("type").Value;
                    string optional  = vkParam.Attribute("optional")?.Value;
                    bool   isOptional;
                    bool.TryParse(optional, out isOptional);

                    var         typeNodes   = nameElement.NodesBeforeSelf();
                    PointerType pointerType = GetPointerType(typeNodes);

                    ParsedLen[] dimensions = GetDimensions(name, vkParam, paramName);

                    string paramExtension;

                    string[] paramNameParts = GetNameParts(paramName, out paramExtension, knownExtensions, false);

                    string typeExtension;

                    string[] typeNameParts = GetNameParts(paramType, out typeExtension, knownExtensions, true);

                    string typeWithoutExtension = typeNameParts != null
                                                    ? "Vk" + string.Join("", typeNameParts.Select(CapitaliseFirst))
                                                    : null;

                    newCommand.Params.Add(new ParsedParam
                    {
                        VkName = paramName,
                        Type   = paramType,
                        TypeWithoutExtension = typeWithoutExtension,
                        TypeExtension        = typeExtension,
                        PointerType          = pointerType,
                        NameParts            = paramNameParts,
                        Extension            = paramExtension,
                        IsOptional           = isOptional,
                        Dimensions           = dimensions
                    });
                }
            }

            var vkFeature = vkXml.Element("registry").Elements("feature").Single(x => x.Attribute("api").Value == "vulkan");

            var vkExtensions = vkXml.Element("registry").Element("extensions").Elements("extension").Where(x => x.Attribute("supported").Value == "vulkan");

            var filteredSpec = FilterRequiredElement(typeXml, enumXml, commandXml, vkFeature, vkExtensions, knownExtensions);

            foreach (var defineType in typeXml.Values.Where(x => x.Category == TypeCategory.define && x.VkName.StartsWith("VK_API_VERSION_")))
            {
                IEnumerable <string> fieldNameParts = GetEnumFieldNameParts(null, defineType.VkName, knownExtensions);

                filteredSpec.Constants.Add(defineType.VkName, new ParsedEnumField
                {
                    VkName    = defineType.VkName,
                    NameParts = fieldNameParts.ToArray(),
                    IsBitmask = false,
                    Value     = defineType.Type,
                    Comment   = null
                });
            }

            var vkDocsXmlCache = new DownloadedFileCache(this.tempFilePath, "https://raw.githubusercontent.com/FacticiusVir/SharpVk-Docs/master/Docs/vkDocs.xml");

            var vkDocsXml = XDocument.Load(vkDocsXmlCache.GetFileLocation().Result);

            foreach (var vkDocType in vkDocsXml.Element("docs").Element("types").Elements("type"))
            {
                string typeName = vkDocType.Attribute("name").Value;

                ParsedElement parsedElement = null;

                if (filteredSpec.Enumerations.ContainsKey(typeName))
                {
                    parsedElement = filteredSpec.Enumerations[typeName];
                }
                else if (filteredSpec.Types.ContainsKey(typeName))
                {
                    parsedElement = filteredSpec.Types[typeName];
                }

                if (parsedElement != null)
                {
                    var comment = new List <string> {
                        vkDocType.Attribute("summary").Value
                    };

                    var specification = vkDocType.Element("specification");

                    comment.AddRange(specification.Elements("para").Select(x => x.Value));

                    var description = vkDocType.Element("description");

                    parsedElement.Comment = new List <string>();

                    comment.AddRange(description.Elements("para").Select(x => x.Value));
                    comment.RemoveAll(x => x.StartsWith(".Valid Usage"));

                    int totalLength = 0;

                    foreach (var para in comment)
                    {
                        totalLength += para.Length;

                        if (totalLength > 2000)
                        {
                            break;
                        }
                        else
                        {
                            parsedElement.Comment.Add(NormaliseComment(para));
                        }
                    }

                    IEnumerable <ParsedElement> members = null;

                    var parsedType = parsedElement as ParsedType;
                    var parsedEnum = parsedElement as ParsedEnum;

                    if (parsedType != null)
                    {
                        members = parsedType.Members;
                    }
                    else if (parsedEnum != null)
                    {
                        members = parsedEnum.Fields.Values;
                    }

                    if (members != null)
                    {
                        foreach (var vkDocMember in vkDocType.Element("members").Elements("member"))
                        {
                            string memberName    = vkDocMember.Attribute("name").Value;
                            string memberSummary = NormaliseComment(vkDocMember.Value);

                            var member = members.FirstOrDefault(x => x.VkName == memberName);

                            if (member != null)
                            {
                                member.Comment = new List <string> {
                                    memberSummary
                                };
                            }
                        }
                    }
                }
            }

            foreach (var vkDocCommand in vkDocsXml.Element("docs").Element("commands").Elements("command"))
            {
                string commandName = vkDocCommand.Attribute("name").Value;

                if (filteredSpec.Commands.ContainsKey(commandName))
                {
                    var parsedCommand = filteredSpec.Commands[commandName];

                    parsedCommand.Comment = new List <string> {
                        vkDocCommand.Attribute("summary").Value
                    };
                }
            }

            return(filteredSpec);
        }
Example #21
0
        public Formula BuildFormula(ParsedElement value, Dictionary<string, Entity> declaredVariables)
        {
            if (value == null)
                throw new ArgumentNullException ("value");

            if (value.GetType() == typeof (ParsedForallExpression)) {
                var a = new Forall ();
                var d2 = new Dictionary<string, KAOSTools.MetaModel.Entity> (declaredVariables);
                foreach (var arg in (value as ParsedForallExpression).arguments) {
                    var name = arg.VariableName;
                    var type = GetOrCreateEntity (arg.Type);

                    if (declaredVariables.ContainsKey(name)) {
                        throw new CompilationException (string.Format ("'{0}' is already defined", name));
                    }

                    a.Declarations.Add (new KAOSTools.MetaModel.ArgumentDeclaration() {
                        Name = name,
                        Type = type
                    });
                    d2.Add (name, type);
                }
                a.Enclosed = BuildFormula ((value as ParsedForallExpression).Enclosed, d2);
                return a;
            } else if (value.GetType() == typeof (ParsedExistsExpression)) {
                var a = new Exists ();
                var d2 = new Dictionary<string, KAOSTools.MetaModel.Entity> (declaredVariables);
                foreach (var arg in (value as ParsedExistsExpression).arguments) {
                    var name = arg.VariableName;
                    var type = GetOrCreateEntity (arg.Type);

                    if (declaredVariables.ContainsKey(name)) {
                        throw new CompilationException (string.Format ("'{0}' is already defined", name));
                    }

                    a.Declarations.Add (new KAOSTools.MetaModel.ArgumentDeclaration() {
                        Name = name,
                        Type = type
                    });
                    d2.Add (name, type);
                }
                a.Enclosed = BuildFormula ((value as ParsedExistsExpression).Enclosed, d2);
                return a;
            } else if (value.GetType() == typeof (ParsedStrongImplyExpression)) {
                return new StrongImply () {
                    Left = BuildFormula ((value as ParsedStrongImplyExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedStrongImplyExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedImplyExpression)) {
                return new Imply () {
                    Left = BuildFormula ((value as ParsedImplyExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedImplyExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedEquivalenceExpression)) {
                return new Equivalence () {
                    Left = BuildFormula ((value as ParsedEquivalenceExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedEquivalenceExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedUntilExpression)) {
                return new Until () {
                    Left = BuildFormula ((value as ParsedUntilExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedUntilExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedUnlessExpression)) {
                return new Unless () {
                    Left = BuildFormula ((value as ParsedUnlessExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedUnlessExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedReleaseExpression)) {
                return new Release () {
                    Left = BuildFormula ((value as ParsedReleaseExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedReleaseExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedAndExpression)) {
                return new And () {
                    Left = BuildFormula ((value as ParsedAndExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedAndExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedOrExpression)) {
                return new Or () {
                    Left = BuildFormula ((value as ParsedOrExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedOrExpression).Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedNotExpression)) {
                return new Not () {
                    Enclosed = BuildFormula ((value as ParsedNotExpression).Enclosed, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedNextExpression)) {
                return new Next () {
                    Enclosed = BuildFormula ((value as ParsedNextExpression).Enclosed, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedEventuallyExpression)) {
                return new Eventually () {
                    Enclosed = BuildFormula ((value as ParsedEventuallyExpression).Enclosed, declaredVariables),
                    TimeBound = BuildTimeBound ((value as ParsedEventuallyExpression).TimeBound)
                };

            } else if (value.GetType() == typeof (ParsedEventuallyBeforeExpression)) {
                return new EventuallyBefore () {
                    Left = BuildFormula ((value as ParsedEventuallyBeforeExpression).Left, declaredVariables),
                    Right = BuildFormula ((value as ParsedEventuallyBeforeExpression).Right, declaredVariables),
                    TimeBound = BuildTimeBound ((value as ParsedEventuallyBeforeExpression).TimeBound)
                };

            } else if (value.GetType() == typeof (ParsedGloballyExpression)) {
                return new Globally () {
                    Enclosed = BuildFormula ((value as ParsedGloballyExpression).Enclosed, declaredVariables),
                    TimeBound = BuildTimeBound ((value as ParsedGloballyExpression).TimeBound)
                };

            } else if (value.GetType() == typeof (ParsedPredicateReferenceExpression)) {
                var prel = value as ParsedPredicateReferenceExpression;

                // Check if arguments are all defined
                foreach (var arg in prel.ActualArguments) {
                    if (!declaredVariables.ContainsKey (arg)) {
                        throw new CompilationException (string.Format("'{0}' is not declared ({1}:{2},{3})",
                                                                      arg, prel.Filename, prel.Line, prel.Col));
                    }
                }

                return new PredicateReference () {
                    Predicate = GetOrCreatePredicate (prel, declaredVariables),
                    ActualArguments = prel.ActualArguments
                };
            } else if (value.GetType() == typeof (ParsedInRelationExpression)) {
                var prel = value as ParsedInRelationExpression;
                foreach (var arg in prel.Variables) {
                    if (!declaredVariables.ContainsKey (arg)) {
                        throw new CompilationException (string.Format("'{0}' is not declared", arg));
                    }
                }

                return new RelationReference () {
                    Relation = GetOrCreateRelation (value as ParsedInRelationExpression, declaredVariables),
                    ActualArguments = prel.Variables
                };
            } else if (value.GetType() == typeof (ParsedAttributeReferenceExpression)) {
                var pref = value as ParsedAttributeReferenceExpression;
                if (declaredVariables.ContainsKey(pref.Variable)) {
                    return new AttributeReference () {
                        Variable = pref.Variable,
                        Entity = declaredVariables[pref.Variable],
                        Attribute = GetOrCreateAttribute (value as ParsedAttributeReferenceExpression, declaredVariables[pref.Variable])
                    };
                } else {
                    throw new CompilationException (string.Format ("Variable '{0}' is not declared", pref.Variable));
                }

            } else if (value.GetType() == typeof (ParsedComparisonExpression)) {
                var pref = value as ParsedComparisonExpression;
                ComparisonCriteria criteria;
                if (pref.criteria == ParsedComparisonCriteria.Equals) {
                    criteria = ComparisonCriteria.Equals;
                } else if (pref.criteria == ParsedComparisonCriteria.NotEquals) {
                    criteria = ComparisonCriteria.NotEquals;
                } else if (pref.criteria == ParsedComparisonCriteria.BiggerThan) {
                    criteria = ComparisonCriteria.BiggerThan;
                } else if (pref.criteria == ParsedComparisonCriteria.BiggerThanOrEquals) {
                    criteria = ComparisonCriteria.BiggerThanOrEquals;
                } else if (pref.criteria == ParsedComparisonCriteria.LessThan) {
                    criteria = ComparisonCriteria.LessThan;
                } else if (pref.criteria == ParsedComparisonCriteria.LessThanOrEquals) {
                    criteria = ComparisonCriteria.LessThanOrEquals;
                } else {
                    throw new NotImplementedException ();
                }

                return new ComparisonPredicate () {
                    Criteria = criteria,
                    Left = BuildFormula (pref.Left, declaredVariables),
                    Right = BuildFormula (pref.Right, declaredVariables)
                };
            } else if (value.GetType() == typeof (ParsedStringConstantExpression)) {
                return new StringConstant { Value = Sanitize((value as ParsedStringConstantExpression).Value) };

            } else if (value.GetType() == typeof (ParsedNumericConstantExpression)) {
                return new NumericConstant { Value = (value as ParsedNumericConstantExpression).Value };
            } else if (value.GetType() == typeof (ParsedBoolConstantExpression)) {
                return new BoolConstant { Value = (value as ParsedBoolConstantExpression).Value };
            } else if (value.GetType() == typeof (ParsedVariableReference)) {
                if (!declaredVariables.ContainsKey((value as ParsedVariableReference).Value)) {
                    throw new CompilationException (string.Format ("Variable '{0}' is not declared", (value as ParsedVariableReference).Value));
                }

                return new VariableReference { Name = (value as ParsedVariableReference).Value };
            }

            throw new NotImplementedException (string.Format ("{0} is not yet supported",
                                                              value.GetType ().Name));
        }
Example #22
0
        public Formula BuildFormula(ParsedElement value, Dictionary <string, Entity> declaredVariables)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            if (value.GetType() == typeof(ParsedForallExpression))
            {
                var a  = new Forall();
                var d2 = new Dictionary <string, KAOSTools.Core.Entity> (declaredVariables);
                foreach (var arg in (value as ParsedForallExpression).arguments)
                {
                    var name = arg.VariableName;
                    var type = GetOrCreateEntity(arg.Type);

                    if (declaredVariables.ContainsKey(name))
                    {
                        throw new BuilderException(string.Format("'{0}' is already defined", name),
                                                   value.Filename, value.Line, value.Col);
                    }

                    a.Declarations.Add(new KAOSTools.Core.ArgumentDeclaration()
                    {
                        Name = name,
                        Type = type.Identifier
                    });
                    d2.Add(name, type);
                }
                a.Enclosed = BuildFormula((value as ParsedForallExpression).Enclosed, d2);
                return(a);
            }
            else if (value.GetType() == typeof(ParsedExistsExpression))
            {
                var a  = new Exists();
                var d2 = new Dictionary <string, KAOSTools.Core.Entity> (declaredVariables);
                foreach (var arg in (value as ParsedExistsExpression).arguments)
                {
                    var name = arg.VariableName;
                    var type = GetOrCreateEntity(arg.Type);

                    if (declaredVariables.ContainsKey(name))
                    {
                        throw new BuilderException(string.Format("'{0}' is already defined", name),
                                                   value.Filename, value.Line, value.Col);
                    }

                    a.Declarations.Add(new KAOSTools.Core.ArgumentDeclaration()
                    {
                        Name = name,
                        Type = type.Identifier
                    });
                    d2.Add(name, type);
                }
                a.Enclosed = BuildFormula((value as ParsedExistsExpression).Enclosed, d2);
                return(a);
            }
            else if (value.GetType() == typeof(ParsedStrongImplyExpression))
            {
                return(new StrongImply()
                {
                    Left = BuildFormula((value as ParsedStrongImplyExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedStrongImplyExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedImplyExpression))
            {
                return(new Imply()
                {
                    Left = BuildFormula((value as ParsedImplyExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedImplyExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedEquivalenceExpression))
            {
                return(new Equivalence()
                {
                    Left = BuildFormula((value as ParsedEquivalenceExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedEquivalenceExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedUntilExpression))
            {
                return(new Until()
                {
                    Left = BuildFormula((value as ParsedUntilExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedUntilExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedUnlessExpression))
            {
                return(new Unless()
                {
                    Left = BuildFormula((value as ParsedUnlessExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedUnlessExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedReleaseExpression))
            {
                return(new Release()
                {
                    Left = BuildFormula((value as ParsedReleaseExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedReleaseExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedAndExpression))
            {
                return(new And()
                {
                    Left = BuildFormula((value as ParsedAndExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedAndExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedOrExpression))
            {
                return(new Or()
                {
                    Left = BuildFormula((value as ParsedOrExpression).Left, declaredVariables),
                    Right = BuildFormula((value as ParsedOrExpression).Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedNotExpression))
            {
                return(new Not()
                {
                    Enclosed = BuildFormula((value as ParsedNotExpression).Enclosed, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedNextExpression))
            {
                return(new Next()
                {
                    Enclosed = BuildFormula((value as ParsedNextExpression).Enclosed, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedEventuallyExpression))
            {
                return(new Eventually()
                {
                    Enclosed = BuildFormula((value as ParsedEventuallyExpression).Enclosed, declaredVariables),
                    TimeBound = BuildTimeBound((value as ParsedEventuallyExpression).TimeBound)
                });
            }
            else if (value.GetType() == typeof(ParsedGloballyExpression))
            {
                return(new Globally()
                {
                    Enclosed = BuildFormula((value as ParsedGloballyExpression).Enclosed, declaredVariables),
                    TimeBound = BuildTimeBound((value as ParsedGloballyExpression).TimeBound)
                });
            }
            else if (value.GetType() == typeof(ParsedPredicateReferenceExpression))
            {
                var prel = value as ParsedPredicateReferenceExpression;

                // Check if arguments are all defined
                foreach (var arg in prel.ActualArguments)
                {
                    if (!declaredVariables.ContainsKey(arg))
                    {
                        throw new BuilderException(string.Format("'{0}' is not declared"),
                                                   value.Filename, value.Line, value.Col);
                    }
                }

                return(new PredicateReference()
                {
                    PredicateIdentifier = GetOrCreatePredicate(prel, declaredVariables).Identifier,
                    ActualArguments = prel.ActualArguments
                });
            }
            else if (value.GetType() == typeof(ParsedInRelationExpression))
            {
                var prel = value as ParsedInRelationExpression;
                foreach (var arg in prel.Variables)
                {
                    if (!declaredVariables.ContainsKey(arg))
                    {
                        throw new BuilderException(string.Format("'{0}' is not declared", arg),
                                                   value.Filename, value.Line, value.Col);
                    }
                }

                return(new RelationReference()
                {
                    Relation = GetOrCreateRelation(value as ParsedInRelationExpression, declaredVariables).Identifier,
                    ActualArguments = prel.Variables
                });
            }
            else if (value.GetType() == typeof(ParsedAttributeReferenceExpression))
            {
                var pref = value as ParsedAttributeReferenceExpression;
                if (declaredVariables.ContainsKey(pref.Variable))
                {
                    var boolType = GetOrCreateGivenType("boolean");

                    return(new AttributeReference()
                    {
                        Variable = pref.Variable,
                        Entity = declaredVariables [pref.Variable].Identifier,
                        Attribute = GetOrCreateAttribute(value as ParsedAttributeReferenceExpression,
                                                         declaredVariables [pref.Variable],
                                                         boolType).Identifier
                    });
                }
                else
                {
                    throw new BuilderException(string.Format("Variable '{0}' is not declared", pref.Variable),
                                               value.Filename, value.Line, value.Col);
                }
            }
            else if (value.GetType() == typeof(ParsedComparisonExpression))
            {
                var pref = value as ParsedComparisonExpression;
                ComparisonCriteria criteria;
                if (pref.criteria == ParsedComparisonCriteria.Equals)
                {
                    criteria = ComparisonCriteria.Equals;
                }
                else if (pref.criteria == ParsedComparisonCriteria.NotEquals)
                {
                    criteria = ComparisonCriteria.NotEquals;
                }
                else if (pref.criteria == ParsedComparisonCriteria.BiggerThan)
                {
                    criteria = ComparisonCriteria.BiggerThan;
                }
                else if (pref.criteria == ParsedComparisonCriteria.BiggerThanOrEquals)
                {
                    criteria = ComparisonCriteria.BiggerThanOrEquals;
                }
                else if (pref.criteria == ParsedComparisonCriteria.LessThan)
                {
                    criteria = ComparisonCriteria.LessThan;
                }
                else if (pref.criteria == ParsedComparisonCriteria.LessThanOrEquals)
                {
                    criteria = ComparisonCriteria.LessThanOrEquals;
                }
                else
                {
                    throw new NotImplementedException();
                }

                return(new ComparisonPredicate()
                {
                    Criteria = criteria,
                    Left = BuildFormula(pref.Left, declaredVariables),
                    Right = BuildFormula(pref.Right, declaredVariables)
                });
            }
            else if (value.GetType() == typeof(ParsedStringConstantExpression))
            {
                return(new StringConstant {
                    Value = Sanitize((value as ParsedStringConstantExpression).Value)
                });
            }
            else if (value.GetType() == typeof(ParsedNumericConstantExpression))
            {
                return(new NumericConstant {
                    Value = (value as ParsedNumericConstantExpression).Value
                });
            }
            else if (value.GetType() == typeof(ParsedBoolConstantExpression))
            {
                return(new BoolConstant {
                    Value = (value as ParsedBoolConstantExpression).Value
                });
            }
            else if (value.GetType() == typeof(ParsedVariableReference))
            {
                if (!declaredVariables.ContainsKey((value as ParsedVariableReference).Value))
                {
                    throw new BuilderException(string.Format("Variable '{0}' is not declared", (value as ParsedVariableReference).Value),
                                               value.Filename, value.Line, value.Col);
                }

                return(new VariableReference {
                    Name = (value as ParsedVariableReference).Value
                });
            }

            throw new NotImplementedException(string.Format("{0} is not yet supported",
                                                            value.GetType().Name));
        }