aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/java/coffee/liz/lambda/ast/Expression.java
blob: 6d75a08fa9f5d2cad8754a0f82f41d838ad44228 (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 {
	}
}