Skip to content

Commit b9ec1d5

Browse files
committed
Add test case
1 parent f5b1d79 commit b9ec1d5

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

tests/patmat/i8922.scala

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
case class Token(tokenType: TokenType, lexeme: String, line: Int)
2+
3+
enum TokenType:
4+
// Single-character tokens.
5+
case MINUS, PLUS, SLASH, STAR,
6+
7+
// One or two character tokens.
8+
BANG, BANG_EQUAL,
9+
EQUAL, EQUAL_EQUAL,
10+
GREATER, GREATER_EQUAL,
11+
LESS, LESS_EQUAL
12+
13+
enum Expr {
14+
case Binary(left: Expr, operator: Token, right: Expr)
15+
}
16+
17+
object Interpreter:
18+
import Expr._
19+
import TokenType._
20+
21+
def eval(expr: Expr): String | Int | Double | Boolean | Unit =
22+
expr match
23+
case Binary(left, op, right) =>
24+
val l = eval(left)
25+
val r = eval(right)
26+
(l, r, op.tokenType) match
27+
case (l: Double, r: Double, PLUS) => l + r
28+
case (l: Int, r: Int, PLUS) => l + r
29+
case (l: Double, r: Int, PLUS) => l + r
30+
case (l: Int, r: Double, PLUS) => l + r
31+
case (l: String, r: String, PLUS) => l + r
32+
case (l: Double, r: Double, MINUS) => l - r
33+
case (l: Int, r: Int, MINUS) => l - r
34+
case (l: Double, r: Int, MINUS) => l - r
35+
case (l: Int, r: Double, MINUS) => l - r
36+
case (l: Double, r: Double, STAR) => l * r
37+
case (l: Int, r: Int, STAR) => l * r
38+
case (l: Double, r: Int, STAR) => l * r
39+
case (l: Int, r: Double, STAR) => l * r
40+
case (l: Double, r: Double, SLASH) => l / r
41+
case (l: Int, r: Int, SLASH) => l / r
42+
case (l: Double, r: Int, SLASH) => l / r
43+
case (l: Int, r: Double, SLASH) => l / r
44+
case (l: Double, r: Double, GREATER) => l > r
45+
case (l: Int, r: Int, GREATER) => l > r
46+
case (l: Double, r: Int, GREATER) => l > r
47+
case (l: Int, r: Double, GREATER) => l > r
48+
case (l: String, r: String, GREATER) => l > r
49+
case (l: Double, r: Double, LESS) => l < r
50+
case (l: Int, r: Int, LESS) => l < r
51+
case (l: Double, r: Int, LESS) => l < r
52+
case (l: Int, r: Double, LESS) => l < r
53+
case (l: String, r: String, LESS) => l < r
54+
case (l: Double, r: Double, LESS_EQUAL) => l <= r
55+
case (l: Int, r: Int, LESS_EQUAL) => l <= r
56+
case (l: Double, r: Int, LESS_EQUAL) => l <= r
57+
case (l: Int, r: Double, LESS_EQUAL) => l <= r
58+
case (l: String, r: String, LESS_EQUAL) => l <= r
59+
case (l: Double, r: Double, GREATER_EQUAL) => l >= r
60+
case (l: Int, r: Int, GREATER_EQUAL) => l >= r
61+
case (l: Double, r: Int, GREATER_EQUAL) => l >= r
62+
case (l: Int, r: Double, GREATER_EQUAL) => l >= r
63+
case (l: String, r: String, GREATER_EQUAL) => l >= r
64+
case _ => println("unsupported operation")

tests/patmat/i8922b.scala

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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

Comments
 (0)