71 lines
2.0 KiB
Dart
71 lines
2.0 KiB
Dart
/**
|
||
解释器模式(Interpreter Pattern)
|
||
|
||
意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
|
||
主要解决:对于一些固定文法构建一个解释句子的解释器。
|
||
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
|
||
如何解决:构建语法树,定义终结符与非终结符。
|
||
*/
|
||
main(List<String> args) {
|
||
Expression robert = TerminalExpression("Robert");
|
||
Expression john = TerminalExpression("John");
|
||
Expression isMale = OrExpression(robert, john);
|
||
print("John is male? ${isMale.interpret('john')}");
|
||
|
||
Expression julie = TerminalExpression("Julie");
|
||
Expression married = TerminalExpression("Married");
|
||
Expression isMarriedWoman = AndExpression(julie, married);
|
||
print(
|
||
"Julie is a married women? ${isMarriedWoman.interpret('Married Julie')}");
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////
|
||
|
||
///
|
||
/// 创建一个表达式接口
|
||
///
|
||
abstract class Expression {
|
||
bool interpret(String context);
|
||
}
|
||
|
||
///
|
||
/// 创建实现了上述接口的实体类
|
||
///
|
||
class TerminalExpression implements Expression {
|
||
String _data;
|
||
|
||
TerminalExpression(this._data);
|
||
|
||
@override
|
||
bool interpret(String context) {
|
||
if (context.contains(_data)) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
|
||
class OrExpression implements Expression {
|
||
Expression _expr1;
|
||
Expression _expr2;
|
||
|
||
OrExpression(this._expr1, this._expr2);
|
||
|
||
@override
|
||
bool interpret(String context) {
|
||
return _expr1.interpret(context) || _expr2.interpret(context);
|
||
}
|
||
}
|
||
|
||
class AndExpression implements Expression {
|
||
Expression _expr1;
|
||
Expression _expr2;
|
||
|
||
AndExpression(this._expr1, this._expr2);
|
||
|
||
@override
|
||
bool interpret(String context) {
|
||
return _expr1.interpret(context) && _expr2.interpret(context);
|
||
}
|
||
}
|