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)); }
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)); }
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); }
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); }
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)); }