This commit is contained in:
nub31
2025-06-12 23:52:52 +02:00
parent f932fc0ca4
commit 68d86d54ee
61 changed files with 214 additions and 155 deletions

View File

@@ -0,0 +1,8 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class AddressOfNode(IReadOnlyList<Token> tokens, LValueNode expression) : ExpressionNode(tokens)
{
public LValueNode Expression { get; } = expression;
}

View File

@@ -0,0 +1,13 @@
using Nub.Lang.Syntax.Parsing.Definitions;
using Nub.Lang.Syntax.Parsing.Statements;
using Nub.Lang.Syntax.Tokenization;
using Nub.Lang.Syntax.Typing;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class AnonymousFuncNode(IReadOnlyList<Token> tokens, List<FuncParameter> parameters, BlockNode body, NubType returnType) : ExpressionNode(tokens)
{
public List<FuncParameter> Parameters { get; } = parameters;
public BlockNode Body { get; } = body;
public NubType ReturnType { get; } = returnType;
}

View File

@@ -0,0 +1,9 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class ArrayIndexAccessNode(IReadOnlyList<Token> tokens, ExpressionNode array, ExpressionNode index) : LValueNode(tokens)
{
public ExpressionNode Array { get; } = array;
public ExpressionNode Index { get; } = index;
}

View File

@@ -0,0 +1,10 @@
using Nub.Lang.Syntax.Tokenization;
using Nub.Lang.Syntax.Typing;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class ArrayInitializerNode(IReadOnlyList<Token> tokens, ExpressionNode capacity, NubType elementType) : ExpressionNode(tokens)
{
public ExpressionNode Capacity { get; } = capacity;
public NubType ElementType { get; } = elementType;
}

View File

@@ -0,0 +1,24 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class BinaryExpressionNode(IReadOnlyList<Token> tokens, ExpressionNode left, BinaryExpressionOperator @operator, ExpressionNode right) : ExpressionNode(tokens)
{
public ExpressionNode Left { get; } = left;
public BinaryExpressionOperator Operator { get; } = @operator;
public ExpressionNode Right { get; } = right;
}
public enum BinaryExpressionOperator
{
Equal,
NotEqual,
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual,
Plus,
Minus,
Multiply,
Divide
}

View File

@@ -0,0 +1,8 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class DereferenceNode(IReadOnlyList<Token> tokens, ExpressionNode expression) : LValueNode(tokens)
{
public ExpressionNode Expression { get; } = expression;
}

View File

@@ -0,0 +1,16 @@
using Nub.Lang.Syntax.Tokenization;
using Nub.Lang.Syntax.Typing;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public abstract class ExpressionNode(IReadOnlyList<Token> tokens) : Node(tokens)
{
private NubType? _type;
public NubType Type
{
get => _type ?? throw new Exception("Tried to access expression type before type was populated");
set => _type = value;
}
}
public abstract class LValueNode(IReadOnlyList<Token> tokens) : ExpressionNode(tokens);

View File

@@ -0,0 +1,10 @@
using Nub.Lang.Syntax.Tokenization;
using Nub.Lang.Syntax.Typing;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class FixedArrayInitializerNode(IReadOnlyList<Token> tokens, NubType elementType, int capacity) : ExpressionNode(tokens)
{
public NubType ElementType { get; } = elementType;
public int Capacity { get; } = capacity;
}

View File

@@ -0,0 +1,11 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class FuncCallNode(IReadOnlyList<Token> tokens, ExpressionNode expression, List<ExpressionNode> parameters) : ExpressionNode(tokens)
{
public ExpressionNode Expression = expression;
public List<ExpressionNode> Parameters { get; } = parameters;
public override string ToString() => $"{Expression}({string.Join(", ", Parameters)})";
}

View File

@@ -0,0 +1,12 @@
using Nub.Lang.Common;
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class IdentifierNode(IReadOnlyList<Token> tokens, Optional<string> @namespace, string name) : LValueNode(tokens)
{
public Optional<string> Namespace { get; } = @namespace;
public string Name { get; } = name;
public override string ToString() => Namespace.HasValue ? $"{Namespace.Value}::{Name}" : Name;
}

View File

@@ -0,0 +1,9 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class LiteralNode(IReadOnlyList<Token> tokens, string literal, LiteralKind kind) : ExpressionNode(tokens)
{
public string Literal { get; } = literal;
public LiteralKind Kind { get; } = kind;
}

View File

@@ -0,0 +1,9 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class MemberAccessNode(IReadOnlyList<Token> tokens, ExpressionNode expression, string member) : LValueNode(tokens)
{
public ExpressionNode Expression { get; } = expression;
public string Member { get; } = member;
}

View File

@@ -0,0 +1,10 @@
using Nub.Lang.Syntax.Tokenization;
using Nub.Lang.Syntax.Typing;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class StructInitializerNode(IReadOnlyList<Token> tokens, NubStructType structType, Dictionary<string, ExpressionNode> initializers) : ExpressionNode(tokens)
{
public NubStructType StructType { get; } = structType;
public Dictionary<string, ExpressionNode> Initializers { get; } = initializers;
}

View File

@@ -0,0 +1,15 @@
using Nub.Lang.Syntax.Tokenization;
namespace Nub.Lang.Syntax.Parsing.Expressions;
public class UnaryExpressionNode(IReadOnlyList<Token> tokens, UnaryExpressionOperator @operator, ExpressionNode operand) : ExpressionNode(tokens)
{
public UnaryExpressionOperator Operator { get; } = @operator;
public ExpressionNode Operand { get; } = operand;
}
public enum UnaryExpressionOperator
{
Negate,
Invert
}