ExpressionTranslation.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. // ExpressionTranslation.cpp: 实现文件
  2. //
  3. #include <iostream>
  4. #include "stdafx.h"
  5. #include "ExpressionTranslation.h"
  6. #include "LogLocalHelper.h"
  7. #include "Log4CPP.h"
  8. //去除所有空格
  9. void RemoveSomeChar(string& text, char ascii)
  10. {
  11. text.erase(std::remove(text.begin(), text.end(), ascii), text.end());
  12. }
  13. //截取非逻辑字符串
  14. string GetKeyValueString(const string& str)
  15. {
  16. int pos = 0;
  17. while (pos < str.size())
  18. {
  19. if ((str[pos] == ':') || (str[pos] >= '0' && str[pos] <= '9') || (str[pos] >= 'a' && str[pos] <= 'z') || (str[pos] >= 'A' && str[pos] <= 'Z'))
  20. pos++;
  21. else
  22. break;
  23. }
  24. return string(str.begin(), str.begin() + pos);
  25. }
  26. void SplitKeyValueOprString(const string& str, string& key, string& value, string& opr)
  27. {
  28. key.clear();
  29. value.clear();
  30. opr.clear();
  31. int pos = 0;
  32. while (pos < str.size())
  33. {
  34. if (key.empty())
  35. {
  36. if ((str[pos] == ':') || (str[pos] >= '0' && str[pos] <= '9') || (str[pos] >= 'a' && str[pos] <= 'z') || (str[pos] >= 'A' && str[pos] <= 'Z'))
  37. pos++;
  38. else
  39. break;
  40. }
  41. }
  42. if (key.empty())
  43. {
  44. key = string(str.begin(), str.begin() + pos);
  45. }
  46. if (opr.empty())
  47. {
  48. if (str.compare(pos, 3, OperatorType_Relational_NotBetween) == 0)
  49. {
  50. opr = OperatorType_Relational_NotBetween;
  51. }
  52. else if (str.compare(pos, 2, OperatorType_Relational_Between) == 0)
  53. {
  54. opr = OperatorType_Relational_Between;
  55. }
  56. else if (str.compare(pos, 3, OperatorType_Relational_NotIN) == 0)
  57. {
  58. opr = OperatorType_Relational_NotIN;
  59. }
  60. else if (str.compare(pos, 2, OperatorType_Relational_IN) == 0)
  61. {
  62. opr = OperatorType_Relational_IN;
  63. }
  64. else if (str.compare(pos, 2, OperatorType_Relational_NotEqual) == 0)
  65. {
  66. opr = OperatorType_Relational_NotEqual;
  67. }
  68. else if (str.compare(pos, 1, OperatorType_Relational_Equal) == 0)
  69. {
  70. opr = OperatorType_Relational_Equal;
  71. }
  72. else if (str.compare(pos, 2, OperatorType_Relational_SmallAnd) == 0)
  73. {
  74. opr = OperatorType_Relational_SmallAnd;
  75. }
  76. else if (str.compare(pos, 1, OperatorType_Relational_Small) == 0)
  77. {
  78. opr = OperatorType_Relational_Small;
  79. }
  80. else if (str.compare(pos, 2, OperatorType_Relational_BigAnd) == 0)
  81. {
  82. opr = OperatorType_Relational_BigAnd;
  83. }
  84. else if (str.compare(pos, 1, OperatorType_Relational_Big) == 0)
  85. {
  86. opr = OperatorType_Relational_Big;
  87. }
  88. }
  89. if (value.empty())
  90. {
  91. if (pos + opr.size() < str.size())
  92. value = string(str.begin() + pos + opr.size(), str.end());
  93. }
  94. }
  95. //******************二叉树节点结构**************************
  96. struct TreeNode
  97. {
  98. TreeNode* m_pLeft{ nullptr }; //左节点
  99. TreeNode* m_pRight{ nullptr }; //右节点
  100. string m_strData; //[数据名][运算符][逻辑值]
  101. TreeNode(string val_) :m_strData(val_) {};
  102. int Show(vector<vector<string>>& strPrint, int dep)
  103. {
  104. string branch;//树枝
  105. int nodeLength = m_strData.size();//果长
  106. //规整树枝
  107. for (int i = 0; i < nodeLength; ++i)
  108. {
  109. branch += "─";
  110. }
  111. //左遍历
  112. int leftSize{ 0 };
  113. if (nullptr != m_pLeft)
  114. {
  115. leftSize = m_pLeft->Show(strPrint, dep + 1);
  116. }
  117. else
  118. {
  119. strPrint.push_back(vector<string>{"", "null"});
  120. leftSize = strPrint.size() - 1;
  121. }
  122. //根节点
  123. strPrint.push_back(vector<string>{"", m_strData});
  124. int ret = strPrint.size() - 1;
  125. //右遍历
  126. int rightSize{ 0 };
  127. if (nullptr != m_pRight)
  128. {
  129. rightSize = m_pRight->Show(strPrint, dep + 1);
  130. }
  131. else
  132. {
  133. strPrint.push_back(vector<string>{"", "null"});
  134. rightSize = strPrint.size() - 1;
  135. }
  136. //组装二叉树打印
  137. int start = strPrint.size();
  138. for (int i = start; i <= leftSize - 1; ++i)
  139. {
  140. strPrint[i][0] = string(nodeLength + 1, ' ') + strPrint[i][0];
  141. }
  142. strPrint[leftSize][0] = "└" + branch + strPrint[leftSize][0];
  143. for (int i = leftSize + 1; i <= rightSize - 1; ++i)
  144. {
  145. strPrint[i][0] = "│" + string(nodeLength, ' ') + strPrint[i][0];
  146. }
  147. strPrint[ret][0] = "";
  148. strPrint[rightSize][0] = "┌" + branch + strPrint[rightSize][0];
  149. for (int i = rightSize + 1; i < strPrint.size(); ++i)
  150. {
  151. strPrint[i][0] = string(nodeLength + 1, ' ') + strPrint[i][0];
  152. }
  153. return ret;
  154. }
  155. };
  156. //******************表达式类**************************
  157. CcosExpression::CcosExpression(EN_TreeType treeType)
  158. {
  159. m_eTreeType = treeType;
  160. switch (treeType)
  161. {
  162. case TT_Number:
  163. {
  164. glo_PriorityMap[OperatorType_Logical_EndOfExpression] = 0;
  165. glo_PriorityMap[OperatorType_Logical_LeftBracket] = 1;
  166. glo_PriorityMap[OperatorType_Arithmetic_Add] = 2;
  167. glo_PriorityMap[OperatorType_Arithmetic_Subtract] = 2;
  168. glo_PriorityMap[OperatorType_Arithmetic_Multiply] = 3;
  169. glo_PriorityMap[OperatorType_Arithmetic_Divide] = 3;
  170. glo_PriorityMap[OperatorType_Logical_RightBracket] = 4;
  171. }break;
  172. case TT_bool:
  173. {
  174. glo_PriorityMap[OperatorType_Logical_EndOfExpression] = 0;
  175. glo_PriorityMap[OperatorType_Logical_LeftBracket] = 1;
  176. glo_PriorityMap[OperatorType_Logical_Or] = 2;
  177. glo_PriorityMap[OperatorType_Logical_And] = 3;
  178. glo_PriorityMap[OperatorType_Logical_RightBracket] = 4;
  179. }break;
  180. default:
  181. {
  182. throw std::invalid_argument("Type negative");
  183. }break;
  184. }
  185. }
  186. CcosExpression::~CcosExpression()
  187. {
  188. if (m_pRoot)
  189. {
  190. DestroyTree(m_pRoot);
  191. m_pRoot = nullptr;
  192. }
  193. }
  194. //设置、获取优先级
  195. int CcosExpression::CheckPriority(char operatorType)
  196. {
  197. auto iter = glo_PriorityMap.find(operatorType);
  198. return iter == glo_PriorityMap.end() ? -1 : iter->second;
  199. }
  200. //判断当前栈中是否包含'('操作符
  201. bool CcosExpression::IsLeftSymbol(stack<char> stacks)
  202. {
  203. while (!stacks.empty())
  204. {
  205. if (stacks.top() == OperatorType_Logical_LeftBracket)
  206. return true;
  207. stacks.pop();
  208. }
  209. return false;
  210. }
  211. //设计一个单元的二叉树(一个父节点,两个子节点)
  212. void CcosExpression::SetRootNode(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode)
  213. {
  214. curNode = new TreeNode(string(1, operatorStacks.top()));
  215. operatorStacks.pop();
  216. curNode->m_pLeft = new TreeNode(dataArray[dataArray.size() - 1]);
  217. dataArray.pop_back();
  218. curNode->m_pRight = new TreeNode(dataArray[dataArray.size() - 1]);
  219. dataArray.pop_back();
  220. }
  221. void CcosExpression::SetSingleNode(vector<string>& dataArray, TreeNode*& curNode)
  222. {
  223. curNode = new TreeNode(dataArray[dataArray.size() - 1]);
  224. }
  225. //在当前节点的右子树最下方重新构建一个单元的二叉树,
  226. //比如:
  227. // +
  228. // / \
  229. // 3 5
  230. //如果c='*',rightNum=8,则
  231. // +
  232. // / \
  233. // 3 *
  234. // / \
  235. // 5 8
  236. void CcosExpression::SetRightTree(TreeNode* curNode, char operatorType, string rightData)
  237. {
  238. stack<TreeNode*> stacks;
  239. while (curNode->m_pRight != nullptr)
  240. {
  241. stacks.push(curNode);
  242. curNode = curNode->m_pRight;
  243. }
  244. TreeNode* node = new TreeNode(string(1, operatorType));
  245. node->m_pLeft = stacks.top()->m_pRight;
  246. node->m_pRight = new TreeNode(rightData);
  247. stacks.top()->m_pRight = node;
  248. }
  249. //在当前节点上方重新构建一个单元的二叉树,
  250. //比如:
  251. // +
  252. // / \
  253. // 5 6
  254. //如果s = {#,-},dataArray = {6};则
  255. // -
  256. // / \
  257. // + 6
  258. // / \
  259. //5 6
  260. void CcosExpression::SetTopTree(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode)
  261. {
  262. if (!dataArray.empty())
  263. {
  264. TreeNode* node = new TreeNode(string(1, operatorStacks.top()));
  265. operatorStacks.pop();
  266. node->m_pLeft = curNode;
  267. node->m_pRight = new TreeNode(dataArray[dataArray.size() - 1]);
  268. dataArray.pop_back();
  269. curNode = node;
  270. }
  271. }
  272. //根据不同的情况(运算符的优先级)构建不同的二叉树单元
  273. void CcosExpression::SetTree(stack<char>& operatorStacks, vector<string>& dataArray, TreeNode*& curNode, bool flag)
  274. {
  275. if (curNode == nullptr)
  276. {
  277. SetRootNode(operatorStacks, dataArray, curNode);
  278. }
  279. else if (CheckPriority((curNode->m_strData[0])) < CheckPriority(operatorStacks.top()) && !flag)//如果当前父节点的优先级小于栈顶运算符的优先级
  280. {
  281. SetRightTree(curNode, operatorStacks.top(), dataArray[dataArray.size() - 1]);
  282. operatorStacks.pop();
  283. dataArray.pop_back();
  284. }
  285. else if (CheckPriority((curNode->m_strData[0])) >= CheckPriority(operatorStacks.top()) || flag)//如果当前父节点的优先级大于等于栈顶运算符的优先级
  286. {
  287. SetTopTree(operatorStacks, dataArray, curNode);
  288. }
  289. }
  290. //计算二叉树
  291. double CcosExpression::GetNumberValue(TreeNode* node)
  292. {
  293. if (glo_PriorityMap.find(node->m_strData[0]) != glo_PriorityMap.end())
  294. {
  295. if (node->m_strData[0] == OperatorType_Arithmetic_Add)
  296. return GetNumberValue(node->m_pLeft) + GetNumberValue(node->m_pRight);
  297. else if (node->m_strData[0] == OperatorType_Arithmetic_Subtract)
  298. return GetNumberValue(node->m_pLeft) - GetNumberValue(node->m_pRight);
  299. else if (node->m_strData[0] == OperatorType_Arithmetic_Multiply)
  300. return GetNumberValue(node->m_pLeft) * GetNumberValue(node->m_pRight);
  301. else if (node->m_strData[0] == OperatorType_Arithmetic_Divide)
  302. return GetNumberValue(node->m_pLeft) / GetNumberValue(node->m_pRight);
  303. }
  304. return atof(node->m_strData.c_str());
  305. }
  306. bool CcosExpression::GetBoolValue(TreeNode* node)
  307. {
  308. if (glo_PriorityMap.find(node->m_strData[0]) != glo_PriorityMap.end())
  309. {
  310. if (node->m_strData[0] == OperatorType_Logical_Or)
  311. return GetBoolValue(node->m_pLeft) || GetBoolValue(node->m_pRight);
  312. else if (node->m_strData[0] == OperatorType_Logical_And)
  313. return GetBoolValue(node->m_pLeft) && GetBoolValue(node->m_pRight);
  314. }
  315. bool ret{ false };
  316. if (m_funGetValue)
  317. {
  318. ret = m_funGetValue(node->m_strData);
  319. }
  320. else
  321. {
  322. ret = atoi(node->m_strData.c_str());
  323. }
  324. return ret;
  325. }
  326. //=============对外提供接口=============
  327. //设置、获取优先级
  328. void CcosExpression::SetPriorityMap(map<char, int>& Map_type_level)
  329. {
  330. if (!Map_type_level.empty())
  331. glo_PriorityMap = Map_type_level;
  332. }
  333. void CcosExpression::GetPriorityMap(map<char, int>& Map_type_level)
  334. {
  335. Map_type_level = glo_PriorityMap;
  336. }
  337. //构建二叉树,用于计算中缀表达式
  338. bool CcosExpression::CreateTree(string strText, list<string>& nodeValueList)
  339. {
  340. if (m_pRoot)
  341. {
  342. DestroyTree(m_pRoot);
  343. m_pRoot = nullptr;
  344. }
  345. try
  346. {
  347. vector<string> dataArray;
  348. stack<char> operatorStacks;
  349. operatorStacks.push(OperatorType_Logical_EndOfExpression);
  350. bool flag = false;
  351. while (!strText.empty())
  352. {
  353. int keyValueLengh = JudgeKeyValue(strText);
  354. if (keyValueLengh > 0)
  355. {
  356. dataArray.push_back(string(strText.begin(), strText.begin() + keyValueLengh));
  357. nodeValueList.push_back(string(strText.begin(), strText.begin() + keyValueLengh));
  358. strText.erase(strText.begin(), strText.begin() + keyValueLengh);
  359. }
  360. else//此时为运算符(+,-,*,/)或者'('和')'
  361. {
  362. if (strText[0] == OperatorType_Logical_RightBracket)//如果为')'符号,则处理当前数据
  363. {
  364. strText.erase(strText.begin());//去除')'
  365. while (operatorStacks.top() != OperatorType_Logical_EndOfExpression)
  366. {
  367. if (operatorStacks.top() == OperatorType_Logical_LeftBracket)
  368. {
  369. operatorStacks.pop();
  370. flag = true;
  371. continue;
  372. }
  373. SetTree(operatorStacks, dataArray, m_pRoot, flag);//构建二叉树
  374. }
  375. if (CheckPriority(strText[0]) >= CheckPriority(m_pRoot->m_strData[0]))//这个是用于判断比如(3+5)*2和2*(3+5),即如果括号在右侧,flag为true,此时不需要按照优先级判断。
  376. flag = true;
  377. else
  378. flag = false;
  379. }
  380. else if (strText[0] == OperatorType_Logical_LeftBracket)//此时无条件入栈
  381. {
  382. operatorStacks.push(strText[0]);
  383. strText.erase(strText.begin());
  384. }
  385. else if (IsLeftSymbol(operatorStacks))//如果栈中有'('符号,则运算符号直接入栈
  386. {
  387. operatorStacks.push(strText[0]);
  388. strText.erase(strText.begin());
  389. }
  390. else if (CheckPriority(strText[0]) >= CheckPriority(operatorStacks.top()))//如果当前表达式中的符号优先级大于等于栈顶符号优先级
  391. {
  392. //如果此时二叉树中已经有节点,则接着处理
  393. if (m_pRoot != nullptr && operatorStacks.top() != OperatorType_Logical_EndOfExpression)
  394. SetTopTree(operatorStacks, dataArray, m_pRoot);
  395. operatorStacks.push(strText[0]);
  396. strText.erase(strText.begin());
  397. }
  398. else if (CheckPriority(strText[0]) < CheckPriority(operatorStacks.top()))//如果当前表达式中的符号优先级小于栈顶符号优先级
  399. {
  400. SetTree(operatorStacks, dataArray, m_pRoot, flag);
  401. operatorStacks.push(strText[0]);
  402. strText.erase(strText.begin());
  403. }
  404. }
  405. }
  406. if (m_pRoot == nullptr)//如果m_pRoot未初始化,同时
  407. {
  408. if (operatorStacks.size() == 1)//当前不存在其它符号
  409. {
  410. if (dataArray.size() == 1)//dataArray中有一个数字
  411. {
  412. SetSingleNode(dataArray, m_pRoot);
  413. }
  414. }
  415. else
  416. {
  417. SetRootNode(operatorStacks, dataArray, m_pRoot);
  418. }
  419. }
  420. while (operatorStacks.size() > 1 && !dataArray.empty())//将最后剩余的元素进行处理
  421. {
  422. SetTree(operatorStacks, dataArray, m_pRoot, false);
  423. }
  424. }
  425. catch (...)
  426. {
  427. FERROR("CreateTree[{$}] crash", strText.c_str());
  428. return false;
  429. }
  430. return true;
  431. }
  432. //销毁二叉树
  433. void CcosExpression::DestroyTree(TreeNode* root)
  434. {
  435. //后序遍历删除根为subTree的子树;
  436. try {
  437. if (root != nullptr)
  438. {
  439. DestroyTree(root->m_pLeft); //删除左子树
  440. DestroyTree(root->m_pRight); //删除右子树
  441. delete root; //删除当前结点
  442. root = nullptr;
  443. }
  444. }
  445. catch (...)
  446. {
  447. FERROR("DestroyTree crash");
  448. }
  449. }
  450. //打印二叉树
  451. void CcosExpression::Show(vector<vector<string>>& strPrint)
  452. {
  453. try {
  454. if (m_pRoot)
  455. {
  456. m_pRoot->Show(strPrint, 0);
  457. }
  458. }
  459. catch (...)
  460. {
  461. FERROR("Show crash");
  462. }
  463. }
  464. //截取关键词
  465. int CcosExpression::JudgeKeyValue(const string& data)
  466. {
  467. int count = 0;
  468. while (count < data.size())
  469. {
  470. if (glo_PriorityMap.find(data[count]) != glo_PriorityMap.end())
  471. break;
  472. else
  473. count++;
  474. }
  475. return count;
  476. }