Refactor main

This commit is contained in:
nub31
2025-01-29 20:57:03 +01:00
parent 88aa2375ef
commit d7dc2bdffe

View File

@@ -3,25 +3,49 @@ using Nub.Lang.Frontend.Lexing;
using Nub.Lang.Frontend.Parsing; using Nub.Lang.Frontend.Parsing;
using Nub.Lang.Frontend.Typing; using Nub.Lang.Frontend.Typing;
List<ModuleNode> modules = []; namespace Nub.Lang;
var lexer = new Lexer(); internal static class Program
var parser = new Parser();
Parse(args[0]);
void Parse(string path)
{ {
private static readonly Lexer Lexer = new();
private static readonly Parser Parser = new();
public static void Main(string[] args)
{
var modules = RunFrontend(args[0]);
var definitions = modules.SelectMany(f => f.Definitions).ToArray();
var typer = new ExpressionTyper(definitions);
typer.Populate();
var generator = new Generator(definitions);
var asm = generator.Generate();
Console.WriteLine(asm);
File.WriteAllText(args[1], asm);
}
private static IEnumerable<ModuleNode> RunFrontend(string path)
{
List<ModuleNode> modules = [];
RunFrontend(path, modules);
return modules;
}
private static void RunFrontend(string path, List<ModuleNode> modules)
{
var files = Directory.EnumerateFiles(path, "*.nub", SearchOption.TopDirectoryOnly); var files = Directory.EnumerateFiles(path, "*.nub", SearchOption.TopDirectoryOnly);
List<Token> tokens = []; List<Token> tokens = [];
foreach (var file in files) foreach (var file in files)
{ {
var src = File.ReadAllText(file); var src = File.ReadAllText(file);
tokens.AddRange(lexer.Lex(src)); tokens.AddRange(Lexer.Lex(src));
} }
var module = parser.ParseModule(tokens, path); var module = Parser.ParseModule(tokens, path);
modules.Add(module); modules.Add(module);
foreach (var import in module.Imports) foreach (var import in module.Imports)
@@ -29,24 +53,8 @@ void Parse(string path)
var importPath = Path.GetFullPath(import, module.Path); var importPath = Path.GetFullPath(import, module.Path);
if (modules.All(m => m.Path != importPath)) if (modules.All(m => m.Path != importPath))
{ {
Parse(importPath); RunFrontend(importPath, modules);
}
} }
} }
} }
foreach (var moduleNode in modules)
{
Console.WriteLine(moduleNode.Path);
}
var definitions = modules.SelectMany(f => f.Definitions).ToArray();
var typer = new ExpressionTyper(definitions);
typer.Populate();
var generator = new Generator(definitions);
var asm = generator.Generate();
Console.WriteLine(asm);
File.WriteAllText(args[1], asm);