public static int Main(string[] args) { var trace = false; var show_help = false; var options = new OptionSet { { "t|trace-parsing", "Produce a trace of the parse process.", v => trace = v != null }, { "h|help", "show this message and exit", v => show_help = v != null } }; List <string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.WriteLine(e.Message); Console.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return(1); } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " files ..."); Console.WriteLine("Compile a Flabbergast file to native CLR."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return(0); } if (files.Count == 0) { Console.WriteLine("Perhaps you wish to compile some source files?"); return(1); } var collector = new ConsoleCollector(); foreach (var filename in files) { var parser = Parser.Open(filename); parser.Trace = trace; var dll_name = Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll"); var type_name = Regex.Replace("Flabbergast.Library." + Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.') + Path.GetFileNameWithoutExtension(filename), "\\.+", "."); var assembly_name = new AssemblyName(type_name) { CodeBase = "file://" + Path.GetDirectoryName(filename) }; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave); CompilationUnit.MakeDebuggable(assembly_builder); var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true); var unit = new CompilationUnit(module_builder, true); var type = parser.ParseFile(collector, unit, type_name); if (type != null) { assembly_builder.Save(dll_name); } } return(0); }
public static void Main(string[] args) { bool trace = false; bool show_help = false; var options = new OptionSet() { { "t|trace-parsing", "Produce a trace of the parse process.", v => trace = v != null }, { "h|help", "show this message and exit", v => show_help = v != null }, }; List <string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Write(System.AppDomain.CurrentDomain.FriendlyName + ": "); Console.WriteLine(e.Message); Console.WriteLine("Try “" + System.AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return; } if (show_help) { Console.WriteLine("Usage: " + System.AppDomain.CurrentDomain.FriendlyName + " files ..."); Console.WriteLine("Compile a Flabbergast file to native CLR."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } if (files.Count == 0) { Console.WriteLine("Perhaps you wish to compile some source files?"); return; } var collector = new ConsoleCollector(); foreach (var filename in files) { var parser = Parser.Open(filename); parser.Trace = trace; var ast_node = AstNode.ParseFile(parser); if (ast_node == null) { System.Console.WriteLine(parser.Message); } else { ((AstTypeableNode)ast_node).Analyse(collector); } } }
public static int Main(string[] args) { var trace = false; var show_help = false; var options = new OptionSet { {"t|trace-parsing", "Produce a trace of the parse process.", v => trace = v != null}, {"h|help", "show this message and exit", v => show_help = v != null} }; List<string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.WriteLine(e.Message); Console.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return 1; } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " files ..."); Console.WriteLine("Compile a Flabbergast file to native CLR."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return 0; } if (files.Count == 0) { Console.WriteLine("Perhaps you wish to compile some source files?"); return 1; } var collector = new ConsoleCollector(); foreach (var filename in files) { var parser = Parser.Open(filename); parser.Trace = trace; var dll_name = Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll"); var type_name = Regex.Replace("Flabbergast.Library." + Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.') + Path.GetFileNameWithoutExtension(filename), "\\.+", "."); var assembly_name = new AssemblyName(type_name) {CodeBase = "file://" + Path.GetDirectoryName(filename)}; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave); CompilationUnit.MakeDebuggable(assembly_builder); var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true); var unit = new CompilationUnit(module_builder, true); var type = parser.ParseFile(collector, unit, type_name); if (type != null) { assembly_builder.Save(dll_name); } } return 0; }
public static int Main(string[] args) { string github = null; string output_root = "."; var show_help = false; var verbose = false; var options = new OptionSet { { "g=|github", "The URL to the GitHub version of these files.", v => github = v }, { "o=|output", "The directory to place the docs.", v => output_root = v }, { "v=|verbose", "List files as they are being processed.", v => verbose = v != null }, { "h|help", "show this message and exit", v => show_help = v != null } }; List <string> directories; try { directories = options.Parse(args); } catch (OptionException e) { Console.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.WriteLine(e.Message); Console.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return(1); } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " files ..."); Console.WriteLine("Document a directory containing Flabbergast files."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return(0); } if (directories.Count == 0) { Console.WriteLine("I need some directories full of delicious source files to document."); return(1); } var collector = new ConsoleCollector(); var success = true; foreach (var dir in directories) { Discover(dir, dir.Length + (dir[dir.Length - 1] == Path.DirectorySeparatorChar ? 0 : 1), github, verbose, output_root, collector); } return(success ? 0 : 1); }
public static int Main(string[] args) { if (args.Length != 0) { return(1); } var known_dlls = new Dictionary <string, bool>(); var sources = new List <string>(); Discover(".", sources, known_dlls); var collector = new ConsoleCollector(); bool success = true; foreach (var filename in sources) { var parser = Parser.Open(Path.GetFullPath(filename)); var dir_prefix = Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.'); var dll_name = RemoveBadDots(dir_prefix + "." + Path.GetFileNameWithoutExtension(filename) + ".dll"); known_dlls.Remove(Path.Combine(".", dll_name)); known_dlls.Remove(Path.Combine(".", Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll.mdb"))); var type_name = RemoveBadDots("Flabbergast.Library." + dir_prefix + "." + Path.GetFileNameWithoutExtension(filename)); var assembly_name = new AssemblyName(type_name) { CodeBase = "file://" + Path.GetDirectoryName(filename) }; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave); CompilationUnit.MakeDebuggable(assembly_builder); var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true); var unit = new CompilationUnit(module_builder, true); var type = parser.ParseFile(collector, unit, type_name); if (type != null) { assembly_builder.Save(dll_name); } else { success = false; } } foreach (var dead in known_dlls.Keys) { File.Delete(dead); } return(success ? 0 : 1); }
public static int Main(string[] args) { string github = null; string output_root = "."; var show_help = false; var options = new OptionSet { {"g=|github", "The URL to the GitHub version of these files.", v => github = v}, {"o=|output", "The directory to place the docs.", v => output_root = v}, {"h|help", "show this message and exit", v => show_help = v != null} }; List<string> directories; try { directories = options.Parse(args); } catch (OptionException e) { Console.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.WriteLine(e.Message); Console.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return 1; } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " files ..."); Console.WriteLine("Document a directory containing Flabbergast files."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return 0; } if (directories.Count == 0) { Console.WriteLine("I need some directories full of delicious source files to document."); return 1; } var collector = new ConsoleCollector(); var success = true; foreach (var dir in directories) { Discover(dir, dir.Length + (dir[dir.Length - 1] == Path.DirectorySeparatorChar ? 0 : 1), github, output_root, collector); } return success ? 0 : 1; }
public static int Main(string[] args) { if (args.Length != 0) { return 1; } var known_dlls = new Dictionary<string, bool>(); var sources = new List<string>(); Discover(".", sources, known_dlls); var collector = new ConsoleCollector(); bool success = true; foreach (var filename in sources) { var parser = Parser.Open(Path.GetFullPath(filename)); var dll_name = Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll"); known_dlls.Remove(Path.Combine(".", dll_name)); known_dlls.Remove(Path.Combine(".", Path.ChangeExtension(Path.GetFileNameWithoutExtension(filename), ".dll.mdb"))); var type_name = Regex.Replace("Flabbergast.Library." + Path.GetDirectoryName(filename).Replace(Path.DirectorySeparatorChar, '.') + Path.GetFileNameWithoutExtension(filename), "\\.+", "."); var assembly_name = new AssemblyName(type_name) {CodeBase = "file://" + Path.GetDirectoryName(filename)}; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly_name, AssemblyBuilderAccess.RunAndSave); CompilationUnit.MakeDebuggable(assembly_builder); var module_builder = assembly_builder.DefineDynamicModule(type_name, dll_name, true); var unit = new CompilationUnit(module_builder, true); var type = parser.ParseFile(collector, unit, type_name); if (type != null) { assembly_builder.Save(dll_name); } else { success = false; } } foreach (var dead in known_dlls.Keys) { File.Delete(dead); } return success ? 0 : 1; }
public static int Main(string[] args) { var show_help = false; var use_precompiled = true; var options = new OptionSet { { "p|no-precomp", "do not use precompiled libraries", v => use_precompiled = v == null }, { "h|help", "show this message and exit", v => show_help = v != null } }; List <string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Error.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.Error.WriteLine(e.Message); Console.Error.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return(1); } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " input.flbgst"); Console.WriteLine("Run Flabbergast interactively."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return(1); } if (files.Count > 1) { Console.Error.WriteLine("No more than one Flabbergast script may be given."); return(1); } Frame original = null; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Repl"), AssemblyBuilderAccess.Run); var module_builder = assembly_builder.DefineDynamicModule("ReplModule"); var unit = new CompilationUnit(module_builder, false); var collector = new ConsoleCollector(); var task_master = new ConsoleTaskMaster(); task_master.AddUriHandler(BuiltInLibraries.INSTANCE); if (use_precompiled) { task_master.AddUriHandler(new LoadPrecompiledLibraries()); } task_master.AddUriHandler(new DynamicallyCompiledLibraries(collector)); if (files.Count == 1) { var parser = Parser.Open(files[0]); var root_type = parser.ParseFile(collector, unit, "REPLRoot"); if (root_type != null) { var computation = (Computation)Activator.CreateInstance(root_type, task_master); computation.Notify(r => original = r as Frame); task_master.Slot(computation); task_master.Run(); task_master.ReportCircularEvaluation(); } } if (original == null) { original = new Frame(task_master, task_master.NextId(), new SourceReference("<repl>", "<native>", 0, 0, 0, 0, null), null, null); } var id = 0; Frame current = original; bool run = true; ConsumeResult update_current = (x) => current = (x as Frame) ?? current; var line_editor = new LineEditor("flabbergast"); var completables = new Completables(); line_editor.AutoCompleteEvent = completables.Handler; string s; while (run && (s = line_editor.Edit(id + "‽ ", "")) != null) { var parser = new Parser("line" + id, s); var run_type = parser.ParseRepl(collector, unit, "REPL" + id++); if (run_type != null) { object result = null; var computation = (Computation)Activator.CreateInstance(run_type, new object[] { task_master, original, current, update_current, (ConsumeResult)(output => result = output), (ConsumeResult)Console.WriteLine }); computation.Notify(r => run = (r as bool?) ?? true); task_master.Slot(computation); task_master.Run(); if (result != null) { HandleResult(result); } task_master.ReportCircularEvaluation(); } } line_editor.SaveHistory(); return(0); }
public static int Main(string[] args) { var show_help = false; var use_precompiled = true; var options = new OptionSet { {"p|no-precomp", "do not use precompiled libraries", v => use_precompiled = v == null}, {"h|help", "show this message and exit", v => show_help = v != null} }; List<string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Error.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.Error.WriteLine(e.Message); Console.Error.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return 1; } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " input.flbgst"); Console.WriteLine("Run Flabbergast interactively."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return 1; } if (files.Count > 1) { Console.Error.WriteLine("No more than one Flabbergast script may be given."); return 1; } Frame original = null; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Repl"), AssemblyBuilderAccess.Run); var module_builder = assembly_builder.DefineDynamicModule("ReplModule"); var unit = new CompilationUnit(module_builder, false); var collector = new ConsoleCollector(); var task_master = new ConsoleTaskMaster(); task_master.AddUriHandler(BuiltInLibraries.INSTANCE); if (use_precompiled) { task_master.AddUriHandler(new LoadPrecompiledLibraries()); } task_master.AddUriHandler(new DynamicallyCompiledLibraries(collector)); if (files.Count == 1) { var parser = Parser.Open(files[0]); var root_type = parser.ParseFile(collector, unit, "REPLRoot"); if (root_type != null) { var computation = (Computation) Activator.CreateInstance(root_type, task_master); computation.Notify(r => original = r as Frame); task_master.Slot(computation); task_master.Run(); task_master.ReportCircularEvaluation(); } } if (original == null) { original = new Frame(task_master, task_master.NextId(), new SourceReference("<repl>", "<native>", 0, 0, 0, 0, null), null, null); } var id = 0; Frame current = original; bool run = true; ConsumeResult update_current = (x) => current = (x as Frame) ?? current; var line_editor = new LineEditor("flabbergast"); var completables = new Completables(); line_editor.AutoCompleteEvent = completables.Handler; string s; while (run && (s = line_editor.Edit(id + "‽ ", "")) != null) { var parser = new Parser("line" + id, s); var run_type = parser.ParseRepl(collector, unit, "REPL" + id++); if (run_type != null) { object result = null; var computation = (Computation) Activator.CreateInstance(run_type, new object[] { task_master, original, current, update_current, (ConsumeResult) (output => result = output), (ConsumeResult) Console.WriteLine }); computation.Notify(r => run = (r as bool?) ?? true); task_master.Slot(computation); task_master.Run(); if (result != null) { HandleResult(result); } task_master.ReportCircularEvaluation(); } } line_editor.SaveHistory(); return 0; }
public static int Main(string[] args) { var trace = false; string output_filename = null; var show_help = false; var use_precompiled = true; var options = new OptionSet { {"o=|output", "Write output to file instead of standard output.", v => output_filename = v}, {"t|trace-parsing", "Produce a trace of the parse process.", v => trace = v != null}, {"p|no-precomp", "do not use precompiled libraries", v => use_precompiled = v == null}, {"h|help", "show this message and exit", v => show_help = v != null} }; List<string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Error.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.Error.WriteLine(e.Message); Console.Error.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return 1; } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " input.o_0"); Console.WriteLine("Run a Flabbergast file and display the “value” attribute."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return 1; } if (files.Count != 1) { Console.Error.WriteLine("Exactly one Flabbergast script must be given."); return 1; } var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Print"), AssemblyBuilderAccess.Run); CompilationUnit.MakeDebuggable(assembly_builder); var module_builder = assembly_builder.DefineDynamicModule("PrintModule", true); var unit = new CompilationUnit(module_builder, true); var collector = new ConsoleCollector(); var task_master = new ConsoleTaskMaster(); task_master.AddUriHandler(BuiltInLibraries.INSTANCE); task_master.AddUriHandler(DbUriHandler.INSTANCE); if (use_precompiled) { task_master.AddUriHandler(new LoadPrecompiledLibraries()); } task_master.AddUriHandler(new DynamicallyCompiledLibraries(collector)); var parser = Parser.Open(files[0]); parser.Trace = trace; var run_type = parser.ParseFile(collector, unit, "Printer"); if (run_type != null) { var computation = (Computation) Activator.CreateInstance(run_type, task_master); var filewriter = new PrintResult(task_master, computation, output_filename); filewriter.Slot(); task_master.Run(); task_master.ReportCircularEvaluation(); return filewriter.Success ? 0 : 1; } return 1; }