defer and struct hooks
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user