using Nub.Lang.Backend; using Nub.Lang.Frontend.Diagnostics; using Nub.Lang.Frontend.Lexing; using Nub.Lang.Frontend.Parsing; using Nub.Lang.Frontend.Typing; namespace Nub.Lang; internal static class Program { public static int Main(string[] args) { if (args.Length != 2) { 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; } return Compile(srcDir); } private static int Compile(string srcDir) { var error = false; var lexer = new Lexer(); var parser = new Parser(); var typeChecker = new TypeChecker(); List files = []; 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.ParseModule(tokenizeResult.Value); parseResult.PrintAllDiagnostics(); error = error || parseResult.HasErrors; if (parseResult.Value != null) { files.Add(parseResult.Value); } } var typeCheckResult = typeChecker.TypeCheck(files); typeCheckResult.PrintAllDiagnostics(); error = error || typeCheckResult.HasErrors; var generator = new Generator(typeCheckResult.Value); var result = generator.Generate(); Console.Out.Write(result); return error ? 1 : 0; } }