示例#1
0
        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));
        }
示例#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);
        }