Exp TranslateDeclaration(FunctionDeclaration dec)
            {
                List <SymbolTable.Symbol> list = new List <SymbolTable.Symbol>();

                for (FunctionDeclaration d = dec; d != null; d = d.Next)
                {
                    if (Env.ValueEnvironment[d.Name] != null && Env.ValueEnvironment[d.Name] is StandardFunctionEntry)
                    {
                        Error.Report(d.Pos, "Function in standard libaray cannot be redefined");
                    }
                    else if (list.Contains(d.Name))
                    {
                        Error.Report(d.Pos, "Function cannot be redefined in a sequence");
                    }
                    else
                    {
                        list.Add(d.Name);
                        Types.Type      result  = d.Result == null ? Types.Type._void : TranslateType(d.Result).Actual;
                        Types.RECORD    formals = TranslateTypeFields(d.Param);
                        Label           label   = new Label(d.Name + "_" + Count++.ToString());
                        Translate.Level level   = new Translate.Level(Level, label, BoolList.BuildFromFieldList(d.Param));
                        Env.ValueEnvironment[d.Name] = new FunctionEntry(level, label, formals, result);
                    }
                }
                for (FunctionDeclaration d = dec; d != null; d = d.Next)
                {
                    FunctionEntry function = Env.ValueEnvironment[d.Name] as FunctionEntry;
                    Env.ValueEnvironment.BeginScope();
                    Env.LoopEnvironment.BeginScope();
                    Translate.Level backup = Level;
                    Level = function.Level;
                    Translate.AccessList al = Level.Formals.Tail;
                    for (FieldList field = d.Param; field != null; field = field.Tail, al = al.Tail)
                    {
                        Types.Type type = Env.TypeEnvironment[field.Type] as Types.Type;
                        if (type == null)
                        {
                            Error.Report(field.Pos, "Undefined type '" + field.Name + "'");
                        }
                        else
                        {
                            Translate.Access access = new Translate.Access(Level, al.Head.Acc);
                            Env.ValueEnvironment[field.Name] = new VariableEntry(access, type.Actual);
                        }
                    }
                    ExpressionType et = TranslateExpression(d.Body);
                    Translate.ProcessEntryExit(Level, et.Exp, !(et.Type.CoerceTo(Types.Type._void)));
                    if (!et.Type.CoerceTo((Env.ValueEnvironment[d.Name] as FunctionEntry).Result))
                    {
                        Error.Report(d.Result != null ? d.Result.Pos : d.Body.Pos, "Type mismatched for function return value");
                    }
                    Env.ValueEnvironment.EndScope();
                    Env.LoopEnvironment.EndScope();
                    Level = backup;
                }
                return(Translate.TranslateNoOp());
            }
        public override List <string> ExecuteSemanticAction(Stack <SemanticRecord> semanticRecordTable, Stack <SymbolTable> symbolTable, IToken lastToken)
        {
            SymbolTable currentTable = symbolTable.Peek();

            Entry funcEntry = new FunctionEntry(currentTable, lastToken.getSemanticName(), new ClassEntry(""));

            symbolTable.Push(funcEntry.getChild());

            return(new List <string>());
        }
Example #3
0
        public async Task EmitArgumentWrites(CodegenContext context, FunctionEntry function)
        {
            var args = function.Type.Arguments;

            for (int i = 0; i < args.Count; ++i)
            {
                var arg = args[i];
                await context.EmitLine($"{CodeGenerator.DataBuffer}.write<{arg.Type}>({arg.Name});");
            }
        }
        public override List <string> ExecuteSemanticAction(Stack <SemanticRecord> semanticRecordTable, Stack <SymbolTable> symbolTable, IToken lastToken, MoonCodeResult moonCode)
        {
            SymbolTable currentTable = symbolTable.Peek();

            LinkedList <Variable> foundParameters = new LinkedList <Variable>();

            bool          entryCreated = false;
            string        funcName     = string.Empty;
            List <string> errors       = new List <string>();

            // Iterate over the semantic stack and consume records relevant to this function
            while (!entryCreated)
            {
                SemanticRecord topRecord = semanticRecordTable.Pop();

                // Handle the record depending on its type
                switch (topRecord.recordType)
                {
                case RecordTypes.Variable:
                    // Encountered paramenters
                    foundParameters.AddFirst(topRecord.getVariable());
                    break;

                case RecordTypes.IdName:
                    // The name of this function
                    funcName = topRecord.getValue();
                    break;

                case RecordTypes.TypeName:
                    // If we encounter a type we are done collecting and can create the entry
                    FunctionEntry funcEntry = new FunctionEntry(currentTable, funcName, topRecord.getType());
                    funcEntry.AddParameters(foundParameters);

                    // Push the function's scope to the stack of symbol tables
                    symbolTable.Push(funcEntry.getChild());

                    entryCreated = true;

                    break;

                default:
                    // This should only fail if there is an error in the grammar.
                    errors.Add("Grammar error, parsed rule that placed unexpected character on semantic stack");
                    break;
                }
            }

            return(errors);
        }
Example #5
0
        public override object CreateNewInstance(SelectItem item)
        {
            FunctionEntry functionEntry = item.Value as FunctionEntry;

            Debug.Assert(functionEntry != null);

            ActivityFactory factory  = Parent.EditingContext.Services.GetService <ActivityFactory>();
            Activity        function = factory.CreateActivity(functionEntry.Create, Parent.GetModelProperty());

            // Create InArgument instance wrapping the activity
            Type       genericType = typeof(InArgument <>).MakeGenericType(functionEntry.ReturnType);
            InArgument argument    = Activator.CreateInstance(genericType, function) as InArgument;

            return(argument);
        }
Example #6
0
        public string GenerateTypelessArgumentList(FunctionEntry function)
        {
            StringBuilder build = new StringBuilder();
            var           args  = function.Type.Arguments;

            for (int i = 0; i < args.Count; ++i)
            {
                var arg = args[i];
                build.Append($"{arg.Name}");
                if (i < args.Count - 1)
                {
                    build.Append(", ");
                }
            }
            return(build.ToString());
        }
Example #7
0
        protected override double RunDisruptorPass(int passNumber)
        {
            stepThreeFunctionHandler.reset();

            Task.Factory.StartNew(stepOneBatchConsumer.Run);
            Task.Factory.StartNew(stepTwoBatchConsumer.Run);
            Task.Factory.StartNew(stepThreeBatchConsumer.Run);

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            long operandTwo = OPERAND_TWO_INITIAL_VALUE;

            for (long i = 0; i < ITERATIONS; i++)
            {
                FunctionEntry entry = producerBarrier.NextEntry();
                entry.OperandOne = i;
                entry.OperandTwo = operandTwo--;
                producerBarrier.Commit(entry);
            }

            long expectedSequence = ringBuffer.Cursor;

            while (stepThreeBatchConsumer.Sequence < expectedSequence)
            {
                // busy spin
            }

            stopwatch.Stop();
            double opsPerSecond = ITERATIONS / stopwatch.Elapsed.TotalSeconds;

            stepOneBatchConsumer.Halt();
            stepTwoBatchConsumer.Halt();
            stepThreeBatchConsumer.Halt();

            Assert.AreEqual(expectedResult, stepThreeFunctionHandler.getStepThreeCounter());

            return(opsPerSecond);
        }
 private Expression.Expression ConvertFunction(FunctionNode node)
 {
     if (FunctionTable.IsValidFunction(node.FunctionName))
     {
         //check number of arguments
         FunctionEntry entry = FunctionTable.GetFunctionEntry(node.FunctionName);
         if (entry.ArgNumber != node.Arguments.Count)
         {
             compilerErrors.Add(new ErrorMessage($"{entry.ArgNumber.ToString()} аргументов ожидалось в функции \"{node.FunctionName}", node.Line, node.Position));
             return(null);
         }
         List <Expression.Expression> arguments = new List <Expression.Expression>();
         foreach (var argument in node.Arguments)
         {
             arguments.Add(ConvertToExpression(argument));
         }
         return(new Function(entry, arguments));
     }
     else
     {
         compilerErrors.Add(new ErrorMessage($"Неизвестная функция \"{node.FunctionName}\"", node.Line, node.Position));
         return(null);
     }
 }
 // Get the parameters for a function
 private IEnumerable <Entry> GetParameters(FunctionEntry enty)
 {
     return(enty.getChild().GetEntries().Where(x => x.getKind() == EntryKinds.parameter));
 }