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