aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/java/coffee/liz/lambda/ast/Expression.java
blob: c2bdd39a2b55e25916af67cd882d0230d055ee16 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package coffee.liz.lambda.ast;

import lombok.NonNull;

import java.util.Optional;

/**
 * Represents an expression in the untyped lambda calculus.
 */
public sealed interface Expression
        permits Expression.AbstractionExpression, Expression.IdentifierExpression, Expression.ApplicationExpression {

    Optional<SourceComment> comment();

    SourceSpan span();

    record AbstractionExpression(@NonNull Optional<SourceComment> comment, @NonNull SourceSpan span,
            @NonNull String parameter, @NonNull Expression body) implements Expression {
    }

    record ApplicationExpression(@NonNull Optional<SourceComment> comment, @NonNull SourceSpan span,
            @NonNull Expression applicable, @NonNull Expression argument) implements Expression {
    }

    record IdentifierExpression(@NonNull Optional<SourceComment> comment, @NonNull SourceSpan span,
            @NonNull String name) implements Expression {
    }
}