...
This commit is contained in:
@@ -603,7 +603,7 @@ public sealed class Binder
|
|||||||
{
|
{
|
||||||
ArrayTypeSyntax type => new NubArrayType(BindType(type.BaseType)),
|
ArrayTypeSyntax type => new NubArrayType(BindType(type.BaseType)),
|
||||||
CStringTypeSyntax => new NubCStringType(),
|
CStringTypeSyntax => new NubCStringType(),
|
||||||
CustomTypeSyntax type => new NubCustomType(type.Namespace, type.Name),
|
CustomTypeSyntax type => new NubCustomType(type.Namespace, type.MangledName()),
|
||||||
FuncTypeSyntax type => new NubFuncType(type.Parameters.Select(BindType).ToList(), BindType(type.ReturnType)),
|
FuncTypeSyntax type => new NubFuncType(type.Parameters.Select(BindType).ToList(), BindType(type.ReturnType)),
|
||||||
PointerTypeSyntax type => new NubPointerType(BindType(type.BaseType)),
|
PointerTypeSyntax type => new NubPointerType(BindType(type.BaseType)),
|
||||||
PrimitiveTypeSyntax type => new NubPrimitiveType(type.SyntaxKind switch
|
PrimitiveTypeSyntax type => new NubPrimitiveType(type.SyntaxKind switch
|
||||||
@@ -622,7 +622,6 @@ public sealed class Binder
|
|||||||
_ => throw new ArgumentOutOfRangeException()
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
}),
|
}),
|
||||||
StringTypeSyntax => new NubStringType(),
|
StringTypeSyntax => new NubStringType(),
|
||||||
TemplatedCustomTypeSyntax type => new NubCustomType(type.Namespace, type.MangledName()),
|
|
||||||
VoidTypeSyntax => new NubVoidType(),
|
VoidTypeSyntax => new NubVoidType(),
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(node))
|
_ => throw new ArgumentOutOfRangeException(nameof(node))
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,24 +3,24 @@ using NubLang.Syntax.Tokenization;
|
|||||||
|
|
||||||
namespace NubLang.Syntax.Parsing.Node;
|
namespace NubLang.Syntax.Parsing.Node;
|
||||||
|
|
||||||
public record TemplateParameterSyntax(IReadOnlyList<Token> Tokens, string Name) : SyntaxNode(Tokens);
|
public record GenericParameter(IReadOnlyList<Token> Tokens, string Name) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public abstract record DefinitionSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<TemplateParameterSyntax> Parameters) : SyntaxNode(Tokens);
|
public abstract record DefinitionSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record FuncParameterSyntax(IReadOnlyList<Token> Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens);
|
public record FuncParameterSyntax(IReadOnlyList<Token> Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record FuncSignatureSyntax(IReadOnlyList<Token> Tokens, IReadOnlyList<FuncParameterSyntax> Parameters, TypeSyntax ReturnType) : SyntaxNode(Tokens);
|
public record FuncSignatureSyntax(IReadOnlyList<Token> Tokens, IReadOnlyList<FuncParameterSyntax> Parameters, TypeSyntax ReturnType) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record LocalFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<TemplateParameterSyntax> Parameters, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
public record LocalFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
||||||
|
|
||||||
public record ExternFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<TemplateParameterSyntax> Parameters, string Name, string CallName, FuncSignatureSyntax Signature) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
public record ExternFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, string CallName, FuncSignatureSyntax Signature) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
||||||
|
|
||||||
public record StructFieldSyntax(IReadOnlyList<Token> Tokens, int Index, string Name, TypeSyntax Type, Optional<ExpressionSyntax> Value) : SyntaxNode(Tokens);
|
public record StructFieldSyntax(IReadOnlyList<Token> Tokens, int Index, string Name, TypeSyntax Type, Optional<ExpressionSyntax> Value) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record StructFuncSyntax(IReadOnlyList<Token> Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : SyntaxNode(Tokens);
|
public record StructFuncSyntax(IReadOnlyList<Token> Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record StructSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<TemplateParameterSyntax> Parameters, string Name, IReadOnlyList<StructFieldSyntax> Fields, IReadOnlyList<StructFuncSyntax> Funcs) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
public record StructSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, IReadOnlyList<StructFieldSyntax> Fields, IReadOnlyList<StructFuncSyntax> Funcs) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
||||||
|
|
||||||
public record InterfaceFuncSyntax(IReadOnlyList<Token> Tokens, string Name, FuncSignatureSyntax Signature) : SyntaxNode(Tokens);
|
public record InterfaceFuncSyntax(IReadOnlyList<Token> Tokens, string Name, FuncSignatureSyntax Signature) : SyntaxNode(Tokens);
|
||||||
|
|
||||||
public record InterfaceSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<TemplateParameterSyntax> Parameters, string Name, IReadOnlyList<InterfaceFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
public record InterfaceSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, IReadOnlyList<InterfaceFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace, Parameters);
|
||||||
@@ -29,9 +29,7 @@ public abstract record TypeSyntax(IReadOnlyList<Token> Tokens) : SyntaxNode(Toke
|
|||||||
StringTypeSyntax => "string",
|
StringTypeSyntax => "string",
|
||||||
PointerTypeSyntax ptr => $"ptr_{ptr.BaseType.MangledName()}",
|
PointerTypeSyntax ptr => $"ptr_{ptr.BaseType.MangledName()}",
|
||||||
ArrayTypeSyntax arr => $"arr_{arr.BaseType.MangledName()}",
|
ArrayTypeSyntax arr => $"arr_{arr.BaseType.MangledName()}",
|
||||||
CustomTypeSyntax custom => $"{custom.Namespace}_{custom.Name}",
|
CustomTypeSyntax custom => $"{custom.Namespace}_{custom.Name}_{string.Join("_", custom.Arguments.Select(x => x.MangledName()))}",
|
||||||
TemplateTypeSyntax template => $"tmpl_{template.Name}",
|
|
||||||
TemplatedCustomTypeSyntax tmpl => $"{tmpl.Namespace}_{tmpl.Name}_{string.Join("_", tmpl.Arguments.Select(x => x.MangledName()))}",
|
|
||||||
FuncTypeSyntax func => $"func_{string.Join("_", func.Parameters.Select(x => x.MangledName()))}_to_{func.ReturnType.MangledName()}",
|
FuncTypeSyntax func => $"func_{string.Join("_", func.Parameters.Select(x => x.MangledName()))}_to_{func.ReturnType.MangledName()}",
|
||||||
_ => throw new NotSupportedException($"Unknown type syntax: {GetType().Name}")
|
_ => throw new NotSupportedException($"Unknown type syntax: {GetType().Name}")
|
||||||
};
|
};
|
||||||
@@ -50,10 +48,8 @@ public record CStringTypeSyntax(IReadOnlyList<Token> Tokens) : TypeSyntax(Tokens
|
|||||||
|
|
||||||
public record StringTypeSyntax(IReadOnlyList<Token> Tokens) : TypeSyntax(Tokens);
|
public record StringTypeSyntax(IReadOnlyList<Token> Tokens) : TypeSyntax(Tokens);
|
||||||
|
|
||||||
public record CustomTypeSyntax(IReadOnlyList<Token> Tokens, string Name, string Namespace) : TypeSyntax(Tokens);
|
public record CustomTypeSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, IReadOnlyList<TypeSyntax> Arguments) : TypeSyntax(Tokens);
|
||||||
|
|
||||||
public record TemplatedCustomTypeSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, IReadOnlyList<TypeSyntax> Arguments) : TypeSyntax(Tokens);
|
public record GenericTypeSyntax(IReadOnlyList<Token> Tokens, string Name) : TypeSyntax(Tokens);
|
||||||
|
|
||||||
public record TemplateTypeSyntax(IReadOnlyList<Token> Tokens, string Name) : TypeSyntax(Tokens);
|
|
||||||
|
|
||||||
public record ArrayTypeSyntax(IReadOnlyList<Token> Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens);
|
public record ArrayTypeSyntax(IReadOnlyList<Token> Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens);
|
||||||
@@ -12,6 +12,7 @@ public sealed class Parser
|
|||||||
private readonly IReadOnlyList<Token> _tokens;
|
private readonly IReadOnlyList<Token> _tokens;
|
||||||
|
|
||||||
private readonly List<Diagnostic> _diagnostics = [];
|
private readonly List<Diagnostic> _diagnostics = [];
|
||||||
|
private readonly List<GenericParameter> _genericParameters = [];
|
||||||
private int _tokenIndex;
|
private int _tokenIndex;
|
||||||
|
|
||||||
public Parser(IReadOnlyList<Token> tokens)
|
public Parser(IReadOnlyList<Token> tokens)
|
||||||
@@ -23,6 +24,7 @@ public sealed class Parser
|
|||||||
public SyntaxTree Parse()
|
public SyntaxTree Parse()
|
||||||
{
|
{
|
||||||
_diagnostics.Clear();
|
_diagnostics.Clear();
|
||||||
|
_genericParameters.Clear();
|
||||||
_tokenIndex = 0;
|
_tokenIndex = 0;
|
||||||
|
|
||||||
if (TryExpectSymbol(Symbol.Namespace))
|
if (TryExpectSymbol(Symbol.Namespace))
|
||||||
@@ -34,13 +36,13 @@ public sealed class Parser
|
|||||||
|
|
||||||
while (Peek().HasValue)
|
while (Peek().HasValue)
|
||||||
{
|
{
|
||||||
|
_genericParameters.Clear();
|
||||||
var startIndex = _tokenIndex;
|
var startIndex = _tokenIndex;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var keyword = ExpectSymbol();
|
var keyword = ExpectSymbol();
|
||||||
var name = ExpectIdentifier();
|
var name = ExpectIdentifier();
|
||||||
var templateParameters = new List<TemplateParameterSyntax>();
|
|
||||||
|
|
||||||
if (TryExpectSymbol(Symbol.LessThan))
|
if (TryExpectSymbol(Symbol.LessThan))
|
||||||
{
|
{
|
||||||
@@ -57,17 +59,17 @@ public sealed class Parser
|
|||||||
.Build());
|
.Build());
|
||||||
}
|
}
|
||||||
|
|
||||||
var parameter = new TemplateParameterSyntax(GetTokens(argumentStartIndex), identifier.Value);
|
var parameter = new GenericParameter(GetTokens(argumentStartIndex), identifier.Value);
|
||||||
templateParameters.Add(parameter);
|
_genericParameters.Add(parameter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var definition = keyword.Symbol switch
|
var definition = keyword.Symbol switch
|
||||||
{
|
{
|
||||||
Symbol.Extern => ParseExtern(startIndex, name, templateParameters),
|
Symbol.Extern => ParseExtern(startIndex, name, _genericParameters),
|
||||||
Symbol.Func => ParseFunc(startIndex, name, templateParameters),
|
Symbol.Func => ParseFunc(startIndex, name, _genericParameters),
|
||||||
Symbol.Struct => ParseStruct(startIndex, name, templateParameters),
|
Symbol.Struct => ParseStruct(startIndex, name, _genericParameters),
|
||||||
Symbol.Interface => ParseInterface(startIndex, name, templateParameters),
|
Symbol.Interface => ParseInterface(startIndex, name, _genericParameters),
|
||||||
_ => throw new ParseException(Diagnostic
|
_ => throw new ParseException(Diagnostic
|
||||||
.Error($"Expected 'extern', 'func', 'struct', 'trait' or 'impl' but found '{keyword.Symbol}'")
|
.Error($"Expected 'extern', 'func', 'struct', 'trait' or 'impl' but found '{keyword.Symbol}'")
|
||||||
.WithHelp("Valid definition keywords are 'extern', 'func', 'struct', 'trait' and 'impl'")
|
.WithHelp("Valid definition keywords are 'extern', 'func', 'struct', 'trait' and 'impl'")
|
||||||
@@ -138,7 +140,7 @@ public sealed class Parser
|
|||||||
return new FuncParameterSyntax(GetTokens(startIndex), name.Value, type);
|
return new FuncParameterSyntax(GetTokens(startIndex), name.Value, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DefinitionSyntax ParseExtern(int startIndex, IdentifierToken name, IReadOnlyList<TemplateParameterSyntax> templateParameters)
|
private DefinitionSyntax ParseExtern(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> templateParameters)
|
||||||
{
|
{
|
||||||
var keyword = ExpectSymbol();
|
var keyword = ExpectSymbol();
|
||||||
return keyword.Symbol switch
|
return keyword.Symbol switch
|
||||||
@@ -148,7 +150,7 @@ public sealed class Parser
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private ExternFuncSyntax ParseExternFunc(int startIndex, IdentifierToken name, IReadOnlyList<TemplateParameterSyntax> templateParameters)
|
private ExternFuncSyntax ParseExternFunc(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> templateParameters)
|
||||||
{
|
{
|
||||||
var callName = name.Value;
|
var callName = name.Value;
|
||||||
|
|
||||||
@@ -162,7 +164,7 @@ public sealed class Parser
|
|||||||
return new ExternFuncSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, callName, signature);
|
return new ExternFuncSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, callName, signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocalFuncSyntax ParseFunc(int startIndex, IdentifierToken name, IReadOnlyList<TemplateParameterSyntax> templateParameters)
|
private LocalFuncSyntax ParseFunc(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> templateParameters)
|
||||||
{
|
{
|
||||||
var signature = ParseFuncSignature();
|
var signature = ParseFuncSignature();
|
||||||
var body = ParseBlock();
|
var body = ParseBlock();
|
||||||
@@ -170,7 +172,7 @@ public sealed class Parser
|
|||||||
return new LocalFuncSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, signature, body);
|
return new LocalFuncSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, signature, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DefinitionSyntax ParseStruct(int startIndex, IdentifierToken name, IReadOnlyList<TemplateParameterSyntax> templateParameters)
|
private DefinitionSyntax ParseStruct(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> templateParameters)
|
||||||
{
|
{
|
||||||
ExpectSymbol(Symbol.OpenBrace);
|
ExpectSymbol(Symbol.OpenBrace);
|
||||||
|
|
||||||
@@ -186,9 +188,10 @@ public sealed class Parser
|
|||||||
if (TryExpectSymbol(Symbol.Func))
|
if (TryExpectSymbol(Symbol.Func))
|
||||||
{
|
{
|
||||||
var funcName = ExpectIdentifier().Value;
|
var funcName = ExpectIdentifier().Value;
|
||||||
var funcSignature = ParseFuncSignature(new FuncParameterSyntax([], "this", new CustomTypeSyntax([], _namespace, name.Value)));
|
var thisArg = new FuncParameterSyntax([], "this", new CustomTypeSyntax([], _namespace, name.Value, templateParameters.Select(x => new GenericTypeSyntax(x.Tokens, x.Name)).ToList()));
|
||||||
|
var funcSignature = ParseFuncSignature(thisArg);
|
||||||
var funcBody = ParseBlock();
|
var funcBody = ParseBlock();
|
||||||
|
|
||||||
funcs.Add(new StructFuncSyntax(GetTokens(memberStartIndex), funcName, funcSignature, funcBody));
|
funcs.Add(new StructFuncSyntax(GetTokens(memberStartIndex), funcName, funcSignature, funcBody));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -211,7 +214,7 @@ public sealed class Parser
|
|||||||
return new StructSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, fields, funcs);
|
return new StructSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, fields, funcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private InterfaceSyntax ParseInterface(int startIndex, IdentifierToken name, IReadOnlyList<TemplateParameterSyntax> templateParameters)
|
private InterfaceSyntax ParseInterface(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> templateParameters)
|
||||||
{
|
{
|
||||||
ExpectSymbol(Symbol.OpenBrace);
|
ExpectSymbol(Symbol.OpenBrace);
|
||||||
|
|
||||||
@@ -643,6 +646,12 @@ public sealed class Parser
|
|||||||
|
|
||||||
if (TryExpectIdentifier(out var name))
|
if (TryExpectIdentifier(out var name))
|
||||||
{
|
{
|
||||||
|
var genericParameter = _genericParameters.FirstOrDefault(x => x.Name == name.Value);
|
||||||
|
if (genericParameter != null)
|
||||||
|
{
|
||||||
|
return new GenericTypeSyntax(GetTokens(startIndex), genericParameter.Name);
|
||||||
|
}
|
||||||
|
|
||||||
return name.Value switch
|
return name.Value switch
|
||||||
{
|
{
|
||||||
"void" => new VoidTypeSyntax(GetTokens(startIndex)),
|
"void" => new VoidTypeSyntax(GetTokens(startIndex)),
|
||||||
@@ -678,11 +687,9 @@ public sealed class Parser
|
|||||||
{
|
{
|
||||||
parameters.Add(ParseType());
|
parameters.Add(ParseType());
|
||||||
}
|
}
|
||||||
|
|
||||||
return new TemplatedCustomTypeSyntax(GetTokens(startIndex), @namespace, name.Value, parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new CustomTypeSyntax(GetTokens(startIndex), name.Value, @namespace);
|
return new CustomTypeSyntax(GetTokens(startIndex), name.Value, @namespace, parameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user