public static void Main(string[] args) { int index = 0; int assemblyIndex = 0; var name = new AssemblyName(AssemblyName + assemblyIndex++); AppDomain domain = AppDomain.CurrentDomain; var assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); var module = assembly.DefineDynamicModule(AssemblyName); ModuleImporter moduleImporter = new ModuleImporter(container, runtimeContainer); Evaluator evaluator = new Evaluator(module, container, runtimeContainer); Console.TreatControlCAsInput = false; while (true) { try { Console.Write(Prompt); string line = Console.ReadLine(); if (!string.IsNullOrWhiteSpace(line)) { if (line[0] == CommandIntroduction) { switch (line[1]) { case ClearCommand: // Clear console Console.Clear(); break; case ResetCommand: // Clear all data container.Clear(); runtimeContainer.Clear(); name = new AssemblyName(AssemblyName + assemblyIndex++); assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); module = assembly.DefineDynamicModule(AssemblyName); break; case PrintDeclarationsCommand: // Print definitions PrintDeclarations(); break; case PrintTypeCommand: // Print type PrintType(line.Substring(2).Trim()); break; case EvaluateCommand: // Evaluate string result = evaluator.Evaluate(line.Substring(2).Trim()); PrintResult(result); break; default: PrintError("Unknown command."); break; } } else { var dataClass = module.DefineType(Constants.DataClassName + index++, TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract); var compiler = new PurityCompiler(module, dataClass, container, runtimeContainer); var parseResult = ModuleParser.ParseProgramElement(line); if (parseResult == null) { throw new CompilerException(ErrorMessages.UnableToParse); } try { compiler.Compile(parseResult.Output, module.Name); } catch (CompilerException ex) { PrintError(ex.Message); } } } } catch (Exception ex) { PrintError(ex.Message); } } }
static void Main(string[] args) { IMetadataContainer container = new MetadataContainer(); IRuntimeContainer runtimeContainer = new RuntimeContainer(); if (args.Length < 1) { Console.WriteLine("Usage: compile.exe <input-file> [<output-file>]"); } else { var input = args[0]; var output = args.Length >= 2 ? args[1] : "output.dll"; StringBuilder program = new StringBuilder(); using (var stream = new FileStream(input, FileMode.Open)) { using (var reader = new StreamReader(stream)) { string nextLine; while ((nextLine = reader.ReadLine()) != null) { if (!string.IsNullOrEmpty(nextLine) && nextLine[0] != Constants.StartOfComment) { program.AppendLine(nextLine); } } } } try { var parseResult = ModuleParser.ParseModule(program.ToString()); if (parseResult == null) { throw new CompilerException(ErrorMessages.UnableToParse); } var moduleDefinition = parseResult.Output; var name = new AssemblyName(moduleDefinition.Name); AppDomain domain = AppDomain.CurrentDomain; var assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Save); var module = assembly.DefineDynamicModule(moduleDefinition.Name, output); var dataClass = module.DefineType(moduleDefinition.Name + '.' + Constants.DataClassName, TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract); var compiler = new PurityCompiler(module, dataClass, container, runtimeContainer); compiler.Compile(moduleDefinition); compiler.CloseTypes(); assembly.Save(output); } catch (CompilerException ex) { Console.WriteLine(ex.Message); } } }