-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStmt.cs
64 lines (53 loc) · 1.86 KB
/
Stmt.cs
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
namespace SharpLox;
public interface Stmt
{
public interface Visitor<T>
{
T VisitBlockStmt(Block stmt);
T VisitClassStmt(Class stmt);
T VisitExpressionStmt(Expression stmt);
T VisitFunctionStmt(Function stmt);
T VisitIfStmt(If stmt);
T VisitPrintStmt(Print stmt);
T VisitReturnStmt(Return stmt);
T VisitVarStmt(Var stmt);
T VisitWhileStmt(While stmt);
}
T Accept<T>(Visitor<T> visitor);
public record Block(List<Stmt> Statements) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitBlockStmt(this);
}
public record Class(Token Name, Expr.Variable? Superclass, List<Function> Methods) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitClassStmt(this);
}
public record Expression(Expr Expr) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitExpressionStmt(this);
}
public record Function(Token Name, List<Token> Parameters, List<Stmt> Body) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitFunctionStmt(this);
}
public record If(Expr Condition, Stmt ThenBranch, Stmt? ElseBranch) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitIfStmt(this);
}
public record Print(Expr Expr) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitPrintStmt(this);
}
public record Return(Token Keyword, Expr? Value) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitReturnStmt(this);
}
public record Var(Token Name, Expr? Initializer) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitVarStmt(this);
}
public record While(Expr Condition, Stmt Body) : Stmt
{
public T Accept<T>(Visitor<T> visitor) => visitor.VisitWhileStmt(this);
}
}