literal fix

This commit is contained in:
nub31
2025-06-07 19:19:27 +02:00
parent 44320aa784
commit 23f955f8b2
8 changed files with 58 additions and 61 deletions

View File

@@ -1,6 +1,7 @@
using System.Diagnostics;
using System.Globalization;
using System.Text;
using Nub.Lang.Frontend.Lexing;
using Nub.Lang.Frontend.Parsing;
using Nub.Lang.Frontend.Parsing.Definitions;
using Nub.Lang.Frontend.Parsing.Expressions;
@@ -15,7 +16,7 @@ public class Generator
private List<SourceFile> _sourceFiles = [];
private StringBuilder _builder = new();
private Dictionary<string, Variable> _variables = [];
private Dictionary<string, string> _variables = [];
private List<string> _strings = [];
private Stack<string> _breakLabels = [];
private Stack<string> _continueLabels = [];
@@ -28,7 +29,7 @@ public class Generator
{
_sourceFiles = sourceFiles;
_builder = new StringBuilder();
_variables = new Dictionary<string, Variable>();
_variables = new Dictionary<string, string>();
_strings = [];
_funcNames = [];
_breakLabels = [];
@@ -355,11 +356,7 @@ public class Generator
_builder.AppendLine($" {pointerName} {QBEAssign(parameter.Type)} alloc8 {SizeOf(parameter.Type)}");
_builder.AppendLine($" storel %{parameterName}, {pointerName}");
_variables[parameter.Name] = new Variable
{
Pointer = pointerName,
Type = parameter.Type
};
_variables[parameter.Name] = pointerName;
}
_builder.AppendLine();
@@ -627,7 +624,7 @@ public class Generator
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment)
{
var result = GenerateExpression(variableAssignment.Value);
_builder.AppendLine($" storel {result}, {_variables[variableAssignment.Identifier.Identifier].Pointer}");
_builder.AppendLine($" storel {result}, {_variables[variableAssignment.Identifier.Identifier]}");
}
private void GenerateVariableDeclaration(VariableDeclarationNode variableDeclaration)
@@ -664,11 +661,7 @@ public class Generator
}
}
_variables[variableDeclaration.Name] = new Variable
{
Pointer = pointerName,
Type = type
};
_variables[variableDeclaration.Name] = pointerName;
}
private void GenerateWhile(WhileNode whileStatement)
@@ -1522,42 +1515,34 @@ public class Generator
var variable = _variables[identifier.Identifier];
if (IsLargeType(identifier.Type))
{
return variable.Pointer;
return variable;
}
else
{
var outputName = GenVarName();
_builder.AppendLine($" {outputName} {QBEAssign(identifier.Type)} {QBELoad(identifier.Type)} {variable.Pointer}");
_builder.AppendLine($" {outputName} {QBEAssign(identifier.Type)} {QBELoad(identifier.Type)} {variable}");
return outputName;
}
}
private string GenerateLiteral(LiteralNode literal)
{
if (literal.LiteralType.Equals(NubPrimitiveType.String))
switch (literal.Kind)
{
_strings.Add(literal.Literal);
return $"$str{_strings.Count}";
case LiteralKind.Integer:
return literal.Literal;
case LiteralKind.Float:
var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.DoubleToInt64Bits(value);
return bits.ToString();
case LiteralKind.String:
_strings.Add(literal.Literal);
return $"$str{_strings.Count}";
case LiteralKind.Bool:
return bool.Parse(literal.Literal) ? "1" : "0";
default:
throw new ArgumentOutOfRangeException();
}
if (literal.LiteralType.Equals(NubPrimitiveType.I64))
{
return literal.Literal;
}
if (literal.LiteralType.Equals(NubPrimitiveType.F64))
{
var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture);
var bits = BitConverter.DoubleToInt64Bits(value);
return bits.ToString();
}
if (literal.LiteralType.Equals(NubPrimitiveType.Bool))
{
return bool.Parse(literal.Literal) ? "1" : "0";
}
throw new NotSupportedException($"Literal {literal.LiteralType} is not supported");
}
private string GenerateStructInitializer(StructInitializerNode structInitializer)
@@ -1787,10 +1772,4 @@ public class Generator
{
return structDefinition.Fields.TakeWhile(f => f.Name != member).Sum(f => SizeOf(f.Type));
}
private class Variable
{
public required string Pointer { get; init; }
public required NubType Type { get; init; }
}
}