using Nub.Lang; using Nub.Lang.Frontend; using Nub.Lang.Frontend.Generation; using Nub.Lang.Frontend.Lexing; using Nub.Lang.Frontend.Parsing; using Nub.Lang.Frontend.Typing; if (args.Length != 1) { Console.Error.WriteLine("Usage: nub "); Console.Error.WriteLine("Example: nub src"); return 1; } var srcDir = Path.GetFullPath(args[0]); if (!Directory.Exists(srcDir)) { Console.Error.WriteLine($"Error: Input directory '{srcDir}' does not exist."); return 1; } var error = false; List compilationUnits = []; foreach (var file in Directory.EnumerateFiles(srcDir, "*.nub", SearchOption.AllDirectories)) { var content = File.ReadAllText(file); var tokenizeResult = Lexer.Tokenize(new SourceText(file, content)); tokenizeResult.PrintAllDiagnostics(); error = error || tokenizeResult.HasErrors; var parseResult = Parser.ParseFile(tokenizeResult.Value); parseResult.PrintAllDiagnostics(); error = error || parseResult.HasErrors; if (parseResult.Value != null) { compilationUnits.Add(parseResult.Value); } } if (error) { return 1; } var definitionTable = new DefinitionTable(compilationUnits); foreach (var compilationUnit in compilationUnits) { var typeCheckResult = TypeChecker.Check(compilationUnit, definitionTable); typeCheckResult.PrintAllDiagnostics(); error = error || typeCheckResult.HasErrors; var result = QBEGenerator.Generate(compilationUnit, definitionTable); File.WriteAllText($"bin-int/{Guid.NewGuid():N}.ssa", result); } return error ? 1 : 0;