Skip to content

Commit d148471

Browse files
committed
Impl conceptual interpreter pattern.
1 parent e4d92e4 commit d148471

File tree

8 files changed

+120
-0
lines changed

8 files changed

+120
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'operations/and.dart';
2+
import 'operations/or.dart';
3+
import 'operations/xor.dart';
4+
import 'pattern/context.dart';
5+
import 'variable/variable.dart';
6+
7+
void main() {
8+
final context = Context();
9+
final variable1 = BoolVariable('var1');
10+
final variable2 = BoolVariable('var2');
11+
final variable3 = BoolVariable('var3');
12+
final variable4 = BoolVariable('var4');
13+
14+
context.assign(variable1, true);
15+
context.assign(variable2, false);
16+
context.assign(variable3, true);
17+
context.assign(variable4, false);
18+
19+
final expression = And(
20+
variable1, // false
21+
Xor(
22+
variable2, // false
23+
Or(
24+
variable3, // true
25+
variable4, // false
26+
),
27+
),
28+
);
29+
30+
print(expression.evaluate(context));
31+
print(expression.toDebugString(context));
32+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'operation.dart';
2+
3+
class And extends Operation {
4+
And(super.expression1, super.expression2);
5+
6+
@override
7+
bool operation(bool a, bool b) => a && b;
8+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import '../pattern/context.dart';
2+
import '../pattern/expression.dart';
3+
4+
abstract class Operation implements Expression {
5+
final Expression expression1;
6+
final Expression expression2;
7+
8+
Operation(this.expression1, this.expression2);
9+
10+
bool operation(bool a, bool b);
11+
12+
@override
13+
bool evaluate(Context context) {
14+
final a = expression1.evaluate(context);
15+
final b = expression2.evaluate(context);
16+
return operation(a, b);
17+
}
18+
19+
@override
20+
String toDebugString(Context context) {
21+
final a = expression1.toDebugString(context);
22+
final b = expression2.toDebugString(context);
23+
return '$b $runtimeType $a';
24+
}
25+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'operation.dart';
2+
3+
class Or extends Operation {
4+
Or(super.expression1, super.expression2);
5+
6+
@override
7+
bool operation(bool a, bool b) => a || b;
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'operation.dart';
2+
3+
class Xor extends Operation {
4+
Xor(super.expression1, super.expression2);
5+
6+
@override
7+
bool operation(bool a, bool b) => a ^ b;
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import '../variable/variable.dart';
2+
3+
class Context {
4+
void assign(BoolVariable variable, bool value) {
5+
_values.putIfAbsent(variable.name, () => value);
6+
}
7+
8+
bool lookup(String name) {
9+
return _values[name]!;
10+
}
11+
12+
final _values = <String, bool>{};
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import 'context.dart';
2+
3+
abstract class Expression {
4+
bool evaluate(Context context);
5+
6+
String toDebugString(Context context);
7+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import '../pattern/context.dart';
2+
import '../pattern/expression.dart';
3+
4+
class BoolVariable implements Expression {
5+
BoolVariable(this.name);
6+
7+
final String name;
8+
9+
@override
10+
bool evaluate(Context context) {
11+
return context.lookup(name);
12+
}
13+
14+
@override
15+
String toDebugString(Context context) {
16+
final value = context.lookup(name);
17+
return '$name($value)';
18+
}
19+
}

0 commit comments

Comments
 (0)