예제 #1
0
        private Value CreateRoutineArgument(Function func, int i, ParamDeclaration param)
        {
            TypeRef type   = GetLLVMType(param.type);
            Value   alloca = builder.BuildEntryBlockAlloca(func, type, param.name);

            builder.BuildStore(func.GetParameter((uint)i), alloca);

            Debug.Assert(alloca != null);
            valuemap.AddValue(param, alloca);
            return(alloca);
        }
예제 #2
0
        /// <summary>
        /// Finds a declaration (excluding methods) with the specified name
        /// </summary>
        /// <param name="name">The name of the declaration to search for.</param>
        /// <returns>The declaration with the specified name or null if not found.</returns>
        public IDeclaration GetDeclaration(string name)
        {
            // Project
            if (Project == null)
            {
                return(null);
            }

            IDeclaration superGlobalDeclaration = Project.GetDeclaration(name);

            if (superGlobalDeclaration != null)
            {
                return(superGlobalDeclaration);
            }

            // Sprite
            if (CurrentSprite == null)
            {
                return(null);
            }

            ITypedDeclaration globalDeclaration = CurrentSprite.GetDeclaration(name);

            if (globalDeclaration != null)
            {
                return(globalDeclaration);
            }

            // Methods
            if (CurrentScope == null)
            {
                return(null);
            }

            // Method params
            ParamDeclaration methodParam = (CurrentScope.Method as MethodDeclaration)?.FindParam(name);

            if (methodParam != null)
            {
                return(methodParam);
            }

            // Scoped variables
            return(CurrentScope.Search(name));
        }
예제 #3
0
        public Type Visit(ParamDeclaration node)
        {
            var idList = node[0];
            var type   = Visit((dynamic)node[1]);

            foreach (var n in idList)
            {
                var name = n.AnchorToken.Lexeme;
                if (currentFunctionParamTable.Contains(name))
                {
                    throw new SemanticError(
                              "Parameter " + name
                              + " already exists in function " + localscope,
                              n.AnchorToken);
                }
                currentFunctionParamTable[name] = type;
            }
            return(Type.VOID);
        }
예제 #4
0
        public string Visit(ParamDeclaration node)
        {
            var result  = "";
            var idList  = node[0];
            var type    = Visit((dynamic)node[1]);
            var counter = 0;

            foreach (var n in idList)
            {
                counter++;
                var name = n.AnchorToken.Lexeme;
                result += CILTypes[type] + " " + name;
                if (counter >= globalFunctionTable[localscope])
                {
                    result += "";
                }
            }
            return(result);
        }
예제 #5
0
        public void LoadbuiltinDecls()
        {
            var tfloat  = FloatType.Single;
            var tint    = IntegerType.Single;
            var tstring = StringType.Single;
            var tarray  = ArrayType.Single;
            var p       = new ParamDeclaration("x", tfloat);

            string[] floatFuncs   = { "cos", "sin", "trunc", "round", "frac", "exp" };
            string[] intordFuncs  = { "succ", "pred" };
            string[] stringsFuncs = { "writeln", "readln" };

            foreach (var s in floatFuncs)
            {
                CreateBuiltinFunction(new RoutineDeclaration(s, new ParametersSection(
                                                                 new DeclarationList(new ParamDeclaration("x", tfloat))), tfloat));
            }

            foreach (var s in intordFuncs)
            {
                CreateBuiltinFunction(new RoutineDeclaration(s, new ParametersSection(
                                                                 new DeclarationList(new ParamDeclaration("x", null))), tint));
            }

            foreach (var s in stringsFuncs)
            {
                CreateBuiltinFunction(new RoutineDeclaration(s, new ParametersSection(
                                                                 new DeclarationList(new ParamDeclaration("x", tstring)))));
            }

            CreateBuiltinFunction(new RoutineDeclaration("assigned", new ParametersSection(
                                                             new DeclarationList(new ParamDeclaration("p", PointerType.Single))), BoolType.Single));

            CreateBuiltinFunction(new RoutineDeclaration("length", new ParametersSection(
                                                             new DeclarationList(new ParamDeclaration("x", tarray))), tint));

            var decls = new DeclarationList(new ParamDeclaration("arr", tarray));

            decls.Add(new ParamDeclaration("len", tint));
            CreateBuiltinFunction(new RoutineDeclaration("setlength", new ParametersSection(decls)));
        }
예제 #6
0
        public Node ParamDeclaration()
        {
            var result = new ParamDeclaration();
            var idList = new IdentifierList();

            idList.Add(new Identifier()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            });
            while (CurrentToken != TokenCategory.TWOPOINTS)
            {
                Expect(TokenCategory.COMA);
                idList.Add(new Identifier()
                {
                    AnchorToken = Expect(TokenCategory.IDENTIFIER)
                });
            }
            result.Add(idList);
            Expect(TokenCategory.TWOPOINTS);
            result.Add(ChimeraType());
            Expect(TokenCategory.SEMICOL);
            return(result);
        }
예제 #7
0
 public virtual T Visit(ParamDeclaration node)
 {
     Visit((ValueDeclaration)node);
     return(traverse(node.init));
 }
예제 #8
0
        private IEnumerable <ParamActionDefinition> GenerateParameter(CommandDeclaration command, MethodDefinition newMethod, ParamDeclaration parameter, int parameterIndex, bool isEnumeratePattern, bool isLastParamArray, bool lastParamReturns, List <MethodAction> marshalFromActions, List <MethodAction> marshalMidActions, List <MethodAction> marshalToActions, List <Action <ExpressionBuilder> > marshalledValues, Func <string, Action <ExpressionBuilder> > getHandle, Dictionary <string, Action <ExpressionBuilder> > handleLookup)
        {
            string paramName = parameter.Name;
            var    paramType = typeData[parameter.Type.VkName];

            string GetMarshalledName(string baseName)
            {
                return("marshalled" + baseName.TrimStart('@').FirstToUpper());
            }

            List <ParamActionDefinition> result = new List <ParamActionDefinition>();

            if (parameterIndex >= command.HandleParamsCount)
            {
                if (lastParamReturns && parameterIndex == command.Params.Count() - 2 && isEnumeratePattern)
                {
                    newMethod.MemberActions.Add(new DeclarationAction
                    {
                        MemberType = paramType.Name,
                        MemberName = paramName
                    });

                    marshalledValues.Add(AddressOf(Variable(paramName)));

                    var patternInfo = new MemberPatternInfo();

                    this.memberPatternRules.ApplyFirst(command.Params, command.Params.Last(), new MemberPatternContext(command.Verb, true, command.Extension, getHandle, command.VkName), patternInfo);

                    string marshalledName = GetMarshalledName(patternInfo.Interop.Name);

                    marshalMidActions.Add(new AssignAction
                    {
                        Type             = AssignActionType.Alloc,
                        MemberType       = patternInfo.InteropFullType.TrimEnd('*'),
                        TargetExpression = Variable(marshalledName),
                        LengthExpression = Cast("uint", Variable(paramName))
                    });
                }
                else if (lastParamReturns && parameterIndex == command.Params.Count() - 1)
                {
                    if (isLastParamArray)
                    {
                        var patternInfo = new MemberPatternInfo();

                        this.memberPatternRules.ApplyFirst(command.Params, parameter, new MemberPatternContext(command.Verb, true, command.Extension, getHandle, command.VkName), patternInfo);

                        string marshalledName = GetMarshalledName(patternInfo.Interop.Name);

                        marshalToActions.Add(new DeclarationAction
                        {
                            MemberType = patternInfo.InteropFullType,
                            MemberName = marshalledName
                        });

                        var newMarshalFrom = patternInfo.MarshalFrom.Select(action => action(targetName => Variable("result"), valueName => Variable(GetMarshalledName(valueName)))).ToArray();

                        if (!isEnumeratePattern)
                        {
                            var lengthExpression = newMarshalFrom.OfType <AssignAction>().First(x => x.IsLoop).LengthExpression;

                            marshalToActions.Add(new AssignAction
                            {
                                Type             = AssignActionType.Alloc,
                                MemberType       = patternInfo.InteropFullType.TrimEnd('*'),
                                TargetExpression = Variable(marshalledName),
                                LengthExpression = lengthExpression
                            });
                        }

                        marshalFromActions.AddRange(newMarshalFrom);

                        marshalledValues.Add(Variable(marshalledName));

                        newMethod.ReturnType = patternInfo.ReturnType ?? patternInfo.Public.Single().Type;
                    }
                    else
                    {
                        var patternInfo = new MemberPatternInfo();

                        var effectiveParam = new ParamDeclaration
                        {
                            Name       = parameter.Name,
                            Type       = parameter.Type.Deref(),
                            Dimensions = parameter.Dimensions,
                            VkName     = parameter.VkName
                        };

                        this.memberPatternRules.ApplyFirst(command.Params, effectiveParam, new MemberPatternContext(command.Verb, true, command.Extension, getHandle, command.VkName), patternInfo);

                        string marshalledName = GetMarshalledName(patternInfo.Interop.Name);

                        marshalToActions.Add(new DeclarationAction
                        {
                            MemberType = patternInfo.InteropFullType,
                            MemberName = marshalledName
                        });

                        marshalFromActions.AddRange(patternInfo.MarshalFrom.Select(action => action(targetName => Variable("result"), valueName => Variable(GetMarshalledName(valueName)))));

                        marshalledValues.Add(AddressOf(Variable(marshalledName)));

                        newMethod.ReturnType = patternInfo.Public.Single().Type;
                    }
                }
                else
                {
                    var patternInfo = new MemberPatternInfo();

                    this.memberPatternRules.ApplyFirst(command.Params, parameter, new MemberPatternContext(command.Verb, true, command.Extension, getHandle, command.VkName), patternInfo);

                    var actionList = marshalToActions;

                    Func <string, Action <ExpressionBuilder> > getValue = valueName => Variable(valueName);

                    foreach (var publicMember in patternInfo.Public)
                    {
                        result.Add(new ParamActionDefinition
                        {
                            Param = new ParamDefinition
                            {
                                Name         = publicMember.Name,
                                Comment      = publicMember.Comment,
                                Type         = publicMember.Type,
                                DefaultValue = publicMember.DefaultValue
                            }
                        });
                    }

                    if (patternInfo.MarshalTo.Any())
                    {
                        string marshalledName = patternInfo.Interop.Name;

                        if (patternInfo.Public.Any())
                        {
                            marshalledName = GetMarshalledName(patternInfo.Interop.Name);
                        }

                        var newMarshalToActions = patternInfo.MarshalTo.Select(action => action(targetName => Variable(marshalledName), getValue));

                        var  lastParam         = command.Params.Last();
                        bool isLenForLastParam = lastParamReturns && lastParam.Dimensions != null && lastParam.Dimensions.Any(dimension => dimension.Type == LenType.Expression && this.tokenCheck.Check(dimension.Value, parameter.VkName));

                        if (!isLenForLastParam &&
                            newMarshalToActions.Count() == 1 &&
                            newMarshalToActions.First() is AssignAction newAssignAction &&
                            newAssignAction.Type == AssignActionType.Assign &&
                            !newAssignAction.IsLoop)
                        {
                            marshalledValues.Add(newAssignAction.ValueExpression);
                        }
                        else
                        {
                            marshalToActions.Add(new DeclarationAction
                            {
                                MemberType = patternInfo.InteropFullType,
                                MemberName = marshalledName
                            });

                            marshalledValues.Add(Variable(marshalledName));

                            actionList.AddRange(newMarshalToActions);
                        }
                    }

                    foreach (var lookup in patternInfo.HandleLookup)
                    {
                        handleLookup[lookup.Item1] = lookup.Item2(getValue);
                    }
                }
            }
예제 #9
0
 public override bool Visit(ParamDeclaration node)
 {
     Visit((ValueDeclaration)node);
     TraversePrint(node.init);
     return(true);
 }
예제 #10
0
 public ParamInstruction(ParamDeclaration declaration)
 {
     Declaration = declaration;
 }