1
+ case class Token (tokenType : TokenType , lexeme : StringV , line : IntV )
2
+
3
+ sealed trait TokenType
4
+ // Single-character tokens.
5
+ object MINUS extends TokenType
6
+ object PLUS extends TokenType
7
+ object SLASH extends TokenType
8
+ object STAR extends TokenType
9
+ object BANG extends TokenType
10
+ object BANG_EQUAL extends TokenType
11
+ object EQUAL extends TokenType
12
+ object EQUAL_EQUAL extends TokenType
13
+ object GREATER extends TokenType
14
+ object GREATER_EQUAL extends TokenType
15
+ object LESS extends TokenType
16
+ object LESS_EQUAL extends TokenType
17
+
18
+ sealed trait Expr
19
+ case class Binary (left : Expr , operator : Token , right : Expr ) extends Expr
20
+
21
+ sealed trait Value
22
+ case class StringV (v : String ) extends Value
23
+ case class IntV (v : Int ) extends Value
24
+ case class DoubleV (v : Double ) extends Value
25
+ case class BooleanV (v : Boolean ) extends Value
26
+ case class UnitV () extends Value
27
+
28
+ object Interpreter {
29
+ def eval (expr : Expr ): Value =
30
+ expr match {
31
+ case Binary (left, op, right) =>
32
+ val l = eval(left)
33
+ val r = eval(right)
34
+ (l, r, op.tokenType) match {
35
+ case (l : DoubleV , r : DoubleV , PLUS ) => ???
36
+ case (l : IntV , r : IntV , PLUS ) => ???
37
+ case (l : DoubleV , r : IntV , PLUS ) => ???
38
+ case (l : IntV , r : DoubleV , PLUS ) => ???
39
+ case (l : StringV , r : StringV , PLUS ) => ???
40
+ case (l : DoubleV , r : DoubleV , MINUS ) => ???
41
+ case (l : IntV , r : IntV , MINUS ) => ???
42
+ case (l : DoubleV , r : IntV , MINUS ) => ???
43
+ case (l : IntV , r : DoubleV , MINUS ) => ???
44
+ case (l : DoubleV , r : DoubleV , STAR ) => ???
45
+ case (l : IntV , r : IntV , STAR ) => ???
46
+ case (l : DoubleV , r : IntV , STAR ) => ???
47
+ case (l : IntV , r : DoubleV , STAR ) => ???
48
+ case (l : DoubleV , r : DoubleV , SLASH ) => ???
49
+ case (l : IntV , r : IntV , SLASH ) => ???
50
+ case (l : DoubleV , r : IntV , SLASH ) => ???
51
+ case (l : IntV , r : DoubleV , SLASH ) => ???
52
+ case (l : DoubleV , r : DoubleV , GREATER ) => ???
53
+ case (l : IntV , r : IntV , GREATER ) => ???
54
+ case (l : DoubleV , r : IntV , GREATER ) => ???
55
+ case (l : IntV , r : DoubleV , GREATER ) => ???
56
+ case (l : StringV , r : StringV , GREATER ) => ???
57
+ case (l : DoubleV , r : DoubleV , LESS ) => ???
58
+ case (l : IntV , r : IntV , LESS ) => ???
59
+ case (l : DoubleV , r : IntV , LESS ) => ???
60
+ case (l : IntV , r : DoubleV , LESS ) => ???
61
+ case (l : StringV , r : StringV , LESS ) => ???
62
+ case (l : DoubleV , r : DoubleV , LESS_EQUAL ) => ???
63
+ case (l : IntV , r : IntV , LESS_EQUAL ) => ???
64
+ case (l : DoubleV , r : IntV , LESS_EQUAL ) => ???
65
+ case (l : IntV , r : DoubleV , LESS_EQUAL ) => ???
66
+ case (l : StringV , r : StringV , LESS_EQUAL ) => ???
67
+ case (l : DoubleV , r : DoubleV , GREATER_EQUAL ) => ???
68
+ case (l : IntV , r : IntV , GREATER_EQUAL ) => ???
69
+ case (l : DoubleV , r : IntV , GREATER_EQUAL ) => ???
70
+ case (l : IntV , r : DoubleV , GREATER_EQUAL ) => ???
71
+ case (l : StringV , r : StringV , GREATER_EQUAL ) => ???
72
+ // case _ => ???
73
+ }
74
+ }
75
+
76
+ }
0 commit comments