This commit is contained in:
nub31
2026-02-10 19:50:55 +01:00
parent d3e2dcede8
commit 6ae10d5f90
7 changed files with 215 additions and 64 deletions

View File

@@ -14,6 +14,9 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
private string Emit()
{
foreach (var (i, structType) in moduleGraph.GetModules().SelectMany(x => x.GetCustomTypes().OfType<NubTypeStruct>().Index()))
structTypeNames[structType] = $"s{i}";
writer.WriteLine("""
#include <float.h>
#include <stdarg.h>
@@ -28,9 +31,6 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
""");
foreach (var (i, structType) in moduleGraph.GetModules().SelectMany(x => x.GetCustomTypes().OfType<NubTypeStruct>().Index()))
structTypeNames[structType] = $"s{i}";
foreach (var typeName in structTypeNames)
writer.WriteLine($"struct {typeName.Value};");
@@ -45,30 +45,55 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
foreach (var field in typeName.Key.Fields)
writer.WriteLine($"{CType(field.Type, field.Name)};");
}
writer.WriteLine("};");
}
writer.WriteLine();
foreach (var node in functions)
foreach (var module in moduleGraph.GetModules())
{
var parameters = node.Parameters.Select(x => CType(x.Type, x.Name.Ident));
writer.WriteLine($"{CType(node.ReturnType, node.Name.Ident)}({string.Join(", ", parameters)});");
foreach (var (name, type) in module.GetIdentifierTypes())
{
if (type is NubTypeFunc fn)
{
if (!functions.Any(x => x.GetMangledName() == SymbolNameGen.Exported(module.Name, name, type)))
writer.Write("extern ");
writer.WriteLine($"{CType(fn.ReturnType)} {SymbolNameGen.Exported(module.Name, name, type)}({string.Join(", ", fn.Parameters.Select(p => CType(p)))});");
}
else
{
writer.WriteLine($"{CType(type)} {SymbolNameGen.Exported(module.Name, name, type)};");
}
}
}
writer.WriteLine();
foreach (var node in functions)
var main = functions.FirstOrDefault(x => x.Module == "main" && x.Name.Ident == "main");
if (main != null)
{
var parameters = node.Parameters.Select(x => CType(x.Type, x.Name.Ident));
writer.WriteLine($"{CType(node.ReturnType, node.Name.Ident)}({string.Join(", ", parameters)})");
writer.WriteLine("int main(int argc, char *argv[])");
writer.WriteLine("{");
using (writer.Indent())
{
EmitStatement(node.Body);
writer.WriteLine($"return {main.GetMangledName()}();");
}
writer.WriteLine("}");
}
writer.WriteLine();
foreach (var function in functions)
{
var parameters = function.Parameters.Select(x => CType(x.Type, x.Name.Ident));
writer.WriteLine($"{CType(function.ReturnType, function.GetMangledName())}({string.Join(", ", parameters)})");
writer.WriteLine("{");
using (writer.Indent())
{
EmitStatement(function.Body);
}
writer.WriteLine("}");
writer.WriteLine();
}
@@ -114,7 +139,6 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
foreach (var statement in node.Statements)
EmitStatement(statement);
}
writer.WriteLine("}");
}
@@ -153,7 +177,6 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
{
EmitStatement(statement.ThenBlock);
}
writer.WriteLine("}");
if (statement.ElseBlock != null)
@@ -169,7 +192,6 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
{
EmitStatement(statement.ElseBlock);
}
writer.WriteLine("}");
}
}
@@ -183,7 +205,6 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
{
EmitStatement(statement.Block);
}
writer.WriteLine("}");
}
@@ -199,7 +220,7 @@ public sealed class Generator(List<TypedNodeDefinitionFunc> functions, ModuleGra
TypedNodeExpressionStructLiteral expression => EmitExpressionStructLiteral(expression),
TypedNodeExpressionMemberAccess expression => EmitExpressionMemberAccess(expression),
TypedNodeExpressionLocalIdent expression => expression.Value.Ident,
TypedNodeExpressionModuleIdent expression => expression.Value.Ident,
TypedNodeExpressionModuleIdent expression => SymbolNameGen.Exported(expression.Module.Ident, expression.Value.Ident, expression.Type),
TypedNodeExpressionFuncCall expression => EmitExpressionFuncCall(expression),
_ => throw new ArgumentOutOfRangeException(nameof(node), node, null)
};