Add support for global functions

This commit is contained in:
nub31
2025-05-05 16:27:11 +02:00
parent 1f42a3f82d
commit f77fdb86f3
7 changed files with 44 additions and 5 deletions

View File

@@ -1,11 +1,12 @@
namespace Nub.Lang.Frontend.Parsing;
public class LocalFuncDefinitionNode(string name, List<FuncParameter> parameters, BlockNode body, Optional<NubType> returnType) : DefinitionNode
public class LocalFuncDefinitionNode(string name, List<FuncParameter> parameters, BlockNode body, Optional<NubType> returnType, bool global) : DefinitionNode
{
public string Name { get; } = name;
public List<FuncParameter> Parameters { get; } = parameters;
public BlockNode Body { get; } = body;
public Optional<NubType> ReturnType { get; } = returnType;
public bool Global { get; } = global;
public override string ToString() => $"{Name}({string.Join(", ", Parameters.Select(p => p.ToString()))}){(ReturnType.HasValue ? ": " + ReturnType.Value : "")}";
}

View File

@@ -44,6 +44,7 @@ public class Parser
return keyword.Symbol switch
{
Symbol.Func => ParseFuncDefinition(),
Symbol.Global => ParseGlobalFuncDefinition(),
Symbol.Extern => ParseExternFuncDefinition(),
Symbol.Struct => ParseStruct(),
_ => throw new Exception("Unexpected symbol: " + keyword.Symbol)
@@ -72,7 +73,33 @@ public class Parser
var body = ParseBlock();
return new LocalFuncDefinitionNode(name.Value, parameters, body, returnType);
return new LocalFuncDefinitionNode(name.Value, parameters, body, returnType, false);
}
private LocalFuncDefinitionNode ParseGlobalFuncDefinition()
{
ExpectSymbol(Symbol.Func);
var name = ExpectIdentifier();
List<FuncParameter> parameters = [];
ExpectSymbol(Symbol.OpenParen);
if (!TryExpectSymbol(Symbol.CloseParen))
{
while (!TryExpectSymbol(Symbol.CloseParen))
{
parameters.Add(ParseFuncParameter());
TryExpectSymbol(Symbol.Comma);
}
}
var returnType = Optional<NubType>.Empty();
if (TryExpectSymbol(Symbol.Colon))
{
returnType = ParseTypeInstance();
}
var body = ParseBlock();
return new LocalFuncDefinitionNode(name.Value, parameters, body, returnType, true);
}
private ExternFuncDefinitionNode ParseExternFuncDefinition()