ExpressionTranslation.h 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #pragma once
  2. #include <string>
  3. #include <vector>
  4. #include <stack>
  5. #include <map>
  6. #include <list>
  7. #include <algorithm>
  8. using namespace std;
  9. //去除所有空格
  10. void RemoveSomeChar(string& text, char ascii);
  11. //截取非逻辑字符串
  12. string GetKeyValueString(const string& str);
  13. void SplitKeyValueOprString(const string& str, string& key,string& value,string& opr);
  14. //****************节点结构体**************************
  15. //表达式二叉树形式:支持算数表达式、逻辑表达式解析(二者不可同时启用)
  16. struct TreeNode;
  17. //****************表达式类**************************
  18. using SMGetValueCallback = std::function<bool(string)>;
  19. class CcosExpression
  20. {
  21. public:
  22. enum EN_TreeType //二叉树节点类型
  23. {
  24. TT_Null,
  25. TT_Number,
  26. TT_bool,
  27. TT_Max
  28. };
  29. CcosExpression(EN_TreeType treeType = TT_bool);
  30. ~CcosExpression();
  31. //设置优先级
  32. //参数数组中的char代表二元逻辑运算符(必须是单字符的特殊ASCII符号),int代表运算符优先级(取值必须>=0)
  33. //其中,必须有:'#'优先级最小, '('优先级次之, ')'优先级最大,其余逻辑符合理的安排在'('与')'之间即可
  34. void SetPriorityMap(map<char, int>& Map_type_level);
  35. void GetPriorityMap(map<char, int>& Map_type_level);
  36. //构建二叉树,用于解析中缀表达式
  37. bool CreateTree(string strText, list<string>& nodeValueList);
  38. //销毁二叉树
  39. void DestroyTree(TreeNode* root);
  40. //打印二叉树
  41. void Show(vector<vector<string>>& strPrint);
  42. //计算二叉树
  43. template<typename T>
  44. bool CalculateExpression(T& value, SMGetValueCallback fun = nullptr)
  45. {
  46. bool ret{ false };
  47. try {
  48. if (m_pRoot)
  49. {
  50. m_funGetValue = fun;
  51. if (typeid(T) == typeid(bool) && m_eTreeType == TT_bool)
  52. {
  53. value = GetBoolValue(m_pRoot);
  54. ret = true;
  55. }
  56. else if ((typeid(T) == typeid(int) || typeid(T) == typeid(float) || typeid(T) == typeid(double)) && m_eTreeType == TT_Number)
  57. {
  58. value = GetNumberValue(m_pRoot);
  59. ret = true;
  60. }
  61. else
  62. {
  63. //mLog::FERROR("treeType failed");
  64. ret = false;
  65. }
  66. m_funGetValue = nullptr;
  67. }
  68. }
  69. catch (...)
  70. {
  71. //mLog::FERROR("CalculateExpression crash");
  72. }
  73. return ret;
  74. }
  75. protected:
  76. void SetRootNode(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode);//设计一个单元的二叉树(一个父节点,两个子节点)
  77. void SetSingleNode(vector<string>& dataArray, TreeNode*& curNode);//设计一个单节点的二叉树(一个父节点,无子节点)
  78. void SetRightTree(TreeNode* curNode, char operatorType, string rightData);//在当前节点的右子树最下方重新构建一个单元的二叉树
  79. void SetTopTree(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode);//在当前节点上方重新构建一个单元的二叉树
  80. void SetTree(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode, bool flag);//根据不同的情况(运算符的优先级)构建不同的二叉树单元
  81. int CheckPriority(char operatorType);//判断优先级
  82. bool IsLeftSymbol(stack<char> stacks);//判断当前栈中是否包含'('操作符
  83. int JudgeKeyValue(const string& data); //截取关键词
  84. double GetNumberValue(TreeNode* node); //计算算数表达式
  85. bool GetBoolValue(TreeNode* node); //计算逻辑表达式
  86. private:
  87. EN_TreeType m_eTreeType{ TT_bool }; //节点类型
  88. map<char, int> glo_PriorityMap; //优先级列表, 逻辑、算数运算符:优先级
  89. TreeNode* m_pRoot{ nullptr }; //根节点
  90. SMGetValueCallback m_funGetValue{ nullptr }; //获取条件当前值
  91. };