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