File tree Expand file tree Collapse file tree 8 files changed +120
-0
lines changed
patterns/interpreter/conceptual Expand file tree Collapse file tree 8 files changed +120
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 1+ import 'context.dart' ;
2+
3+ abstract class Expression {
4+ bool evaluate (Context context);
5+
6+ String toDebugString (Context context);
7+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments