84 lines
2.4 KiB
C#
84 lines
2.4 KiB
C#
using NubLang.Tokenization;
|
|
|
|
namespace NubLang.Parsing.Syntax;
|
|
|
|
public abstract record StatementSyntax(IEnumerable<Token> Tokens) : SyntaxNode(Tokens);
|
|
|
|
public record StatementExpressionSyntax(IEnumerable<Token> Tokens, ExpressionSyntax Expression) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren()
|
|
{
|
|
yield return Expression;
|
|
}
|
|
}
|
|
|
|
public record ReturnSyntax(IEnumerable<Token> Tokens, Optional<ExpressionSyntax> Value) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren()
|
|
{
|
|
if (Value.HasValue)
|
|
{
|
|
yield return Value.Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public record AssignmentSyntax(IEnumerable<Token> Tokens, ExpressionSyntax Target, ExpressionSyntax Value) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren()
|
|
{
|
|
yield return Target;
|
|
yield return Value;
|
|
}
|
|
}
|
|
|
|
public record IfSyntax(IEnumerable<Token> Tokens, ExpressionSyntax Condition, BlockSyntax Body, Optional<Variant<IfSyntax, BlockSyntax>> Else) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren()
|
|
{
|
|
yield return Condition;
|
|
yield return Body;
|
|
if (Else.HasValue)
|
|
{
|
|
if (Else.Value.IsCase1(out var elseIf))
|
|
{
|
|
yield return elseIf;
|
|
}
|
|
else if (Else.Value.IsCase2(out var @else))
|
|
{
|
|
yield return @else;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public record VariableDeclarationSyntax(IEnumerable<Token> Tokens, string Name, Optional<TypeSyntax> ExplicitType, Optional<ExpressionSyntax> Assignment) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren()
|
|
{
|
|
if (ExplicitType.HasValue)
|
|
{
|
|
yield return ExplicitType.Value;
|
|
}
|
|
|
|
if (Assignment.HasValue)
|
|
{
|
|
yield return Assignment.Value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public record ContinueSyntax(IEnumerable<Token> Tokens) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren() => [];
|
|
}
|
|
|
|
public record BreakSyntax(IEnumerable<Token> Tokens) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren() => [];
|
|
}
|
|
|
|
public record WhileSyntax(IEnumerable<Token> Tokens, ExpressionSyntax Condition, BlockSyntax Body) : StatementSyntax(Tokens)
|
|
{
|
|
public override IEnumerable<SyntaxNode> GetChildren() => [];
|
|
} |