defer and struct hooks

This commit is contained in:
nub31
2025-09-19 23:08:12 +02:00
parent 609e1b5d85
commit ca838e32b8
15 changed files with 240 additions and 97 deletions

View File

@@ -175,13 +175,19 @@ public sealed class Parser
{
var memberStartIndex = _tokenIndex;
string? hook = null;
if (TryExpectSymbol(Symbol.At))
{
hook = ExpectIdentifier().Value;
}
if (TryExpectSymbol(Symbol.Func))
{
var funcName = ExpectIdentifier().Value;
var funcSignature = ParseFuncSignature();
var funcBody = ParseBlock();
funcs.Add(new StructFuncSyntax(GetTokens(memberStartIndex), funcName, funcSignature, funcBody));
funcs.Add(new StructFuncSyntax(GetTokens(memberStartIndex), funcName, hook, funcSignature, funcBody));
}
else
{
@@ -209,6 +215,8 @@ public sealed class Parser
{
switch (symbol.Symbol)
{
case Symbol.OpenBrace:
return ParseBlock();
case Symbol.Return:
return ParseReturn();
case Symbol.If:
@@ -219,6 +227,8 @@ public sealed class Parser
return ParseFor();
case Symbol.Let:
return ParseVariableDeclaration();
case Symbol.Defer:
return ParseDefer();
case Symbol.Break:
return ParseBreak();
case Symbol.Continue:
@@ -264,14 +274,22 @@ public sealed class Parser
return new VariableDeclarationSyntax(GetTokens(startIndex), name, explicitType, assignment);
}
private StatementSyntax ParseBreak()
private DeferSyntax ParseDefer()
{
var startIndex = _tokenIndex;
ExpectSymbol(Symbol.Defer);
var statement = ParseStatement();
return new DeferSyntax(GetTokens(startIndex), statement);
}
private BreakSyntax ParseBreak()
{
var startIndex = _tokenIndex;
ExpectSymbol(Symbol.Break);
return new BreakSyntax(GetTokens(startIndex));
}
private StatementSyntax ParseContinue()
private ContinueSyntax ParseContinue()
{
var startIndex = _tokenIndex;
ExpectSymbol(Symbol.Continue);
@@ -303,9 +321,14 @@ public sealed class Parser
var elseStatement = Optional<Variant<IfSyntax, BlockSyntax>>.Empty();
if (TryExpectSymbol(Symbol.Else))
{
elseStatement = TryExpectSymbol(Symbol.If)
? (Variant<IfSyntax, BlockSyntax>)ParseIf()
: (Variant<IfSyntax, BlockSyntax>)ParseBlock();
if (CurrentToken is SymbolToken { Symbol: Symbol.If })
{
elseStatement = (Variant<IfSyntax, BlockSyntax>)ParseIf();
}
else
{
elseStatement = (Variant<IfSyntax, BlockSyntax>)ParseBlock();
}
}
return new IfSyntax(GetTokens(startIndex), condition, body, elseStatement);