示例#1
0
        public static string Compile(string input)
        {
            Console.Write("# Parsing {0}: ", input);
            FunctionDecl main;

            using (var file = new FileStream(input, FileMode.Open)) {
                var scanner = new Scanner(file);
                var parser  = new Parser(scanner);
                if (!parser.Parse())
                {
                    Console.WriteLine("Not OK :(");
                    throw new ArgumentException("Input is not valid...");
                }
                Console.WriteLine("OK");
                main = parser.Prog;
            }

            Console.Write("# Type checking {0}: ", input);
            var tcv = new TypecheckVisitor();

            main.Accept(tcv);
            Console.WriteLine("OK");

            Console.Write("# Return checking {0}: ", input);
            var rcv = new ReturnCheckVisitor();

            main.Accept(rcv);
            Console.WriteLine("OK");

            Console.WriteLine("# Contents of {0}:", input);
            var toStringVisitor = new ToStringVisitor();

            main.Accept(toStringVisitor);
            Console.Write(toStringVisitor.Result);

            var prefix = input.Substring(0, input.LastIndexOf('.'));

            Console.Write("# Compiling {0} into {1}: ", input, prefix + ".exe");
            var cecilVisitor = new CecilVisitor(tcv.Assembly, tcv.Module);

            main.Accept(cecilVisitor);
            cecilVisitor.Write(prefix);
            Console.WriteLine("OK");

            Console.Out.Flush();
            return(prefix + ".exe");
        }
示例#2
0
        public static string Compile(string input)
        {
            Console.Write("# Parsing {0}: ", input);
            FunctionDecl main;
            using (var file = new FileStream(input, FileMode.Open)) {
                var scanner = new Scanner(file);
                var parser = new Parser(scanner);
                if (!parser.Parse()) {
                    Console.WriteLine("Not OK :(");
                    throw new ArgumentException("Input is not valid...");
                }
                Console.WriteLine("OK");
                main = parser.Prog;
            }

            Console.Write("# Type checking {0}: ", input);
            var tcv = new TypecheckVisitor();
            main.Accept(tcv);
            Console.WriteLine("OK");

            Console.Write("# Return checking {0}: ", input);
            var rcv = new ReturnCheckVisitor();
            main.Accept(rcv);
            Console.WriteLine("OK");

            Console.WriteLine("# Contents of {0}:", input);
            var toStringVisitor = new ToStringVisitor();
            main.Accept(toStringVisitor);
            Console.Write(toStringVisitor.Result);

            var prefix = input.Substring(0, input.LastIndexOf('.'));
            Console.Write("# Compiling {0} into {1}: ", input, prefix + ".exe");
            var cecilVisitor = new CecilVisitor(tcv.Assembly, tcv.Module);
            main.Accept(cecilVisitor);
            cecilVisitor.Write(prefix);
            Console.WriteLine("OK");

            Console.Out.Flush();
            return prefix + ".exe";
        }
示例#3
0
        static void TypecheckFile(string file)
        {
            var ext = Path.GetExtension(file);

            if (ext != ".xl")
            {
                Logger.DebugLine("====================================================", 10);
                Logger.DebugLine($"Skipping file {file}, invalid extension!", 10);
                Logger.DebugLine("====================================================", 10);
                return;
            }

            Logger.DebugLine("====================================================", 10);
            Logger.DebugLine($"Going to parse file {file}", 10);
            if (GlobalSettings.TypecheckerStopAtNextFile)
            {
                Logger.DebugLine("Enter to continue", 10);
                Console.ReadLine();
            }

            Logger.DebugLine("====================================================", 10);
            StreamReader      reader            = File.OpenText(file);
            ErrorHandler      handler           = new ErrorHandler();
            AntlrInputStream  inputStream       = new AntlrInputStream(reader);
            SpreadsheetLexer  spreadsheetLexer  = new SpreadsheetLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(spreadsheetLexer);
            SpreadsheetParser spreadsheetParser = new SpreadsheetParser(commonTokenStream);

            reader.BaseStream.Seek(0, SeekOrigin.Begin);
            Logger.DebugLine(reader.ReadToEnd(), 5);
            Logger.DebugLine("====================================================", 5);
            reader.BaseStream.Seek(0, SeekOrigin.Begin);


            SpreadsheetParser.SpreadSheetContext context = spreadsheetParser.spreadSheet();
            if (spreadsheetParser.NumberOfSyntaxErrors > 0)
            {
                Logger.DebugLine("===================================", 10);
                Logger.DebugLine("Found Syntax Error - Dont processing file", 10);
                if (GlobalSettings.TypecheckerStopSyntaxError)
                {
                    Logger.DebugLine("Enter to continue", 10);
                    Console.ReadLine();
                }
                Logger.DebugLine("===================================", 10);
                return;
            }

            SpreadsheetVisitor visitor = new TypecheckVisitor(handler);

            Logger.DebugLine("", 0);
            PrintContext(context, 0, 0);
            Logger.DebugLine("", 0);
            bool result = visitor.Visit(context);

            Logger.DebugLine("Basic Typechecking has returned result: " + result, 10);
            Logger.DebugLine("===================================", 10);
            if (result)
            {
                Logger.DebugLine($"Count Cells: {visitor.Repository.CellTypes.Count}", 7);
                Logger.DebugLine($"Count Formulas: {visitor.Repository.Formulas.CellFormulas.Count}", 7);
                Logger.DebugLine("===================================", 7);
                Logger.DebugLine("", 5);
                Logger.DebugLine("CellTypes:", 5);
                foreach (var value in visitor.Repository.CellTypes)
                {
                    Logger.DebugLine($"{value.Key.Item1}, {value.Key.Item2}: {value.Value.Type.ToString()}", 5);
                }
                Logger.DebugLine("", 5);
                Logger.DebugLine("CellFormulas:", 5);
                foreach (var formula in visitor.Repository.Formulas.CellFormulas)
                {
                    Logger.Debug($"{formula.Key.Item1}, {formula.Key.Item2}: {formula.Value.ToString()}", 5);
                    formula.Value.Simplify();
                    Logger.DebugLine($" - Simplified: {formula.Value.ToString()}", 5);
                }
                Logger.DebugLine("===================================", 5);
            }
            Logger.DebugLine($"Detected Errors: {handler.fileData.Errors} (Invocations: {handler.fileData.ErrorInvocations})", 10);

            LastCells            = visitor.Repository.CellTypes.Count;
            LastFormulas         = visitor.Repository.Formulas.CellFormulas.Count;
            LastErrors           = handler.fileData.Errors;
            LastErrorInvocations = handler.fileData.ErrorInvocations;
            Logger.DebugLine("", 10);
        }