using NubLang.Common; using NubLang.Syntax.Tokenization; namespace NubLang.Syntax.Parsing.Node; public enum UnaryOperator { Negate, Invert } public enum BinaryOperator { Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Plus, Minus, Multiply, Divide } public abstract record ExpressionSyntax(IReadOnlyList Tokens) : SyntaxNode(Tokens); public record BinaryExpressionSyntax(IReadOnlyList Tokens, ExpressionSyntax Left, BinaryOperator Operator, ExpressionSyntax Right) : ExpressionSyntax(Tokens); public record UnaryExpressionSyntax(IReadOnlyList Tokens, UnaryOperator Operator, ExpressionSyntax Operand) : ExpressionSyntax(Tokens); public record FuncCallSyntax(IReadOnlyList Tokens, ExpressionSyntax Expression, IReadOnlyList Parameters) : ExpressionSyntax(Tokens); public record IdentifierSyntax(IReadOnlyList Tokens, Optional Namespace, string Name) : ExpressionSyntax(Tokens); public record ArrayInitializerSyntax(IReadOnlyList Tokens, ExpressionSyntax Capacity, NubType ElementType) : ExpressionSyntax(Tokens); public record ArrayIndexAccessSyntax(IReadOnlyList Tokens, ExpressionSyntax Target, ExpressionSyntax Index) : ExpressionSyntax(Tokens); public record ArrowFuncParameterSyntax(IReadOnlyList Tokens, string Name) : ExpressionSyntax(Tokens); public record ArrowFuncSyntax(IReadOnlyList Tokens, IReadOnlyList Parameters, BlockSyntax Body) : ExpressionSyntax(Tokens); public record AddressOfSyntax(IReadOnlyList Tokens, ExpressionSyntax Expression) : ExpressionSyntax(Tokens); public record LiteralSyntax(IReadOnlyList Tokens, string Literal, LiteralKind Kind) : ExpressionSyntax(Tokens); public record MemberAccessSyntax(IReadOnlyList Tokens, ExpressionSyntax Target, string Member) : ExpressionSyntax(Tokens); public record StructInitializerSyntax(IReadOnlyList Tokens, NubType StructType, Dictionary Initializers) : ExpressionSyntax(Tokens); public record DereferenceSyntax(IReadOnlyList Tokens, ExpressionSyntax Expression) : ExpressionSyntax(Tokens);