十一个行为模式之解释器模式(Interpreter Pattern)
定义:
定义一个语言的文法,可以使用一个解释器来解释其文法。定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联。
结构图:
- AbstractExpression:抽象表达式类,为所有元素定了抽象解释的操作,是多有终结符类和非终结符类的公共父类。
- TerminalExperssion:终结符类,所有语法中终结符的解释操作,可以通过复制的组合成为非终结符表达式。
- NotTerminalExperssion:非终结符类,所有语法非终结符的解释操作,由于非终结符可以包含非终结符表达式,可以使用递归的方式来完成解释。
- Context:环境类,存放全局的信息,通常它存储了需要解释的语句。
注意:
- 如果有多个终结符类或者非终结符类,可以考虑使用工厂方法来创建对应类的实例。
- 一般解析表达式都需要栈结构来依次从左向右进行解析。
优点:
- 可以实现一个简单的语言解析
- 易于改变和扩展文法,由于解释器使用继承的方式,所以可以动态添加解释器来改变和扩展文法。
缺点
- 对复杂文法难为维护,一个终结符或者非终结符对应一个类,如果文法复杂则导致类的个数急剧增加。
- 执行效率低,采用了大量的循环和递归的方法来解析文法。
实例