美文网首页
C++11解释器模式展示

C++11解释器模式展示

作者: FredricZhu | 来源:发表于2021-07-12 21:04 被阅读0次

题目,


image.png

本例实现一个简单的+,-法解释器,不考虑括号的情况,也就是不考虑优先级。
需要支持嵌入变量的情况。
如果变量是单字母,并且在预定义集合中,则从集合中找出变量值,参与计算。
如果变量是双字母,出错,返回0。
如果集合中没有变量,也返回0。
需要支持多位数字的情况。
字符串转整型可以使用std::ostringstream和std::istringstream类实现。
代码如下,

#include <map>
#include <sstream>
#include <iostream>

using namespace std;

struct Cal {
    enum Op {Add, Sub} op;
    bool caled {false};
    int left_val{-1};
    int right_val{-1};
    int result = 0;
    Cal() {};
    Cal(int left, int right, Cal::Op op_): left_val{left}, right_val{right}, op{op_} {}
    
    int eval() {
        int result {0};
        switch(op) {
            case Cal::Op::Add:
                cout << "left_val: " << left_val << " ";
                cout << "right_val: " << right_val << " ";
                cout << "old result: " << result << endl;

                result = left_val + right_val;
                cout << "new result: " << result << endl;
                break;
            case Cal::Op::Sub:
                cout << "left_val: " << left_val << " ";
                cout << "right_val: " << right_val << " ";
                cout << "old result: " << result << endl;
                result = left_val - right_val;
                cout << "new result: " << result << endl;
                break;
        }
        return result;
    }
    
};

struct ExpressionProcessor
{
  map<char,int> variables;

  int calculate(const string& expression)
  {
      Cal cal{};
      for(int i=0; i<expression.size(); ++i) {
          if(expression[i]>='0' && expression[i]<='9') {
              ostringstream oss;
              oss << expression[i];
              int j = i+1;
              for(;j<expression.size(); ++j) {
                  if(expression[j]>='0' && expression[j]<='9') {
                      oss << expression[j];
                  }else {
                      break;
                  }
              }
              i = j-1;
              
              int val{};
              istringstream iss{oss.str()};
              iss >> val;
              
             
              if(!cal.caled) {
                  cal.left_val = val;
                  cal.result = val;
                  cal.caled = true;
              } else {
                  
                 cal.right_val = val;
                 cal.result = cal.eval();
                 cal.left_val = cal.result;
              }
              
              
          } else if(expression[i] == '+') {
              cal.op = Cal::Op::Add;
          } else if(expression[i] == '-') {
              cal.op = Cal::Op::Sub;
          } else {
              // 字母
              // 多一个字母
              if(i+1 < expression.size()) {
                if((expression[i+1] <'0' || expression[i+1] >'9') && (expression[i+1] != '+') && (expression[i+1] != '-') ) {
                      return 0;
                 }
              }
              
              if(variables.find(expression[i])!=variables.end()) {
                 if(!cal.caled) {
                    cal.left_val = variables.find(expression[i])->second;
                    cal.caled = true;
                 } else {
                    cal.right_val = variables.find(expression[i])->second;
                    cal.result = cal.eval();
                    cal.left_val = cal.result;
                 }
              }else {
                  return 0;
              }
              
          }
      }

      return cal.result;
  }
};

相关文章

  • C++11解释器模式展示

    题目, 本例实现一个简单的+,-法解释器,不考虑括号的情况,也就是不考虑优先级。需要支持嵌入变量的情况。如果变量是...

  • C++11迭代器模式展示

    题目, 这个代码跟迭代器没什么关系,就是先序遍历树,然后把遍历结果放到std::vector里面。不过有了这个st...

  • C++11 装饰器模式展示

    题目, 这个题目开始想复杂了,折腾了两三个小时才折腾出来,不过这种设计本身也很蛋疼,1、已经有red或者blue的...

  • 第5章 -行为型模式-解释器模式(终)

    一、解释器模式的简介 二、解释器模式的优缺点 三、解释器模式的实例

  • 17.解释器模式(行为型)

    解释器模式(行为型) 解释器模式很难学,使用率很低! 一、相关概念 1). 解释器模式概述 解释器模式是一种使用频...

  • 解释器模式

    一、解释器模式介绍 二、解释器模式代码实例

  • 解释器模式

    解释器模式 解释器模式的定义 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案...

  • 行为型模式:解释器模式

    原文首发:行为型模式:解释器模式 十一大行为型模式之十:解释器模式。 简介 姓名 :解释器模式英文名 :Inter...

  • 折腾Java设计模式之解释器模

    解释器模式 解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器...

  • 设计模式[22]-解释器模式-Interpreter Patte

    1.解释器模式简介 解释器模式(Interpreter Pattern)模式是行为型(Behavioral)设计模...

网友评论

      本文标题:C++11解释器模式展示

      本文链接:https://www.haomeiwen.com/subject/quudpltx.html