Exemplo n.º 1
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                string message =
                    @"
Аргументы не заданы.
Обязательные команды:
    -src (path)+  задает пути к файлам, которые необходимо скомпилировать
Опцинально:
    -libs (path)+  задает пути к библиотекам
    -all
    -out  записывает сгенерированный код в файл с данным путем
    -outLog path   выводит сообщения в файл с данным путем, по умолчанию - в консоль
    -tree (path)?   выводит дерево в консоль, если path не задан, иначе - в файл с данным путем;
    по умолчанию дерево не выводится
";

                Console.WriteLine(message);

                return;
            }

            var helper = new ConsoleHelper();

            helper.Register("tree", TreeOut)
            .Register("src", SourceFiles)
            .Register("out", OutFile)
            .Register("outLog", OutLogFile)
            .Register("libs", Libs)
            .Register("all", All);

            try
            {
                helper.Parse(args);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);

                return;
            }

            var compiler     = new Compiler();
            var compilerArgs = new CompilerArgs(
                libs,
                sourceFiles,
                printTree,
                printTreeFile,
                outFile,
                outLogFile,
                all);

            compiler.Compile(compilerArgs);
        }
Exemplo n.º 2
0
        public void Compile(CompilerArgs args)
        {
            if (args.SourceFiles.Count == 0)
            {
                Console.WriteLine("Файлы для компиляции не заданы");

                return;
            }

            var nameConvertor = new CSNameConvertor();
            var typeLoader    = new StandardLibraryTypesLoader(nameConvertor);
            var typeStorage   = typeLoader.Load(args.Libs);

            ILogger logger     = GetLogger(args.OutLogFile);
            ILogger treeLogger = GetLogger(args.PrintTreeFile);

            var tree = Parse(args.SourceFiles);
            var node = Combine(tree);

            if (args.PrintTree)
            {
                treeLogger.Log(ASTPrinter.Print(node));
            }

            bool ok = Analyze(node, typeStorage, logger);

            if (!ok)
            {
                Console.ReadLine();
                return;
            }

            Optimize(node);

            string code = Generate(node, nameConvertor, typeStorage);

            Write(args.OutFile, code);
        }