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); }
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); }