This commit is contained in:
nub31
2025-10-17 14:45:55 +02:00
parent 36eae1a2a2
commit 9a8ecced83
10 changed files with 1783 additions and 285 deletions

View File

@@ -1,4 +1,5 @@
using NubLang.Ast;
using NubLang.Syntax;
namespace NubLang.Generation;
@@ -105,45 +106,45 @@ public class Generator
public string Emit()
{
var header = """
typedef __builtin_va_list va_list;
const string header = """
typedef __builtin_va_list va_list;
#define va_start(ap, last) __builtin_va_start(ap, last)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
#define va_end(ap) __builtin_va_end(ap)
#define va_copy(dest, src) __builtin_va_copy(dest, src)
#define va_start(ap, last) __builtin_va_start(ap, last)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
#define va_end(ap) __builtin_va_end(ap)
#define va_copy(dest, src) __builtin_va_copy(dest, src)
#define NULL ((void*)0)
#define NULL ((void*)0)
typedef unsigned long size_t;
typedef unsigned long uintptr_t;
typedef unsigned long size_t;
typedef unsigned long uintptr_t;
#define offsetof(type, member) __builtin_offsetof(type, member)
#define offsetof(type, member) __builtin_offsetof(type, member)
typedef unsigned char u8;
typedef signed char i8;
typedef unsigned short u16;
typedef signed short i16;
typedef unsigned int u32;
typedef signed int i32;
typedef unsigned long long u64;
typedef signed long long i64;
typedef unsigned char u8;
typedef signed char i8;
typedef unsigned short u16;
typedef signed short i16;
typedef unsigned int u32;
typedef signed int i32;
typedef unsigned long long u64;
typedef signed long long i64;
typedef float f32;
typedef double f64;
typedef float f32;
typedef double f64;
#define I8_C(x) x
#define U8_C(x) x##U
#define I8_C(x) x
#define U8_C(x) x##U
#define I16_C(x) x
#define U16_C(x) x##U
#define I16_C(x) x
#define U16_C(x) x##U
#define I32_C(x) x
#define U32_C(x) x##U
#define I32_C(x) x
#define U32_C(x) x##U
#define I64_C(x) x##LL
#define U64_C(x) x##ULL
""";
#define I64_C(x) x##LL
#define U64_C(x) x##ULL
""";
foreach (var structType in _structTypes)
{
@@ -165,6 +166,7 @@ public class Generator
foreach (var funcNode in _definitions.OfType<FuncNode>())
{
EmitLine(funcNode.Tokens);
appendNewLine = true;
var parameters = funcNode.Signature.Parameters.Count != 0
? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
@@ -183,6 +185,7 @@ public class Generator
{
foreach (var structFuncNode in structNode.Functions)
{
EmitLine(structFuncNode.Tokens);
var parameters = structFuncNode.Signature.Parameters.Count != 0
? string.Join(", ", structFuncNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
: "void";
@@ -198,6 +201,7 @@ public class Generator
{
if (funcNode.Body == null) continue;
EmitLine(funcNode.Tokens);
var parameters = funcNode.Signature.Parameters.Count != 0
? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
: "void";
@@ -232,6 +236,7 @@ public class Generator
private void EmitStatement(StatementNode statementNode)
{
EmitLine(statementNode.Tokens);
switch (statementNode)
{
case AssignmentNode assignmentNode:
@@ -272,6 +277,16 @@ public class Generator
}
}
private void EmitLine(List<Token> tokens)
{
if (tokens.Count >= 1)
{
var file = tokens[0].Span.FilePath;
var line = tokens[0].Span.Start.Line;
_writer.WriteLine($"#line {line} \"{file}\"");
}
}
private void EmitAssignment(AssignmentNode assignmentNode)
{
var target = EmitExpression(assignmentNode.Target);
@@ -294,18 +309,14 @@ public class Generator
_deferStack.Peek().Add(deferNode);
}
private void EmitIf(IfNode ifNode)
private void EmitIf(IfNode ifNode, bool elseIf = false)
{
var condition = EmitExpression(ifNode.Condition);
_writer.WriteLine($"if ({condition})");
_writer.WriteLine($"{(elseIf ? "else" : "")} if ({condition})");
EmitBlock(ifNode.Body);
ifNode.Else?.Match
(
elseIfNode =>
{
_writer.Write("else ");
EmitIf(elseIfNode);
},
elseIfNode => EmitIf(elseIfNode, true),
elseNode =>
{
_writer.WriteLine("else");