public static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Muftec 1.0"); Console.WriteLine("Put some help documentation here, eventually."); Console.WriteLine("----------------------------------------"); Console.WriteLine("muftec -x <source file> -- Execute a source file"); Console.WriteLine("muftec -c <source file> -- Compiles a source file to a executable"); Console.WriteLine(" [<out file>] -- (Optional) Define the output filename"); } else if (args[0] == "-x") { // Run a program var text = File.ReadAllText(args[1]); var output = Compiler.ParseString(text); if (output == null) { Console.WriteLine("Could not continue."); return; } var system = new MuftecLibSystem(); var bcl = new MuftecBaseClassLibrary(); system.AddLibrary(bcl); var queue = new Queue<MuftecStackItem>(); queue.Enqueue(new MuftecStackItem(output.MainFunctionName, MuftecAdvType.Function)); var runtime = new Stack<MuftecStackItem>(); system.Run(queue, runtime, output.Variables, output.Functions); } else if (args[0] == "-c") { // Compile a program var text = File.ReadAllText(args[1]); var output = Compiler.ParseString(text); if (output == null) { Console.WriteLine("Could not continue."); return; } string filename; if (args.Length > 2) { filename = args[2]; } else { filename = Path.GetFileNameWithoutExtension(args[1]); } Fabricator.SaveAssembly(output, filename + ".exe", true); } else { Console.WriteLine("Invalid switch specified."); } }
public Fabricator(Compiler.CompilerOutput output) { _output = output; _funcCache = new Dictionary<string, Emit<MuftecFunction>>(); // Create a BCL-based system for compile-time opcode referencing _system = new MuftecLibSystem(); var bcl = new MuftecBaseClassLibrary(); _system.AddLibrary(bcl); }
public static void Main(string[] args) { var evalCount = 100000; var appRun = new StringBuilder(); appRun.AppendLine(": main"); for (var i = 0; i < evalCount; i++) { appRun.Append("100 100 + pop "); } appRun.AppendLine(); appRun.AppendLine(";"); var runStr = appRun.ToString(); var buildTimer = new Stopwatch(); buildTimer.Start(); //// Create Muftec base system //// var system = new MuftecLibSystem(); var bcl = new MuftecBaseClassLibrary(); system.AddLibrary(bcl); var execStack = new Queue<MuftecStackItem>(); var runStack = new Stack<MuftecStackItem>(); var variables = new List<string>(); var functions = new Dictionary<string, Queue<MuftecStackItem>>(); var output = Compiler.ParseString(runStr); variables = output.Variables; functions = output.Functions; execStack.Enqueue(output.MainFunction); buildTimer.Stop(); Console.WriteLine("Build stage took: {0} ticks", buildTimer.Elapsed); var runTimer = new Stopwatch(); runTimer.Start(); system.Run(execStack, runStack, variables, functions); runTimer.Stop(); Console.WriteLine("Execution stage took: {0} ticks", runTimer.Elapsed); var stickTimer = new Stopwatch(); stickTimer.Start(); var outval = 0; for (var i = 0; i < evalCount; i++) { outval += 100 + 100; } stickTimer.Stop(); Console.WriteLine("Comparison stage took: {0} ticks", stickTimer.Elapsed); /* //// Sample code //// Console.WriteLine("Running sample code."); execQueue.Enqueue(new MuftecStackItem(6)); execQueue.Enqueue(new MuftecStackItem(4)); execQueue.Enqueue(new MuftecStackItem("-", MuftecAdvType.OpCode)); execQueue.Enqueue(new MuftecStackItem("print", MuftecAdvType.OpCode)); var runStack = new Stack<MuftecStackItem>(); try { system.Run(execQueue, runStack); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } Console.WriteLine(); //// Compiler //// Console.WriteLine("Running compiler."); var text = System.IO.File.ReadAllText("Sample.muf"); try { var output = Compiler.ParseString(text); variables = output.Variables; functions = output.Functions; execQueue = new Queue<MuftecStackItem>(); execQueue.Enqueue(new MuftecStackItem(output.MainFunction, MuftecAdvType.Function)); } catch (MuftecCompilerException ex) { Console.WriteLine("Compiler exception: " + ex.Message); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } finally { Console.WriteLine("Executing compiled code."); runStack = new Stack<MuftecStackItem>(); try { system.Run(execQueue, runStack, variables, functions); } catch (MuftecGeneralException ex) { Console.WriteLine("Muftec exception: " + ex.Message); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } Console.WriteLine(); Console.WriteLine("Complete."); }*/ Console.WriteLine(); Console.WriteLine("Press any key."); Console.ReadKey(true); }