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:
@@ -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();
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user