private HomeItemViewModel Parse(string source, long timer, bool generateAssembly = false) { string error = null; var vm = new HomeItemViewModel { Source = source, Timer = timer }; var input = InputModule.create(vm.Source); var tokensResult = Lexer.tokenize(input); if (tokensResult.IsError) { error = tokensResult.ErrorValue; goto End; } var tokens = tokensResult.ResultValue; var programResult = Parser.parse(tokens); if (programResult.IsError) { error = programResult.ErrorValue; goto End; } var program = programResult.ResultValue; vm.Ast = JsonConvert.SerializeObject(_astBuilder.Build(program)); var symbolTableResult = SymbolCollector.create(program); if (symbolTableResult.IsError) { error = symbolTableResult.ErrorValue; goto End; } var symbolTable = symbolTableResult.ResultValue; var typeCheckerResult = TypeChecker.check(symbolTable, program); if (typeCheckerResult.IsError) { error = typeCheckerResult.ErrorValue; goto End; } var variableInitializationCheckerResult = VariableInitializationChecker.check(program); if (variableInitializationCheckerResult.IsError) { error = variableInitializationCheckerResult.ErrorValue; goto End; } var writeLineFunc = FuncConvert.ToFSharpFunc <int>(i => vm.PrintfnLog += i + "\n"); var environment = EnvironmentModule.create(symbolTable, program, writeLineFunc, vm.Timer); var interpreterResult = Interpreter.interpret(environment); if (interpreterResult.IsError) { error = interpreterResult.ErrorValue; goto End; } var assemblyResult = ILBuilder.build(symbolTable, program); if (assemblyResult.IsError) { error = assemblyResult.ErrorValue; goto End; } var assembly = assemblyResult.ResultValue; vm.Il = JsonConvert.SerializeObject(_ilBuilder.Build(assembly)); if (generateAssembly) { var applicationResult = CodeGenerator.generate(assembly); if (applicationResult.IsError) { error = applicationResult.ErrorValue; goto End; } vm.Application = applicationResult.ResultValue; } End: if (error != null) { vm.Error = error; } return(vm); }