ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Interpreter(解释器)

2020-11-08 14:01:05  阅读:219  来源: 互联网

标签:解释器 终结符 expr2 expr1 context Interpreter Expression 表达式


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有