explicit variable types

This commit is contained in:
nub31
2025-05-16 21:27:27 +02:00
parent ecd0e01aac
commit 1676806ef0
5 changed files with 31 additions and 10 deletions

View File

@@ -2,10 +2,7 @@ import c
global func main(argc: i64, argv: i64) { global func main(argc: i64, argv: i64) {
printf("args: %d, starts at %p\n", argc, argv) printf("args: %d, starts at %p\n", argc, argv)
test(12.1)
return 23
}
func test(a: f64) { x: i8 = 320000
printf("%f\n", a) printf("%d\n", x)
} }

View File

@@ -14,6 +14,7 @@ public class Generator
private readonly Stack<string> _breakLabels = new(); private readonly Stack<string> _breakLabels = new();
private readonly Stack<string> _continueLabels = new(); private readonly Stack<string> _continueLabels = new();
private bool _codeIsReachable = true; private bool _codeIsReachable = true;
private LocalFuncDefinitionNode? _currentFuncDefininition;
public Generator(List<DefinitionNode> definitions) public Generator(List<DefinitionNode> definitions)
{ {
@@ -217,6 +218,7 @@ public class Generator
private void GenerateFuncDefinition(LocalFuncDefinitionNode node) private void GenerateFuncDefinition(LocalFuncDefinitionNode node)
{ {
_currentFuncDefininition = node;
_variables.Clear(); _variables.Clear();
if (node.Global) if (node.Global)
@@ -288,6 +290,7 @@ public class Generator
} }
_builder.AppendLine("}"); _builder.AppendLine("}");
_currentFuncDefininition = null;
} }
private void GenerateStructDefinition(StructDefinitionNode structDefinition) private void GenerateStructDefinition(StructDefinitionNode structDefinition)
@@ -433,8 +436,14 @@ public class Generator
{ {
if (@return.Value.HasValue) 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 result = GenerateExpression(@return.Value.Value);
_builder.AppendLine($" ret {result}"); var converted = GenerateTypeConversion(result, @return.Value.Value.Type, _currentFuncDefininition.ReturnType.Value);
_builder.AppendLine($" ret {converted}");
} }
else else
{ {
@@ -445,10 +454,17 @@ public class Generator
private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment) private void GenerateVariableAssignment(VariableAssignmentNode variableAssignment)
{ {
var result = GenerateExpression(variableAssignment.Value); 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 _variables[variableAssignment.Name] = new Variable
{ {
Identifier = result, Identifier = result,
Type = variableAssignment.Value.Type Type = variableType
}; };
} }

View File

@@ -157,7 +157,14 @@ public class Parser
case Symbol.Assign: case Symbol.Assign:
{ {
var value = ParseExpression(); var value = ParseExpression();
return new VariableAssignmentNode(identifier.Value, value); return new VariableAssignmentNode(identifier.Value, Optional<NubType>.Empty(), value);
}
case Symbol.Colon:
{
var type = ParseType();
ExpectSymbol(Symbol.Assign);
var value = ParseExpression();
return new VariableAssignmentNode(identifier.Value,type, value);
} }
default: default:
{ {

View File

@@ -1,7 +1,8 @@
namespace Nub.Lang.Frontend.Parsing; namespace Nub.Lang.Frontend.Parsing;
public class VariableAssignmentNode(string name, ExpressionNode value) : StatementNode public class VariableAssignmentNode(string name, Optional<NubType> explicitType, ExpressionNode value) : StatementNode
{ {
public string Name { get; } = name; public string Name { get; } = name;
public Optional<NubType> ExplicitType { get; } = explicitType;
public ExpressionNode Value { get; } = value; public ExpressionNode Value { get; } = value;
} }

View File

@@ -143,7 +143,7 @@ public class ExpressionTyper
private void PopulateVariableAssignment(VariableAssignmentNode variableAssignment) private void PopulateVariableAssignment(VariableAssignmentNode variableAssignment)
{ {
PopulateExpression(variableAssignment.Value); PopulateExpression(variableAssignment.Value);
_variables.Push(new Variable(variableAssignment.Name, variableAssignment.Value.Type)); _variables.Push(new Variable(variableAssignment.Name, variableAssignment.ExplicitType.HasValue ? variableAssignment.ExplicitType.Value : variableAssignment.Value.Type));
} }
private void PopulateVariableReassignment(VariableAssignmentNode variableAssignment) private void PopulateVariableReassignment(VariableAssignmentNode variableAssignment)