diff options
author | Takeshi Abe <tabe@fixedpoint.jp> | 2017-03-23 12:10:46 +0900 |
---|---|---|
committer | Takeshi Abe <tabe@fixedpoint.jp> | 2017-03-23 04:20:59 +0000 |
commit | faeda4e29e0be16050dd919a62ecf69a4ffdf2f8 (patch) | |
tree | 346d720d3effe2ea1446eda3159fdcfa4fb64ad6 | |
parent | 1670cc25bc2771e87f7956a4b0dd634abaa4128b (diff) |
starmath: Make DoProduct()/DoSum()/DoRelation() return SmNode
to reduce an excessive number of stack operations.
Change-Id: Ia4ef08dce76d318c56bf7d112f686e13d1b2660e
Reviewed-on: https://gerrit.libreoffice.org/35551
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Takeshi Abe <tabe@fixedpoint.jp>
-rw-r--r-- | starmath/inc/parse.hxx | 6 | ||||
-rw-r--r-- | starmath/source/parse.cxx | 53 |
2 files changed, 22 insertions, 37 deletions
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx index d158c3995151..8872b8edac9a 100644 --- a/starmath/inc/parse.hxx +++ b/starmath/inc/parse.hxx @@ -64,9 +64,9 @@ class SmParser SmTableNode *DoTable(); void DoLine(); SmNode *DoExpression(); - void DoRelation(); - void DoSum(); - void DoProduct(); + SmNode *DoRelation(); + SmNode *DoSum(); + SmNode *DoProduct(); SmNode *DoSubSup(TG nActiveGroup, SmNode *pGivenNode); SmNode *DoOpSubSup(); SmNode *DoPower(); diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx index 14ab62aad504..07383f3e359e 100644 --- a/starmath/source/parse.cxx +++ b/starmath/source/parse.cxx @@ -1037,15 +1037,9 @@ SmNode *SmParser::DoExpression() } SmNodeArray RelationArray; - - DoRelation(); - RelationArray.push_back(popOrZero(m_aNodeStack)); - + RelationArray.push_back(DoRelation()); while (m_aCurToken.nLevel >= 4) - { - DoRelation(); - RelationArray.push_back(popOrZero(m_aNodeStack)); - } + RelationArray.push_back(DoRelation()); if (RelationArray.size() > 1) { @@ -1061,41 +1055,35 @@ SmNode *SmParser::DoExpression() } } -void SmParser::DoRelation() +SmNode *SmParser::DoRelation() { - DoSum(); + SmNode *pFirst = DoSum(); while (TokenInGroup(TG::Relation)) { std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken)); - SmNode *pFirst = popOrZero(m_aNodeStack); - SmNode *pSecond = DoOpSubSup(); - - DoSum(); - - pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack)); - m_aNodeStack.push_front(std::move(pSNode)); + SmNode *pThird = DoSum(); + pSNode->SetSubNodes(pFirst, pSecond, pThird); + pFirst = pSNode.release(); } + return pFirst; } -void SmParser::DoSum() +SmNode *SmParser::DoSum() { - DoProduct(); + SmNode *pFirst = DoProduct(); while (TokenInGroup(TG::Sum)) { std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken)); - SmNode *pFirst = popOrZero(m_aNodeStack); - SmNode *pSecond = DoOpSubSup(); - - DoProduct(); - - pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack)); - m_aNodeStack.push_front(std::move(pSNode)); + SmNode *pThird = DoProduct(); + pSNode->SetSubNodes(pFirst, pSecond, pThird); + pFirst = pSNode.release(); } + return pFirst; } -void SmParser::DoProduct() +SmNode *SmParser::DoProduct() { SmNode *pFirst = DoPower(); @@ -1165,7 +1153,7 @@ void SmParser::DoProduct() } pFirst = pSNode; } - m_aNodeStack.emplace_front(pFirst); + return pFirst; } SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode) @@ -1197,7 +1185,7 @@ SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode) if (eType == TFROM || eType == TTO) { // parse limits in old 4.0 and 5.0 style - DoRelation(); + m_aNodeStack.emplace_front(DoRelation()); } else m_aNodeStack.emplace_front(DoTerm(true)); @@ -2072,11 +2060,8 @@ SmTableNode *SmParser::DoBinom() NextToken(); - DoSum(); - DoSum(); - - SmNode *pSecond = popOrZero(m_aNodeStack); - SmNode *pFirst = popOrZero(m_aNodeStack); + SmNode *pFirst = DoSum(); + SmNode *pSecond = DoSum(); pSNode->SetSubNodes(pFirst, pSecond); return pSNode.release(); } |