介绍:
1)
在编译原理中,一个算术表达式通过
词法分析器
形成词法单元,而后这些词法单元再通过语法分析器
构建语法分析树,最终形成一颗抽象的语法分析树。这里的词法分析器和语法分析器都可以看做是解释器。
2)
解释器模式(
Interpreter Pattern
):是指给定一个语言
(
表达式
)
,定义它的文法的一种表示,并定义一个解释器,使用该解释器来解释语言中的句子(
表达式
)。
3)
应用场景:
•
应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
•
一些重复出现的问题可以用一种简单的语言来表达。
•
一个简单语法需要解释的场景。
4)
这样的例子还有,比如编译器、运算表达式计算、正则表达式、机器人等。
解释器模式的原理-->UML类图:
1) Context: 是环境角色,含有解释器之外的全局信息。
2) AbstractExpression: 抽象表达式, 声明一个抽象的解释操作,这个方法为抽象语法树中所有的节点所共享。
3) TerminalExpression: 为终结符表达式, 实现与文法中的终结符相关的解释操作
4) NonTermialExpression: 为非终结符表达式,为文法中的非终结符实现解释操作.
5) 说明: 输入Context 和 TerminalExpression 信息通过Client 输入即可。
解释器模式-->UML类图:
核心代码:
解释器模在Spring框架中的SpelExpressionParser应用:
- Expression
接口 表达式接口。
-
下面有不同的实现类,比如
SpelExpression,
或者
CompositeStringExpression
。
-
使用时候,根据你创建的不同的
Parser
对象,返回不同的
Expression
对象。
public Expression parseExpression(String expressionString, ParserContext context)
throws ParseException {
if (context == null) {
context =
NON_TEMPLATE_PARSER_CONTEXT;
}
if (context.isTemplate()) {
return parseTemplate(expressionString, context); //
返回的就是
CompositeStringExpression
}
else {
return doParseExpression(expressionString, context); //
返回的就是
SpelExpression
}
}
-
使用得当
Expression
对象,调用
getValue
解释执行 表达式,最后得到结果。
解释器模式的注意事项和细节:
1)
当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象语法树,就可以考虑使用解释器模式,让程序具有良好的扩展性。
2)
应用场景:编译器、运算表达式计算、正则表达式、机器人等。
3)
使用解释器可能带来的问题:解释器模式会引起类膨胀、解释器模式采用递归调用
方法,将会导致调试非常复杂、效率可能降低。