private static void CompileFile(Stream fileStream, string fileName, StreamWriter outStream, TypeStorage typeStorage, ILogger logger, ILogger treeLogger, INameConvertor nameConvertor) { logger.Log(String.Format("----Файл {0}----", fileName)); var stream = new ANTLRInputStream(fileStream); var lexer = new PlsqlLexer(stream); var parser = new PlsqlParser(new CommonTokenStream(lexer)); var tree = parser.program().Tree as CommonTree; if (treeLogger != null) { treeLogger.Log(ASTPrinter.Print(tree)); } var semanticAnalyser = new SemanticAnalyser(typeStorage, logger); bool res = semanticAnalyser.Check(tree); if (res) { var optimizer = new Optimizer(); optimizer.Optimize(tree); var codegenerator = new Codegenerator(nameConvertor); string code = codegenerator.Generate(tree, typeStorage); outStream.Write(code); } logger.Log(string.Format("--------", fileName)); }
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); }