(设计模式)解释器

Posted 多元思维的开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(设计模式)解释器相关的知识,希望对你有一定的参考价值。

解释器模式:

解释器模式,用于解释某些语句所表达的语义。
常用于编译器中的词法分析、语法分析和语义分析。将某种语言转换成一棵抽象语法树,每种语法由特定的具体实现类(实现抽象语法接口),然后通过解释器来进行解释其中的数据并转换成机器所能识别的语言数据。
如下图:AbstractExpression作为抽象表达式(解释器),包含解释Interpret入口(传入上下文 context ,也就是需要解释的内容); 然后可以创建定义不同继承该抽象类的具体表达式,然后解释特定的内容。

ps:图片来自《大话设计模式》


例子:

jdk中的Pattern中对正则表达式的编译compile,这里编译的过程都是基于调用方法对正则进行解释(勉强和解释器沾边):
/** * Copies regular expression to an int array and invokes the parsing * of the expression which will create the object tree. * 编译正则表达式,形式一个抽象语法树 */private void compile() { // Handle canonical equivalences // 处理单纯的值比较 if (has(CANON_EQ) && !has(LITERAL)) { // 将正则模式化 normalize(); } else { normalizedPattern = pattern; } patternLength = normalizedPattern.length();
// Copy pattern to int array for convenience // Use double zero to terminate pattern temp = new int[patternLength + 2];
hasSupplementary = false; int c, count = 0; // Convert all chars into code points for (int x = 0; x < patternLength; x += Character.charCount(c)) { c = normalizedPattern.codePointAt(x); if (isSupplementary(c)) { hasSupplementary = true; } temp[count++] = c; }
patternLength = count; // patternLength now in code points
if (! has(LITERAL)) RemoveQEQuoting();
// Allocate all temporary objects here. buffer = new int[32]; groupNodes = new GroupHead[10]; namedGroups = null;
// 处理有文字 if (has(LITERAL)) { // Literal pattern handling matchRoot = newSlice(temp, patternLength, hasSupplementary); matchRoot.next = lastAccept; } else { // 递归解析,这里expr就是解释的入口 matchRoot = expr(lastAccept); // Check extra pattern characters if (patternLength != cursor) { if (peek() == ')') { throw error("Unmatched closing ')'"); } else { throw error("Unexpected internal error"); } } }
// Peephole optimization if (matchRoot instanceof Slice) { root = BnM.optimize(matchRoot); if (root == matchRoot) { root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot); } } else if (matchRoot instanceof Begin || matchRoot instanceof First) { root = matchRoot; } else { root = hasSupplementary ? new StartS(matchRoot) : new Start(matchRoot); }
// Release temporary storage temp = null; buffer = null; groupNodes = null; patternLength = 0; compiled = true;}


模式分析:

1、将数据与解释行为分离,并在解释完数据(这个可以理解为对数据进行翻译);不影响原有的数据,而是生成解释后的目标数据。
2、如果解释行为很多,一般都会对每个解释行为独立成一个专门的类实现相应的解释行为细节,各个解释器互不干扰的同时,可以对不同数据进行解释;以及一份数据能够被多个解释器解释生成相应的目标数据。


以上是关于(设计模式)解释器的主要内容,如果未能解决你的问题,请参考以下文章

需要对特定 R 代码片段的解释

有人可以解释以下 R 代码片段吗? [关闭]

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

诚征译者 | 尝试尽自己所能,来解释我所了解的某些片段

C++ 解释器/控制台/片段编译器

“反应堆模式”及其应用的简单解释[关闭]