using NubLang.Syntax; namespace NubLang.Ast; public abstract record Node(List Tokens); #region Definitions public abstract record DefinitionNode(List Tokens, string Module, string Name) : Node(Tokens); public record FuncParameterNode(List Tokens, string Name, NubType Type) : Node(Tokens); public record FuncPrototypeNode(List Tokens, string Module, string Name, string? ExternSymbol, List Parameters, NubType ReturnType) : Node(Tokens); public record FuncNode(List Tokens, FuncPrototypeNode Prototype, BlockNode? Body) : DefinitionNode(Tokens, Prototype.Module, Prototype.Name); #endregion #region Statements public abstract record StatementNode(List Tokens) : Node(Tokens); public abstract record TerminalStatementNode(List Tokens) : StatementNode(Tokens); public record BlockNode(List Tokens, List Statements) : StatementNode(Tokens); public record StatementFuncCallNode(List Tokens, FuncCallNode FuncCall) : StatementNode(Tokens); public record ReturnNode(List Tokens, ExpressionNode? Value) : TerminalStatementNode(Tokens); public record AssignmentNode(List Tokens, LValueExpressionNode Target, ExpressionNode Value) : StatementNode(Tokens); public record IfNode(List Tokens, ExpressionNode Condition, BlockNode Body, Variant? Else) : StatementNode(Tokens); public record VariableDeclarationNode(List Tokens, string Name, ExpressionNode? Assignment, NubType Type) : StatementNode(Tokens); public record ContinueNode(List Tokens) : TerminalStatementNode(Tokens); public record BreakNode(List Tokens) : TerminalStatementNode(Tokens); public record WhileNode(List Tokens, ExpressionNode Condition, BlockNode Body) : StatementNode(Tokens); public record DeferNode(List Tokens, StatementNode Statement) : StatementNode(Tokens); #endregion #region Expressions public enum UnaryOperator { Negate, Invert } public enum BinaryOperator { Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, LogicalAnd, LogicalOr, Plus, Minus, Multiply, Divide, Modulo, LeftShift, RightShift, BitwiseAnd, BitwiseXor, BitwiseOr } public abstract record ExpressionNode(List Tokens, NubType Type) : Node(Tokens); public abstract record LValueExpressionNode(List Tokens, NubType Type) : ExpressionNode(Tokens, Type); public abstract record RValueExpressionNode(List Tokens, NubType Type) : ExpressionNode(Tokens, Type); public record StringLiteralNode(List Tokens, NubType Type, string Value) : RValueExpressionNode(Tokens, Type); public record CStringLiteralNode(List Tokens, NubType Type, string Value) : RValueExpressionNode(Tokens, Type); public record IntLiteralNode(List Tokens, NubType Type, long Value) : RValueExpressionNode(Tokens, Type); public record UIntLiteralNode(List Tokens, NubType Type, ulong Value) : RValueExpressionNode(Tokens, Type); public record Float32LiteralNode(List Tokens, NubType Type, float Value) : RValueExpressionNode(Tokens, Type); public record Float64LiteralNode(List Tokens, NubType Type, double Value) : RValueExpressionNode(Tokens, Type); public record BoolLiteralNode(List Tokens, NubType Type, bool Value) : RValueExpressionNode(Tokens, Type); public record BinaryExpressionNode(List Tokens, NubType Type, ExpressionNode Left, BinaryOperator Operator, ExpressionNode Right) : RValueExpressionNode(Tokens, Type); public record UnaryExpressionNode(List Tokens, NubType Type, UnaryOperator Operator, ExpressionNode Operand) : RValueExpressionNode(Tokens, Type); public record FuncCallNode(List Tokens, NubType Type, ExpressionNode Expression, List Parameters) : RValueExpressionNode(Tokens, Type); public record VariableIdentifierNode(List Tokens, NubType Type, string Name) : LValueExpressionNode(Tokens, Type); public record FuncIdentifierNode(List Tokens, NubType Type, string Module, string Name, string? ExternSymbol) : RValueExpressionNode(Tokens, Type); public record ArrayInitializerNode(List Tokens, NubType Type, ExpressionNode Capacity, NubType ElementType) : RValueExpressionNode(Tokens, Type); public record ArrayIndexAccessNode(List Tokens, NubType Type, ExpressionNode Target, ExpressionNode Index) : LValueExpressionNode(Tokens, Type); public record SliceIndexAccessNode(List Tokens, NubType Type, ExpressionNode Target, ExpressionNode Index) : LValueExpressionNode(Tokens, Type); public record AddressOfNode(List Tokens, NubType Type, LValueExpressionNode LValue) : RValueExpressionNode(Tokens, Type); public record StructFieldAccessNode(List Tokens, NubType Type, ExpressionNode Target, string Field) : LValueExpressionNode(Tokens, Type); public record StructInitializerNode(List Tokens, NubStructType StructType, Dictionary Initializers) : RValueExpressionNode(Tokens, StructType); public record DereferenceNode(List Tokens, NubType Type, ExpressionNode Target) : LValueExpressionNode(Tokens, Type); public record ConvertIntNode(List Tokens, NubType Type, ExpressionNode Value, NubIntType ValueType, NubIntType TargetType) : RValueExpressionNode(Tokens, Type); public record ConvertFloatNode(List Tokens, NubType Type, ExpressionNode Value, NubFloatType ValueType, NubFloatType TargetType) : RValueExpressionNode(Tokens, Type); public record ConvertStringToCStringNode(List Tokens, ExpressionNode Value) : RValueExpressionNode(Tokens, new NubCStringType()); public record ConvertCStringToStringNode(List Tokens, ExpressionNode Value) : RValueExpressionNode(Tokens, new NubStringType()); public record SizeBuiltinNode(List Tokens, NubType Type, NubType TargetType) : RValueExpressionNode(Tokens, Type); public record FloatToIntBuiltinNode(List Tokens, NubType Type, ExpressionNode Value, NubFloatType ValueType, NubIntType TargetType) : RValueExpressionNode(Tokens, Type); #endregion