Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
                }
            }
        }