コード例 #1
0
ファイル: Program.cs プロジェクト: Leandroglez39/Compiler
        static void Main(string[] args)
        {
            var input = new AntlrFileStream("C:/Users/Leandro/Desktop/Compiler/CoolCompiler/input.cl");
            var lexer = new CoolLexer(input);

            /*var errors = new List<string>();
             * lexer.RemoveErrorListeners();*/


            var tokens = new CommonTokenStream(lexer);

            var parser = new CoolParser(tokens);

            var tree = parser.program();

            ASTBuilder astBuilder = new ASTBuilder();
            ASTNode    ast        = astBuilder.Visit(tree);

            Console.WriteLine( );


            /* var a = new Dictionary<int,int>();
             * a.Add(1,2);
             * a.Add(3, 4);
             * a.Add(5, 6);
             *
             * foreach (var x in ast.Attributes)
             * {
             *   Console.WriteLine( "{"+
             *   x.Key.ToString() + ":" + x.Value.ToString() + "}" );
             * }
             */

            Console.WriteLine(tree.ToStringTree(parser));
        }
コード例 #2
0
        public void ASTBuilderSuccess()
        {
            UnitTestParsing testParsing      = new UnitTestParsing();
            string          directorySuccess = "../../../TestCases/Parsing/success/";
            DirectoryInfo   directory        = new DirectoryInfo(directorySuccess);

            FileInfo[] files = directory.GetFiles();

            foreach (var file in files)
            {
                testParsing.ParsingFile(file.FullName);
                var     astBuilder = new ASTBuilder();
                ASTNode root       = astBuilder.Visit(testParsing.tree);

                Assert.IsFalse(root is null, "AST no created. (root is null)");
                Assert.IsTrue(root is ProgramNode, $"AST created with big problems. (root is not a ProgramNode, root is {root})");
            }
        }
コード例 #3
0
        public void TopologicalSortFail()
        {
            UnitTestParsing testParsing   = new UnitTestParsing();
            string          directoryFail = "../../../TestCases/Algorithm/fail/";
            DirectoryInfo   directory     = new DirectoryInfo(directoryFail);

            FileInfo[] files = directory.GetFiles();

            foreach (var file in files)
            {
                var errors = new List <string>();
                testParsing.ParsingFile(file.FullName);
                var         astBuilder = new ASTBuilder();
                ProgramNode program    = astBuilder.Visit(testParsing.tree) as ProgramNode;
                Algorithm.TopologicalSort(program.Classes, errors);
                Assert.IsTrue(errors.Count != 0, $"Not found cycles in class dependency in file {file.Name}");
            }
        }
コード例 #4
0
        private static ASTNode ParseInput(string inputPath)
        {
            //try
            {
                var input = new AntlrFileStream(inputPath);
                var lexer = new CoolLexer(input);

                var errors = new List <string>();
                lexer.RemoveErrorListeners();
                lexer.AddErrorListener(new LexerErrorListener(errors));

                var tokens = new CommonTokenStream(lexer);

                var parser = new CoolParser(tokens);

                parser.RemoveErrorListeners();
                parser.AddErrorListener(new ParserErrorListener(errors));

                IParseTree tree = parser.program();

                if (errors.Any())
                {
                    Console.WriteLine();
                    foreach (var item in errors)
                    {
                        Console.WriteLine(item);
                    }
                    return(null);
                }

                var     astBuilder = new ASTBuilder();
                ASTNode ast        = astBuilder.Visit(tree);
                return(ast);
            }

            /*catch (Exception e)
             * {
             *
             *  Console.WriteLine(e.Message);
             *  return null;
             * }*/
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: ealmuina/tiger
        static Node ParseInput(string inputPath)
        {
            try
            {
                var input = new AntlrFileStream(inputPath);
                var lexer = new TigerLexer(input);

                var errors = new List <string>();
                lexer.RemoveErrorListeners();
                lexer.AddErrorListener(new LexerErrorListener(errors));

                var tokens = new CommonTokenStream(lexer);
                var parser = new TigerParser(tokens);

                parser.RemoveErrorListeners();
                parser.AddErrorListener(new ParserErrorListener(errors));

                IParseTree tree = parser.compileUnit();

                if (errors.Any())
                {
                    Console.WriteLine();
                    foreach (var error in errors)
                    {
                        Console.WriteLine(error);
                    }
                    return(null);
                }

                var  astBuilder = new ASTBuilder();
                Node ast        = astBuilder.Visit(tree);
                return(ast);
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.Message);
                return(null);
            }
        }
コード例 #6
0
        public void TopologicalSortSuccess()
        {
            UnitTestParsing testParsing      = new UnitTestParsing();
            string          directorySuccess = "../../../TestCases/Algorithm/success/";
            DirectoryInfo   directory        = new DirectoryInfo(directorySuccess);

            FileInfo[] files = directory.GetFiles();

            foreach (var file in files)
            {
                var errors = new List <string>();
                testParsing.ParsingFile(file.FullName);

                var         astBuilder = new ASTBuilder();
                ProgramNode program    = astBuilder.Visit(testParsing.tree) as ProgramNode;

                Algorithm.TopologicalSort(program.Classes, errors);
                foreach (var item in errors)
                {
                    Assert.Fail(file.Name + ": " + item.ToString());
                }
            }
        }
コード例 #7
0
        public void TestSemanticsFail()
        {
            UnitTestParsing testParsing   = new UnitTestParsing();
            string          directoryFail = "../../../TestCases/Semantics/fail/";
            DirectoryInfo   directory     = new DirectoryInfo(directoryFail);

            FileInfo[] files = directory.GetFiles();

            foreach (var file in files)
            {
                var           errors       = new List <string>();
                List <string> errorParsing = testParsing.ParsingFile(file.FullName);

                if (errorParsing.Any())
                {
                    Assert.IsTrue(errorParsing.Any());
                    continue;
                }

                var         astBuilder = new ASTBuilder();
                ProgramNode program    = astBuilder.Visit(testParsing.tree) as ProgramNode;

                Scope.Clear();
                var scope = new Scope();

                program = new Tour1().CheckSemantic(program, scope, errors);
                if (errors.Any())
                {
                    Assert.IsTrue(errors.Any(), file.Name);
                }
                else
                {
                    program = new Tour2().CheckSemantic(program, scope, errors);
                    Assert.IsTrue(errors.Any(), file.Name);
                }
            }
        }
コード例 #8
0
        public void TestSemanticsSuccess()
        {
            UnitTestParsing testParsing      = new UnitTestParsing();
            string          directorySuccess = "../../../TestCases/Semantics/success/";
            DirectoryInfo   directory        = new DirectoryInfo(directorySuccess);

            FileInfo[] files = directory.GetFiles();

            foreach (var file in files)
            {
                var           errors       = new List <string>();
                List <string> errorParsing = testParsing.ParsingFile(file.FullName);

                foreach (var item in errorParsing)
                {
                    Assert.Fail($"Parsing error in {file.Name}: {item}");
                }

                var         astBuilder = new ASTBuilder();
                ProgramNode program    = astBuilder.Visit(testParsing.tree) as ProgramNode;

                Scope.Clear();
                var scope = new Scope();

                program = new Tour1().CheckSemantic(program, scope, errors);
                foreach (var item in errors)
                {
                    Assert.Fail(file.Name + ": " + item.ToString());
                }

                program = new Tour2().CheckSemantic(program, scope, errors);
                foreach (var item in errors)
                {
                    Assert.Fail(file.Name + ": " + item.ToString());
                }
            }
        }
コード例 #9
0
        static void Main(string[] args)
        {
            // TODO --verbose parameter?

            #region debuging
            ////// To Release comment from HERE ##
            //#if Debug
            //    Fake_Main(new string[] { "../test/semanticerrors/selfmethod.cl" });//TODO
            //}
            //static void Fake_Main(string[] args)
            //{
            //#endif

            // To Release comment til HERE ##
            #endregion

            #region Variables
            double version   = 0.1;
            string copyright = "ADB & JLA";
            var    verbose   = false;
            string usage     = "Usage:\n\tcoolc.exe <filename.cl>";
            #endregion

            #region Welcome Message
            ////// ////// Welcome Message   ////// //////
            Console.ForegroundColor = ConsoleColor.Gray;

            if (verbose == true)
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("A cool compiler :)");
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Version: {0}", version);
                Console.WriteLine("Copyright (C) 2017-2018: {0}", copyright);
            }
            #endregion

            #region Open file
            ////// ////// Open file         ////// //////

            if (args.Length == 0)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("ERROR: No arguments given ");
                Console.ForegroundColor = ConsoleColor.Gray;
                //Console.WriteLine(usage);
                Environment.Exit(1);
                return;
            }

            //Console.WriteLine("Opening: {0}\t", args[0]);
            Console.Write("Program: {0,40}\t", args[0]);
            AntlrFileStream input_file;
            try
            {
                input_file = new AntlrFileStream(args[0]);
            }
            catch (Exception)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("ERROR: Opening file ");
                Console.ForegroundColor = ConsoleColor.Gray;
                //Console.WriteLine("");
                //Console.WriteLine(usage);
                Environment.Exit(1);
                return;
            }

            #endregion

            #region Parse
            StreamWriter LEW = new StreamWriter(args[0] + ".lexer.errors.txt");
            StreamWriter PEW = new StreamWriter(args[0] + ".parser.errors.txt");

            ////// ////// Parse             ////// //////
            CoolLexer lexer = new CoolLexer(input_file, LEW, LEW);

            CommonTokenStream tokens = new CommonTokenStream(lexer);

            CoolParser parser = new CoolParser(tokens, PEW, PEW);

            Console.ForegroundColor = ConsoleColor.Yellow;
            IParseTree tree = parser.program();

            LEW.Close();
            PEW.Close();

            if (parser.NumberOfSyntaxErrors > 0)
            {
                //Console.WriteLine("{0,20}","[Parsing Error]");
                Console.WriteLine();
                StreamReader LER = new StreamReader(args[0] + ".lexer.errors.txt");
                StreamReader PER = new StreamReader(args[0] + ".parser.errors.txt");

                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Lexer Errors:");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(LER.ReadToEnd());

                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Parser Errors:");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(PER.ReadToEnd());

                LER.Close();
                PER.Close();
                Console.ForegroundColor = ConsoleColor.Gray;

                Environment.Exit(1);
            }
            Console.ForegroundColor = ConsoleColor.Gray;
            #endregion

            #region Check Semantics
            // ////// Check Semantics   ////// //////
            ASTBuilder  builder = new ASTBuilder();
            AST.Program p       = (AST.Program)builder.Visit(tree);

            if (p.Errors.Count > 0 || p.CheckSemantics().Count > 0)
            {
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Semantic errors: ");
                Console.ForegroundColor = ConsoleColor.Yellow;

                foreach (Error e in p.Errors)
                {
                    Console.WriteLine(e);
                }
                Console.ForegroundColor = ConsoleColor.Gray;

                //File.Delete(args[0] + ".lexer.errors.txt");
                //File.Delete(args[0] + ".parser.errors.txt");

                Environment.Exit(1);
                //Console.WriteLine();
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("[Cool code]\t");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            //Console.WriteLine();
            //return;
            #endregion

            #region Generate Code
            ////// ////// Code Generation      ////// //////
            // TODO Generate Code

            DotCodeGenerator dcg = new DotCodeGenerator(args[0]);
            dcg.Visit(tree);

            Builder b = new Builder(args[0]);
            try
            {
                b.Compile(tree);
                #endregion

                #region Exit
                ////// ////// Exit              ////// //////
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("{0,17}", "[Build succeded]");
                Console.ForegroundColor = ConsoleColor.Gray;
                #endregion
            }
            catch (Exception)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("{0,17}", "[Build failed]");
                Console.ForegroundColor = ConsoleColor.Gray;
            }

            File.Delete(args[0] + ".lexer.errors.txt");
            File.Delete(args[0] + ".parser.errors.txt");
        }