type checker

This commit is contained in:
nub31
2025-05-16 22:14:41 +02:00
parent 1de31c16c5
commit 99e4543e74
5 changed files with 418 additions and 315 deletions

View File

@@ -14,7 +14,6 @@ public class Generator
private readonly Stack<string> _breakLabels = new();
private readonly Stack<string> _continueLabels = new();
private bool _codeIsReachable = true;
private LocalFuncDefinitionNode? _currentFuncDefininition;
public Generator(List<DefinitionNode> definitions)
{
@@ -218,7 +217,6 @@ public class Generator
private void GenerateFuncDefinition(LocalFuncDefinitionNode node)
{
_currentFuncDefininition = node;
_variables.Clear();
if (node.Global)
@@ -290,7 +288,6 @@ public class Generator
}
_builder.AppendLine("}");
_currentFuncDefininition = null;
}
private void GenerateStructDefinition(StructDefinitionNode structDefinition)
@@ -370,8 +367,7 @@ public class Generator
}
var parameter = funcCall.Parameters[i];
var parameterOutput = GenerateExpression(parameter);
var result = GenerateTypeConversion(parameterOutput, parameter.Type, expectedType);
var result = GenerateExpression(parameter);
var qbeParameterType = SQT(expectedType.Equals(NubPrimitiveType.Any) ? parameter.Type : expectedType);
parameterStrings.Add($"{qbeParameterType} {result}");
@@ -436,14 +432,8 @@ public class Generator
{
if (@return.Value.HasValue)
{
if (!_currentFuncDefininition!.ReturnType.HasValue)
{
throw new Exception("Cannot return a value when function does not have a return value");
}
var result = GenerateExpression(@return.Value.Value);
var converted = GenerateTypeConversion(result, @return.Value.Value.Type, _currentFuncDefininition.ReturnType.Value);
_builder.AppendLine($" ret {converted}");
_builder.AppendLine($" ret {result}");
}
else
{
@@ -454,17 +444,10 @@ public class Generator
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment)
{
var result = GenerateExpression(variableAssignment.Value);
var variableType = variableAssignment.Value.Type;
if (variableAssignment.ExplicitType.HasValue)
{
result = GenerateTypeConversion(result, variableType, variableAssignment.ExplicitType.Value);
variableType = variableAssignment.ExplicitType.Value;
}
_variables[variableAssignment.Name] = new Variable
{
Identifier = result,
Type = variableType
Type = variableAssignment.Value.Type
};
}