解释器模式
意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
解释器模式为某个语言
定义它的语法表示,并定义一个解释器用来处理这个语法。
语言:不仅仅指平时说的中、英、日、法等各种语言。从广义上来讲,只要是能承载信息的载体,我们都可以称之为“语言”,比如,古代的结绳记事、盲文、哑语、摩斯密码等。
一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。解释器模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。
![](https://img.haomeiwen.com/i3115781/e3bdbdbe5f35dd9f.jpg)
角色和职责
- Context 解释器上下文环境类
用来存储解释器的上下文环境,包含解释器之外的一些全局信息,比如需要解释的文法等 - AbstractExpression 解释器抽象类,抽象表达式
这个接口为抽象语法树中所有节点所共享 - TerminalExpression 解释器具体实现类,终结符表达式
实现与文法中的终结符相关联的解释操作
一个句子中的每个终结符需要该类的一个实例 - NonterminalExpression 解释器具体实现类,非终结符表达式
对文法中的每一个规则R :: = RR
...R
都需要一个NonterminalExpression类。
为从R到R
的每个符号都维护一个AbstractExpression类型的实例变量。
为文法中的非终结符实现解释操作。解释一般要递归地调用表示R到R
的那些对象的解释操作。
- Client 客户
构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
调用解释操作。
代码示例
#import <Foundation/Foundation.h>
@interface Context : NSObject
@property (nonatomic, assign) NSInteger num;
@property (nonatomic, assign) NSInteger result;
@end
@implementation Context
- (instancetype)initWithNum:(NSInteger)num {
if (self = [super init]) {
self.num = num;
}
return self;
}
@end
@interface Expression : NSObject
@end
@implementation Expression
- (void)interpret:(Context *)context {
}
@end
@interface PlusExpression : Expression
@end
@implementation PlusExpression
- (void)interpret:(Context *)context {
NSInteger num = context.num;
num++;
context.num = num;
context.result = num;
}
@end
@interface MinusExpression : Expression
@end
@implementation MinusExpression
- (void)interpret:(Context *)context {
NSInteger num = context.num;
num--;
context.num = num;
context.result = num;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Context *ct = [[Context alloc] initWithNum:18];
NSLog(@"num:%ld", ct.num);
Expression *exp = [[PlusExpression alloc] init];
[exp interpret:ct];
NSLog(@"num:%ld", ct.num);
exp = [[MinusExpression alloc] init];
[exp interpret:ct];
NSLog(@"num:%ld", ct.num);
}
return 0;
}
/*
num:18
num:19
num:18
*/
用处
一种语法,主要用在编译器、规则引擎、正则表达式
优点
有抽象的父类,便于扩展
缺点
- 可利用场景比较少
- 复杂的文法难以维护
网友评论