namespace NubLang.Syntax; public abstract record SyntaxNode(List Tokens); #region Definitions public abstract record DefinitionSyntax(List Tokens, string Name, bool Exported) : SyntaxNode(Tokens); public record FuncParameterSyntax(List Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens); public record FuncPrototypeSyntax(List Tokens, string Name, bool Exported, string? ExternSymbol, List Parameters, TypeSyntax ReturnType) : SyntaxNode(Tokens); public record FuncSyntax(List Tokens, FuncPrototypeSyntax Prototype, BlockSyntax? Body) : DefinitionSyntax(Tokens, Prototype.Name, Prototype.Exported); public record StructFieldSyntax(List Tokens, string Name, TypeSyntax Type, ExpressionSyntax? Value) : SyntaxNode(Tokens); public record StructSyntax(List Tokens, string Name, bool Exported, List Fields) : DefinitionSyntax(Tokens, Name, 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, string Name, 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); #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, string Name) : ExpressionSyntax(Tokens); public record ModuleIdentifierSyntax(List Tokens, string Module, string Name) : ExpressionSyntax(Tokens); public record ArrayInitializerSyntax(List Tokens, ExpressionSyntax Capacity, TypeSyntax ElementType) : 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, string Value, int Base) : ExpressionSyntax(Tokens); public record StringLiteralSyntax(List Tokens, string Value) : ExpressionSyntax(Tokens); public record BoolLiteralSyntax(List Tokens, bool Value) : ExpressionSyntax(Tokens); public record FloatLiteralSyntax(List Tokens, string Value) : ExpressionSyntax(Tokens); public record MemberAccessSyntax(List Tokens, ExpressionSyntax Target, string Member) : ExpressionSyntax(Tokens); public record StructInitializerSyntax(List Tokens, TypeSyntax? StructType, Dictionary Initializers) : ExpressionSyntax(Tokens); public record DereferenceSyntax(List Tokens, ExpressionSyntax Target) : ExpressionSyntax(Tokens); public record SizeBuiltinSyntax(List Tokens, TypeSyntax Type) : ExpressionSyntax(Tokens); public record InterpretBuiltinSyntax(List Tokens, TypeSyntax Type, ExpressionSyntax Target) : ExpressionSyntax(Tokens); public record FloatToIntBuiltinSyntax(List Tokens, TypeSyntax Type, 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, int Width) : TypeSyntax(Tokens); public record FloatTypeSyntax(List Tokens, int Width) : TypeSyntax(Tokens); public record BoolTypeSyntax(List Tokens) : TypeSyntax(Tokens); public record StringTypeSyntax(List Tokens) : TypeSyntax(Tokens); public record CStringTypeSyntax(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, long Size) : TypeSyntax(Tokens); public record CustomTypeSyntax(List Tokens, string Module, string Name) : TypeSyntax(Tokens); #endregion