Exemple #1
0
        private static CompiledResult RunCompiled(Yolol.Grammar.AST.Program ast, int max, int iters)
        {
            var compileTimer = new Stopwatch();

            compileTimer.Start();
            var externalsMap = new ExternalsMap();
            var compiled     = ast.Compile(externalsMap, max, 1024, null, false);

            compileTimer.Stop();

            var externals = new Value[externalsMap.Count];

            Array.Fill(externals, Number.Zero);
            var internals = new Value[compiled.InternalsMap.Count];

            Array.Fill(internals, Number.Zero);

            var execTimer = new Stopwatch();

            execTimer.Start();
            compiled.Run(internals, externals, iters, default);
            execTimer.Stop();

            return(new CompiledResult(compiled.ProgramCounter, compileTimer.Elapsed, execTimer.Elapsed, compiled.InternalsMap, internals, externalsMap, externals));
        }
Exemple #2
0
        private static InterpretResult RunInterpreted(Yolol.Grammar.AST.Program ast, int max, int iters)
        {
            int CheckPc(int pc)
            {
                if (pc >= max)
                {
                    return(0);
                }
                if (pc < 0)
                {
                    return(0);
                }
                return(pc);
            }

            var pc = 0;
            var nt = new DeviceNetwork();
            var st = new MachineState(nt, (ushort)max, 1024);

            var timer = new Stopwatch();

            timer.Start();
            for (var i = 0; i < iters; i++)
            {
                if (pc >= ast.Lines.Count)
                {
                    pc++;
                }
                else
                {
                    try
                    {
                        pc = ast.Lines[pc].Evaluate(pc, st);
                    }
                    catch (ExecutionException)
                    {
                        pc++;
                    }
                }

                pc = CheckPc(pc);
            }

            return(new InterpretResult(pc + 1, timer.Elapsed, nt, st));
        }
        public IExecutionState Prepare(Yolol.Grammar.AST.Program program, string done)
        {
            var internalsMap = new InternalsMap();
            var externalsMap = new ExternalsMap();
            var lines        = new List <Func <ArraySegment <Value>, ArraySegment <Value>, int> >();

            for (var i = 0; i < program.Lines.Count; i++)
            {
                lines.Add(program.Lines[i].Compile(
                              i + 1,
                              Math.Max(20, program.Lines.Count),
                              internalsMap,
                              externalsMap
                              ));
            }

            return(new ExecutionState(lines, internalsMap, externalsMap, done));
        }
Exemple #4
0
        public CompareInterpreter()
        {
            _ast = Parse(
                ":done++ b=97 c=89",
                ":o++ :done++",
                ":done++",
                "i=127-1 _=(i/3%1==0)*i/3>1+(i/5%1==0)*i/5>1+(i/7%1==0)*i/7>1 a=i/11%1==0",
                "_+=a*i/11>1+(i/13%1==0)*i/13>1+(i/17%1==0)*i/17>1+(i/19%1==0)*i/19>1",
                "_+=(i/23%1==0)*i/23>1+(i/29%1==0)*i/29>1+(i/31%1==0)*i/31>1a=i/37%1==0",
                "_+=a*i/37>1+(i/41%1==0)*i/41>1+(i/43%1==0)*i/43>1+(i/47%1==0)*i/47>1",
                "_+=(i/53%1==0)*i/53>1+(i/59%1==0)*i/59>1+(i/61%1==0)*i/61>1a=i/67%1==0",
                "_+=a*i/67>1+(i/71%1==0)*i/71>1+(i/73%1==0)*i/73>1+(i/79%1==0)*i/79>1",
                "_+=(i/83%1==0)*i/83>1+(i/c%1==0)*i/c>1+(i/b%1==0)*i/b>1:o+=_<1:done++",
                "z=:o :done++goto4"
                );

            _network = new Network((Number)1, (Number)2, (Number)0);
            _state   = new MachineState(_network);

            var types = new Dictionary <VariableName, Yolol.Execution.Type> {
                { new VariableName("a"), Yolol.Execution.Type.Number },
                { new VariableName("b"), Yolol.Execution.Type.Number },
                { new VariableName("c"), Yolol.Execution.Type.Number },
                { new VariableName("d"), Yolol.Execution.Type.Number },
                { new VariableName("e"), Yolol.Execution.Type.Number },
                { new VariableName("f"), Yolol.Execution.Type.Number },
            };
            var internalsPerLine = new InternalsMap();
            var externalsPerLine = new ExternalsMap();

            _compiledLines = new Func <ArraySegment <Value>, ArraySegment <Value>, LineResult> [_ast.Lines.Count];
            for (var i = 0; i < _ast.Lines.Count; i++)
            {
                _compiledLines[i] = _ast.Lines[i].Compile(i + 1, 20, 1024, internalsPerLine, externalsPerLine, types);
            }

            _internals = new Value[internalsPerLine.Count];
            _externals = new Value[externalsPerLine.Count];

            _compiledProgramLine = _ast.Compile(new ExternalsMap(), 20, 1024, types);
        }
Exemple #5
0
        private static Failure?CheckChipLevel(YololChip level, Yolol.Grammar.AST.Program program)
        {
            if (level is YololChip.Unknown or YololChip.Professional)
            {
                return(null);
            }

            var statements = from line in program.Lines
                             from stmt in line.Statements.Statements
                             select stmt;

            var check = new ChipLevelChecker(level);

            foreach (var statement in statements)
            {
                if (!check.Visit(statement))
                {
                    return(new Failure(FailureType.InvalidProgramForChipType, null, null));
                }
            }

            return(null);
        }
Exemple #6
0
 public static async Task <IExecutionState> Prepare(this IYololExecutor executor, Yolol.Grammar.AST.Program program, string done = ":done")
 {
     return((await executor.Prepare(new[] { program }, done)).Single());
 }
 public IExecutionState Prepare(Yolol.Grammar.AST.Program program, string done)
 {
     return(new InterpreterState(program, done));
 }