summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@fixedpoint.jp>2017-03-21 17:31:14 +0900
committerTakeshi Abe <tabe@fixedpoint.jp>2017-03-22 01:34:45 +0000
commitbdf41d8aeb53a298780f3633a76d71598a695bab (patch)
tree1ddce5285b8e4eedd3f1fbf75691f77f8291e361 /starmath
parentd0740605fcd6f2f65f78f1ac8a05bd641edc6a76 (diff)
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>
Diffstat (limited to 'starmath')
-rw-r--r--starmath/inc/parse.hxx4
-rw-r--r--starmath/source/parse.cxx45
2 files changed, 25 insertions, 24 deletions
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index b4dc0a133206..1b96c159ed70 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 a4c390d87867..b9f7fde0c746 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()