...
This commit is contained in:
@@ -11,6 +11,7 @@ public sealed class Parser
|
||||
private List<Token> _tokens = [];
|
||||
private int _tokenIndex;
|
||||
private string _moduleName = string.Empty;
|
||||
private HashSet<string> _templateArguments = [];
|
||||
|
||||
private Token? CurrentToken => _tokenIndex < _tokens.Count ? _tokens[_tokenIndex] : null;
|
||||
private bool HasToken => CurrentToken != null;
|
||||
@@ -26,6 +27,7 @@ public sealed class Parser
|
||||
_tokens = tokens;
|
||||
_tokenIndex = 0;
|
||||
_moduleName = string.Empty;
|
||||
_templateArguments.Clear();
|
||||
|
||||
var metadata = ParseMetadata();
|
||||
var definitions = ParseDefinitions();
|
||||
@@ -39,13 +41,13 @@ public sealed class Parser
|
||||
|
||||
try
|
||||
{
|
||||
ExpectSymbol(Symbol.Module);
|
||||
_moduleName = ExpectLiteral(LiteralKind.String).Value;
|
||||
|
||||
while (TryExpectSymbol(Symbol.Import))
|
||||
{
|
||||
imports.Add(ExpectLiteral(LiteralKind.String).Value);
|
||||
}
|
||||
|
||||
ExpectSymbol(Symbol.Module);
|
||||
_moduleName = ExpectLiteral(LiteralKind.String).Value;
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
@@ -167,12 +169,11 @@ public sealed class Parser
|
||||
{
|
||||
var name = ExpectIdentifier();
|
||||
|
||||
var templateArguments = new List<string>();
|
||||
if (TryExpectSymbol(Symbol.LessThan))
|
||||
{
|
||||
while (!TryExpectSymbol(Symbol.GreaterThan))
|
||||
{
|
||||
templateArguments.Add(ExpectIdentifier().Value);
|
||||
_templateArguments.Add(ExpectIdentifier().Value);
|
||||
TryExpectSymbol(Symbol.Comma);
|
||||
}
|
||||
}
|
||||
@@ -217,8 +218,10 @@ public sealed class Parser
|
||||
}
|
||||
}
|
||||
|
||||
if (templateArguments.Count > 0)
|
||||
if (_templateArguments.Count > 0)
|
||||
{
|
||||
var templateArguments = _templateArguments.ToList();
|
||||
_templateArguments.Clear();
|
||||
return new StructTemplateSyntax(GetTokens(startIndex), templateArguments, name.Value, exported, fields, funcs);
|
||||
}
|
||||
|
||||
@@ -670,6 +673,11 @@ public sealed class Parser
|
||||
var startIndex = _tokenIndex;
|
||||
if (TryExpectIdentifier(out var name))
|
||||
{
|
||||
if (_templateArguments.Contains(name.Value))
|
||||
{
|
||||
return new SubstitutionTypeSyntax(GetTokens(startIndex), name.Value);
|
||||
}
|
||||
|
||||
if (name.Value[0] == 'u' && int.TryParse(name.Value[1..], out var size))
|
||||
{
|
||||
if (size is not 8 and not 16 and not 32 and not 64)
|
||||
@@ -745,7 +753,7 @@ public sealed class Parser
|
||||
|
||||
if (templateParameters.Count > 0)
|
||||
{
|
||||
return new TemplateTypeSyntax(GetTokens(startIndex), templateParameters, module, name.Value);
|
||||
return new StructTemplateTypeSyntax(GetTokens(startIndex), templateParameters, module, name.Value);
|
||||
}
|
||||
|
||||
return new CustomTypeSyntax(GetTokens(startIndex), module, name.Value);
|
||||
|
||||
Reference in New Issue
Block a user