static void Run(RunOptions options) { VerifyFileExists(options.File); string programString = null; TimeAction(() => programString = File.ReadAllText(options.File), options.PrintTiming, "Read source file in {0} ms."); Lexer lexer = new Lexer(options.ProgramWidth, options.ProgramHeight); ExpressionProgram expressionProgram = null; TimeAction(() => expressionProgram = lexer.Lex(programString), options.PrintTiming, "Performed lexing in {0} ms."); InstructionProgram instructionProgram = null; TimeAction(() => instructionProgram = new InstructionProgram(expressionProgram), options.PrintTiming, "Performed parsing in {0} ms."); Interpreter interpreter; if (options.DisableInterpreterOutput) { interpreter = new Interpreter(new NoOutputEnvironment()); } else { interpreter = new Interpreter(); } TimeAction(() => interpreter.Execute(instructionProgram), options.PrintTiming, "Executed program in {0} ms."); }
public ExecutionContext(InstructionProgram program) { Program = program; MutatedInstructions = new Instruction[program.Width, program.Height]; MutatedExpressions = new char?[program.Width, program.Height]; Stack = new Stack <int>(); IsRunning = true; ExecutionDirection = ExecutionDirection.Right; InstructionPointer = new InstructionPointer(0, 0); }
public void Execute(InstructionProgram program) { ExecutionContext context = new ExecutionContext(program); while (context.IsRunning) { Instruction currentInstruction = context.GetCurrentInstruction(); currentInstruction(context, _environment); context.AdvanceInstructionPointer(); } Console.WriteLine(); }