namespace NubLang.Syntax; public abstract record SyntaxNode(List Tokens); #region Definitions public record TopLevelSyntaxNode(List Tokens) : SyntaxNode(Tokens); public record ModuleSyntax(List Tokens, IdentifierToken NameToken) : TopLevelSyntaxNode(Tokens); public abstract record DefinitionSyntax(List Tokens, IdentifierToken NameToken, bool Exported) : TopLevelSyntaxNode(Tokens); public record FuncParameterSyntax(List Tokens, IdentifierToken NameToken, TypeSyntax Type) : SyntaxNode(Tokens); public record FuncPrototypeSyntax(List Tokens, IdentifierToken NameToken, bool Exported, StringLiteralToken? ExternSymbolToken, List Parameters, TypeSyntax ReturnType) : SyntaxNode(Tokens); public record FuncSyntax(List Tokens, FuncPrototypeSyntax Prototype, BlockSyntax? Body) : DefinitionSyntax(Tokens, Prototype.NameToken, Prototype.Exported); public record StructFieldSyntax(List Tokens, IdentifierToken NameToken, TypeSyntax Type, ExpressionSyntax? Value) : SyntaxNode(Tokens); public record StructSyntax(List Tokens, IdentifierToken NameToken, bool Exported, bool Packed, List Fields) : DefinitionSyntax(Tokens, NameToken, Exported); public record EnumFieldSyntax(List Tokens, IdentifierToken NameToken, IntLiteralToken? ValueToken) : SyntaxNode(Tokens); public record EnumSyntax(List Tokens, IdentifierToken NameToken, bool Exported, TypeSyntax? Type, List Fields) : DefinitionSyntax(Tokens, NameToken, Exported); public enum UnaryOperatorSyntax { Negate, Invert } public enum BinaryOperatorSyntax { Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, LogicalAnd, LogicalOr, Plus, Minus, Multiply, Divide, Modulo, LeftShift, RightShift, BitwiseAnd, BitwiseXor, BitwiseOr, } #endregion #region Statements public abstract record StatementSyntax(List Tokens) : SyntaxNode(Tokens); public record BlockSyntax(List Tokens, List Statements) : StatementSyntax(Tokens); public record StatementExpressionSyntax(List Tokens, ExpressionSyntax Expression) : StatementSyntax(Tokens); public record ReturnSyntax(List Tokens, ExpressionSyntax? Value) : StatementSyntax(Tokens); public record AssignmentSyntax(List Tokens, ExpressionSyntax Target, ExpressionSyntax Value) : StatementSyntax(Tokens); public record IfSyntax(List Tokens, ExpressionSyntax Condition, BlockSyntax Body, Variant? Else) : StatementSyntax(Tokens); public record VariableDeclarationSyntax(List Tokens, IdentifierToken NameToken, TypeSyntax? ExplicitType, ExpressionSyntax? Assignment) : StatementSyntax(Tokens); public record ContinueSyntax(List Tokens) : StatementSyntax(Tokens); public record BreakSyntax(List Tokens) : StatementSyntax(Tokens); public record DeferSyntax(List Tokens, StatementSyntax Statement) : StatementSyntax(Tokens); public record WhileSyntax(List Tokens, ExpressionSyntax Condition, BlockSyntax Body) : StatementSyntax(Tokens); public record ForSyntax(List Tokens, IdentifierToken ElementNameToken, IdentifierToken? IndexNameToken, ExpressionSyntax Target, BlockSyntax Body) : StatementSyntax(Tokens); #endregion #region Expressions public abstract record ExpressionSyntax(List Tokens) : SyntaxNode(Tokens); public record BinaryExpressionSyntax(List Tokens, ExpressionSyntax Left, BinaryOperatorSyntax Operator, ExpressionSyntax Right) : ExpressionSyntax(Tokens); public record UnaryExpressionSyntax(List Tokens, UnaryOperatorSyntax Operator, ExpressionSyntax Operand) : ExpressionSyntax(Tokens); public record FuncCallSyntax(List Tokens, ExpressionSyntax Expression, List Parameters) : ExpressionSyntax(Tokens); public record LocalIdentifierSyntax(List Tokens, IdentifierToken NameToken) : ExpressionSyntax(Tokens); public record ModuleIdentifierSyntax(List Tokens, IdentifierToken ModuleToken, IdentifierToken NameToken) : ExpressionSyntax(Tokens); public record ArrayInitializerSyntax(List Tokens, List Values) : ExpressionSyntax(Tokens); public record ArrayIndexAccessSyntax(List Tokens, ExpressionSyntax Target, ExpressionSyntax Index) : ExpressionSyntax(Tokens); public record AddressOfSyntax(List Tokens, ExpressionSyntax Target) : ExpressionSyntax(Tokens); public record IntLiteralSyntax(List Tokens, IntLiteralToken Token) : ExpressionSyntax(Tokens); public record StringLiteralSyntax(List Tokens, StringLiteralToken Token) : ExpressionSyntax(Tokens); public record BoolLiteralSyntax(List Tokens, BoolLiteralToken Token) : ExpressionSyntax(Tokens); public record FloatLiteralSyntax(List Tokens, FloatLiteralToken Token) : ExpressionSyntax(Tokens); public record MemberAccessSyntax(List Tokens, ExpressionSyntax Target, IdentifierToken MemberToken) : ExpressionSyntax(Tokens); public record StructInitializerSyntax(List Tokens, TypeSyntax? StructType, Dictionary Initializers) : ExpressionSyntax(Tokens); public record DereferenceSyntax(List Tokens, ExpressionSyntax Target) : ExpressionSyntax(Tokens); public record SizeSyntax(List Tokens, TypeSyntax Type) : ExpressionSyntax(Tokens); public record CastSyntax(List Tokens, ExpressionSyntax Value) : ExpressionSyntax(Tokens); #endregion #region Types public abstract record TypeSyntax(List Tokens) : SyntaxNode(Tokens); public record FuncTypeSyntax(List Tokens, List Parameters, TypeSyntax ReturnType) : TypeSyntax(Tokens); public record PointerTypeSyntax(List Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens); public record VoidTypeSyntax(List Tokens) : TypeSyntax(Tokens); public record IntTypeSyntax(List Tokens, bool Signed, ulong Width) : TypeSyntax(Tokens); public record FloatTypeSyntax(List Tokens, ulong Width) : TypeSyntax(Tokens); public record BoolTypeSyntax(List Tokens) : TypeSyntax(Tokens); public record StringTypeSyntax(List Tokens) : TypeSyntax(Tokens); public record SliceTypeSyntax(List Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens); public record ArrayTypeSyntax(List Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens); public record ConstArrayTypeSyntax(List Tokens, TypeSyntax BaseType, ulong Size) : TypeSyntax(Tokens); public record CustomTypeSyntax(List Tokens, IdentifierToken? ModuleToken, IdentifierToken NameToken) : TypeSyntax(Tokens); #endregion