starmath: Make DoSubSup() return SmNode by taking another node
as an argument, not from the top of the stack.
Because no token belongs to groups TG::Limit and TG::Power at
the same time, we can replace TokenInGroup() with direct comparison
with each group.
Change-Id: I44882ab40f59c4de1c0e2cbbdc354e43de926ab1
Reviewed-on: https://gerrit.libreoffice.org/35500
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Takeshi Abe <tabe@fixedpoint.jp>
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index b4dc0a1..1b96c15 100644
--- a/starmath/inc/parse.hxx
+++ b/starmath/inc/parse.hxx
@@ -67,14 +67,14 @@ class SmParser
void DoRelation();
void DoSum();
void DoProduct();
void DoSubSup(TG nActiveGroup);
SmNode *DoSubSup(TG nActiveGroup, SmNode *pGivenNode);
void DoOpSubSup();
void DoPower();
SmBlankNode *DoBlank();
SmNode *DoTerm(bool bGroupNumberIdent);
SmNode *DoEscape();
SmOperNode *DoOperator();
void DoOper();
SmNode *DoOper();
SmStructureNode *DoUnOper();
void DoAlign();
SmStructureNode *DoFontAttribut();
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index a4c390d..b9f7fde 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1171,14 +1171,10 @@ void SmParser::DoProduct()
}
}
void SmParser::DoSubSup(TG nActiveGroup)
SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode)
{
OSL_ENSURE(nActiveGroup == TG::Power || nActiveGroup == TG::Limit,
"Sm: wrong token group");
if (!TokenInGroup(nActiveGroup))
// already finish
return;
assert(nActiveGroup == TG::Power || nActiveGroup == TG::Limit);
assert(m_aCurToken.nGroup == nActiveGroup);
std::unique_ptr<SmSubSupNode> pNode(new SmSubSupNode(m_aCurToken));
//! Of course 'm_aCurToken' is just the first sub-/supscript token.
@@ -1190,7 +1186,7 @@ void SmParser::DoSubSup(TG nActiveGroup)
// initialize subnodes array
SmNodeArray aSubNodes(1 + SUBSUP_NUM_ENTRIES, nullptr);
aSubNodes[0] = popOrZero(m_aNodeStack);
aSubNodes[0] = pGivenNode;
// process all sub-/supscripts
int nIndex = 0;
@@ -1232,26 +1228,31 @@ void SmParser::DoSubSup(TG nActiveGroup)
}
pNode->SetSubNodes(aSubNodes);
m_aNodeStack.push_front(std::move(pNode));
return pNode.release();
}
void SmParser::DoOpSubSup()
{
// push operator symbol
m_aNodeStack.push_front(o3tl::make_unique<SmMathSymbolNode>(m_aCurToken));
// get operator symbol
auto pNode = o3tl::make_unique<SmMathSymbolNode>(m_aCurToken);
// skip operator token
NextToken();
// get sub- supscripts if any
if (TokenInGroup(TG::Power))
DoSubSup(TG::Power);
if (m_aCurToken.nGroup == TG::Power)
m_aNodeStack.emplace_front(DoSubSup(TG::Power, pNode.release()));
else
m_aNodeStack.push_front(std::move(pNode));
}
void SmParser::DoPower()
{
// get body for sub- supscripts on top of stack
m_aNodeStack.emplace_front(DoTerm(false));
SmNode *pNode = DoTerm(false);
DoSubSup(TG::Power);
if (m_aCurToken.nGroup == TG::Power)
m_aNodeStack.emplace_front(DoSubSup(TG::Power, pNode));
else
m_aNodeStack.emplace_front(pNode);
}
SmBlankNode *SmParser::DoBlank()
@@ -1544,12 +1545,12 @@ SmOperNode *SmParser::DoOperator()
auto pSNode = o3tl::make_unique<SmOperNode>(m_aCurToken);
// put operator on top of stack
DoOper();
// get operator
SmNode *pOperator = DoOper();
if (TokenInGroup(TG::Limit) || TokenInGroup(TG::Power))
DoSubSup(m_aCurToken.nGroup);
SmNode *pOperator = popOrZero(m_aNodeStack);
if ( m_aCurToken.nGroup == TG::Limit ||
m_aCurToken.nGroup == TG::Power )
pOperator = DoSubSup(m_aCurToken.nGroup, pOperator);
// get argument
DoPower();
@@ -1558,7 +1559,7 @@ SmOperNode *SmParser::DoOperator()
return pSNode.release();
}
void SmParser::DoOper()
SmNode *SmParser::DoOper()
{
SmTokenType eType (m_aCurToken.eType);
std::unique_ptr<SmNode> pNode;
@@ -1607,9 +1608,9 @@ void SmParser::DoOper()
default :
assert(false && "unknown case");
}
m_aNodeStack.push_front(std::move(pNode));
NextToken();
return pNode.release();
}
SmStructureNode *SmParser::DoUnOper()