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>
This commit is contained in:
Takeshi Abe
2017-03-23 12:10:46 +09:00
parent 1670cc25bc
commit faeda4e29e
2 changed files with 22 additions and 37 deletions

View File

@@ -64,9 +64,9 @@ class SmParser
SmTableNode *DoTable(); SmTableNode *DoTable();
void DoLine(); void DoLine();
SmNode *DoExpression(); SmNode *DoExpression();
void DoRelation(); SmNode *DoRelation();
void DoSum(); SmNode *DoSum();
void DoProduct(); SmNode *DoProduct();
SmNode *DoSubSup(TG nActiveGroup, SmNode *pGivenNode); SmNode *DoSubSup(TG nActiveGroup, SmNode *pGivenNode);
SmNode *DoOpSubSup(); SmNode *DoOpSubSup();
SmNode *DoPower(); SmNode *DoPower();

View File

@@ -1037,15 +1037,9 @@ SmNode *SmParser::DoExpression()
} }
SmNodeArray RelationArray; SmNodeArray RelationArray;
RelationArray.push_back(DoRelation());
DoRelation();
RelationArray.push_back(popOrZero(m_aNodeStack));
while (m_aCurToken.nLevel >= 4) while (m_aCurToken.nLevel >= 4)
{ RelationArray.push_back(DoRelation());
DoRelation();
RelationArray.push_back(popOrZero(m_aNodeStack));
}
if (RelationArray.size() > 1) 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)) while (TokenInGroup(TG::Relation))
{ {
std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken)); std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken));
SmNode *pFirst = popOrZero(m_aNodeStack);
SmNode *pSecond = DoOpSubSup(); SmNode *pSecond = DoOpSubSup();
SmNode *pThird = DoSum();
DoSum(); pSNode->SetSubNodes(pFirst, pSecond, pThird);
pFirst = pSNode.release();
pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack));
m_aNodeStack.push_front(std::move(pSNode));
} }
return pFirst;
} }
void SmParser::DoSum() SmNode *SmParser::DoSum()
{ {
DoProduct(); SmNode *pFirst = DoProduct();
while (TokenInGroup(TG::Sum)) while (TokenInGroup(TG::Sum))
{ {
std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken)); std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken));
SmNode *pFirst = popOrZero(m_aNodeStack);
SmNode *pSecond = DoOpSubSup(); SmNode *pSecond = DoOpSubSup();
SmNode *pThird = DoProduct();
DoProduct(); pSNode->SetSubNodes(pFirst, pSecond, pThird);
pFirst = pSNode.release();
pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack));
m_aNodeStack.push_front(std::move(pSNode));
} }
return pFirst;
} }
void SmParser::DoProduct() SmNode *SmParser::DoProduct()
{ {
SmNode *pFirst = DoPower(); SmNode *pFirst = DoPower();
@@ -1165,7 +1153,7 @@ void SmParser::DoProduct()
} }
pFirst = pSNode; pFirst = pSNode;
} }
m_aNodeStack.emplace_front(pFirst); return pFirst;
} }
SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode) SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode)
@@ -1197,7 +1185,7 @@ SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode)
if (eType == TFROM || eType == TTO) if (eType == TFROM || eType == TTO)
{ {
// parse limits in old 4.0 and 5.0 style // parse limits in old 4.0 and 5.0 style
DoRelation(); m_aNodeStack.emplace_front(DoRelation());
} }
else else
m_aNodeStack.emplace_front(DoTerm(true)); m_aNodeStack.emplace_front(DoTerm(true));
@@ -2072,11 +2060,8 @@ SmTableNode *SmParser::DoBinom()
NextToken(); NextToken();
DoSum(); SmNode *pFirst = DoSum();
DoSum(); SmNode *pSecond = DoSum();
SmNode *pSecond = popOrZero(m_aNodeStack);
SmNode *pFirst = popOrZero(m_aNodeStack);
pSNode->SetSubNodes(pFirst, pSecond); pSNode->SetSubNodes(pFirst, pSecond);
return pSNode.release(); return pSNode.release();
} }