This commit is contained in:
nub31
2025-05-14 21:47:04 +02:00
parent 86878e5fd2
commit b8103c11ad
3 changed files with 58 additions and 34 deletions

View File

@@ -123,7 +123,7 @@ public class Generator
} }
} }
} }
private static string FQT(NubType type) private static string FQT(NubType type)
{ {
switch (type) switch (type)
@@ -254,10 +254,10 @@ public class Generator
parameterStrings.Add($"{FQT(parameter.Type)} %{parameter.Name}"); parameterStrings.Add($"{FQT(parameter.Type)} %{parameter.Name}");
} }
} }
_builder.AppendLine($"({string.Join(", ", parameterStrings)}) {{"); _builder.AppendLine($"({string.Join(", ", parameterStrings)}) {{");
_builder.AppendLine("@start"); _builder.AppendLine("@start");
foreach (var parameter in node.Parameters) foreach (var parameter in node.Parameters)
{ {
switch (FQT(parameter.Type)) switch (FQT(parameter.Type))
@@ -276,7 +276,7 @@ public class Generator
break; break;
} }
} }
GenerateBlock(node.Body); GenerateBlock(node.Body);
if (!node.ReturnType.HasValue) if (!node.ReturnType.HasValue)
{ {
@@ -350,17 +350,17 @@ public class Generator
.OfType<LocalFuncDefinitionNode>() .OfType<LocalFuncDefinitionNode>()
.FirstOrDefault(d => d.Name == funcCall.FuncCall.Name) .FirstOrDefault(d => d.Name == funcCall.FuncCall.Name)
?.Parameters; ?.Parameters;
parameterDefinition ??= _definitions parameterDefinition ??= _definitions
.OfType<ExternFuncDefinitionNode>() .OfType<ExternFuncDefinitionNode>()
.FirstOrDefault(d => d.Name == funcCall.FuncCall.Name) .FirstOrDefault(d => d.Name == funcCall.FuncCall.Name)
?.Parameters; ?.Parameters;
if (parameterDefinition == null) if (parameterDefinition == null)
{ {
throw new Exception($"Unknown function {funcCall.FuncCall}"); throw new Exception($"Unknown function {funcCall.FuncCall}");
} }
var results = new List<(string, NubType)>(); var results = new List<(string, NubType)>();
foreach (var parameter in funcCall.FuncCall.Parameters) foreach (var parameter in funcCall.FuncCall.Parameters)
{ {
@@ -374,7 +374,7 @@ public class Generator
{ {
parameterStrings.Add("..."); parameterStrings.Add("...");
} }
parameterStrings.Add($"{SQT(results[i].Item2)} {results[i].Item1}"); parameterStrings.Add($"{SQT(results[i].Item2)} {results[i].Item1}");
} }
@@ -513,7 +513,7 @@ public class Generator
var left = GenerateExpression(binaryExpression.Left); var left = GenerateExpression(binaryExpression.Left);
var right = GenerateExpression(binaryExpression.Right); var right = GenerateExpression(binaryExpression.Right);
var outputLabel = GenName(); var outputLabel = GenName();
switch (binaryExpression.Operator) switch (binaryExpression.Operator)
{ {
case BinaryExpressionOperator.Equal: case BinaryExpressionOperator.Equal:
@@ -523,7 +523,7 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w ceql {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w ceql {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w ceqw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w ceqw {left}, {right}");
@@ -535,12 +535,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w call $nub_strcmp(l {left}, l {right})"); _builder.AppendLine($" %{outputLabel} =w call $nub_strcmp(l {left}, l {right})");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w ceqw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w ceqw {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.NotEqual: case BinaryExpressionOperator.NotEqual:
@@ -550,7 +551,7 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w cnel {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cnel {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w cnew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cnew {left}, {right}");
@@ -563,12 +564,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w xor %{outputLabel}, 1"); _builder.AppendLine($" %{outputLabel} =w xor %{outputLabel}, 1");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w cnew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cnew {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.GreaterThan: case BinaryExpressionOperator.GreaterThan:
@@ -578,18 +580,19 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w csgtl {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgtl {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w csgtw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgtw {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w csgtw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgtw {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.GreaterThanOrEqual: case BinaryExpressionOperator.GreaterThanOrEqual:
@@ -599,18 +602,19 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w csgel {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgel {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w csgew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgew {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w csgew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csgew {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.LessThan: case BinaryExpressionOperator.LessThan:
@@ -620,18 +624,19 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w csltl {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csltl {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w csltw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csltw {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w csltw {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w csltw {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.LessThanOrEqual: case BinaryExpressionOperator.LessThanOrEqual:
@@ -641,18 +646,19 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =w cslel {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cslel {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w cslew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cslew {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.Bool))
{ {
_builder.AppendLine($" %{outputLabel} =w cslew {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w cslew {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.Plus: case BinaryExpressionOperator.Plus:
@@ -662,12 +668,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =l add {left}, {right}"); _builder.AppendLine($" %{outputLabel} =l add {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w add {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w add {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.Minus: case BinaryExpressionOperator.Minus:
@@ -677,12 +684,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =l sub {left}, {right}"); _builder.AppendLine($" %{outputLabel} =l sub {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w sub {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w sub {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.Multiply: case BinaryExpressionOperator.Multiply:
@@ -692,12 +700,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =l mul {left}, {right}"); _builder.AppendLine($" %{outputLabel} =l mul {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w mul {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w mul {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
case BinaryExpressionOperator.Divide: case BinaryExpressionOperator.Divide:
@@ -707,12 +716,13 @@ public class Generator
_builder.AppendLine($" %{outputLabel} =l div {left}, {right}"); _builder.AppendLine($" %{outputLabel} =l div {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32)) if (binaryExpression.Left.Type.Equals(NubPrimitiveType.I32))
{ {
_builder.AppendLine($" %{outputLabel} =w div {left}, {right}"); _builder.AppendLine($" %{outputLabel} =w div {left}, {right}");
return $"%{outputLabel}"; return $"%{outputLabel}";
} }
break; break;
} }
default: default:
@@ -721,7 +731,8 @@ public class Generator
} }
} }
throw new NotSupportedException($"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported"); throw new NotSupportedException(
$"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported");
} }
private string GenerateIdentifier(IdentifierNode identifier) private string GenerateIdentifier(IdentifierNode identifier)
@@ -750,6 +761,17 @@ public class Generator
throw new NotSupportedException($"Literal {literal.LiteralType} is not supported"); throw new NotSupportedException($"Literal {literal.LiteralType} is not supported");
} }
private string GenerateCast(string input, NubType inputType, string output, NubType outputType)
{
if (outputType is not NubPrimitiveType primitiveOutputType || inputType is not NubPrimitiveType primitiveInputType)
{
throw new NotSupportedException("Casting is only supported for primitive types");
}
// var instruction =
return ""
}
private string GenerateStructInitializer(StructInitializerNode structInitializer) private string GenerateStructInitializer(StructInitializerNode structInitializer)
{ {
var structDefinition = _definitions.OfType<StructDefinitionNode>() var structDefinition = _definitions.OfType<StructDefinitionNode>()

View File

@@ -6,7 +6,6 @@
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -81,16 +81,19 @@ public class NubPrimitiveType : NubType
{ {
return kind switch return kind switch
{ {
PrimitiveTypeKind.I64 => "i64",
PrimitiveTypeKind.I32 => "i32",
PrimitiveTypeKind.I16 => "i16",
PrimitiveTypeKind.I8 => "i8", PrimitiveTypeKind.I8 => "i8",
PrimitiveTypeKind.U64 => "u64", PrimitiveTypeKind.I16 => "i16",
PrimitiveTypeKind.U32 => "u32", PrimitiveTypeKind.I32 => "i32",
PrimitiveTypeKind.U16 => "u16", PrimitiveTypeKind.I64 => "i64",
PrimitiveTypeKind.U8 => "u8", PrimitiveTypeKind.U8 => "u8",
PrimitiveTypeKind.F64 => "f64", PrimitiveTypeKind.U16 => "u16",
PrimitiveTypeKind.U32 => "u32",
PrimitiveTypeKind.U64 => "u64",
PrimitiveTypeKind.F32 => "f32", PrimitiveTypeKind.F32 => "f32",
PrimitiveTypeKind.F64 => "f64",
PrimitiveTypeKind.Bool => "bool", PrimitiveTypeKind.Bool => "bool",
PrimitiveTypeKind.String => "string", PrimitiveTypeKind.String => "string",
PrimitiveTypeKind.Any => "any", PrimitiveTypeKind.Any => "any",