This repository has been archived on 2025-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nub-lang-archive-2/src/lang/Nub.Lang.CLI/Program.cs
2025-06-12 22:49:58 +02:00

63 lines
1.6 KiB
C#

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 <input-dir>");
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<CompilationUnit> 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;