Interpreter(解释器)
作者:互联网
13. Interpreter(解释器)
13.1定义
给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子
13.2 优点
■ 简单的语法分析工具。
■ 扩展性,修改语法规则只要修改相应的非终结符表达式即可,若扩展语法,则只要增加非终结符类即可。
13.3 缺点
■ 解释器模式会引起类膨胀。每个语法都要产生一个非终结符表达式,语法比较复杂时就可能产生大量的类文件,不易维护。
■ 采用递归调用方法。每个非终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的结果,必须一层一层地剥茧,无论是面向过程的语言还是面向对象的语言,递归都是在必要条件下使用的,不易调试且影响效率。
13.4. 使用场景
■ 重复发生的问题可以使用解释器模式。例如,多个应用服务器,每天产生大量的日志,需要对日志文件进行分析处理,由于各个服务器的日志格式不同,但是数据要素是相同的,按照解释器的说法就是终结符表达式都是相同的,非终结符表达式就需要制定。
■ 一个简单语法需要解释的场景。
13.5 c++源码例程
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 //抽象表达式 5 class Expression { 6 public: 7 virtual bool interpret(string context) = 0; 8 }; 9 10 //终结符表达式 11 class TerminalExpression:public Expression { 12 private: 13 string m_data; 14 public: 15 TerminalExpression(string data){ 16 this->m_data = data; 17 } 18 19 bool interpret(string context) { 20 if(context.find(m_data)!= string::npos){ 21 return true; 22 } 23 return false; 24 } 25 }; 26 //非终结符表达式 27 class OrExpression:public Expression { 28 private: 29 Expression* expr1 = NULL; 30 Expression* expr2 = NULL; 31 32 public: 33 OrExpression(Expression* expr1, Expression* expr2) { 34 this->expr1 = expr1; 35 this->expr2 = expr2; 36 } 37 38 bool interpret(string context) { 39 return expr1->interpret(context) || expr2->interpret(context); 40 } 41 }; 42 //非终结符表达式 43 class AndExpression:public Expression { 44 private: 45 Expression* expr1 = NULL; 46 Expression* expr2 = NULL; 47 48 public: 49 AndExpression(Expression* expr1, Expression* expr2) { 50 this->expr1 = expr1; 51 this->expr2 = expr2; 52 } 53 bool interpret(string context) { 54 return expr1->interpret(context) && expr2->interpret(context); 55 } 56 };
标签:解释器,终结符,expr2,expr1,context,Interpreter,Expression,表达式 来源: https://www.cnblogs.com/46cxf/p/13944181.html