summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--starmath/inc/parse.hxx22
-rw-r--r--starmath/source/parse.cxx217
2 files changed, 116 insertions, 123 deletions
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index 14f0c2e3c27c..b4dc0a133206 100644
--- a/starmath/inc/parse.hxx
+++ b/starmath/inc/parse.hxx
@@ -70,25 +70,25 @@ class SmParser
void DoSubSup(TG nActiveGroup);
void DoOpSubSup();
void DoPower();
- void DoBlank();
- void DoTerm(bool bGroupNumberIdent);
- void DoEscape();
- void DoOperator();
+ SmBlankNode *DoBlank();
+ SmNode *DoTerm(bool bGroupNumberIdent);
+ SmNode *DoEscape();
+ SmOperNode *DoOperator();
void DoOper();
- void DoUnOper();
+ SmStructureNode *DoUnOper();
void DoAlign();
SmStructureNode *DoFontAttribut();
SmAttributNode *DoAttribut();
SmStructureNode *DoFont();
SmStructureNode *DoFontSize();
SmStructureNode *DoColor();
- void DoBrace();
+ SmStructureNode *DoBrace();
SmBracebodyNode *DoBracebody(bool bIsLeftRight);
- void DoFunction();
- void DoBinom();
- void DoStack();
- void DoMatrix();
- void DoSpecial();
+ SmTextNode *DoFunction();
+ SmTableNode *DoBinom();
+ SmStructureNode *DoStack();
+ SmStructureNode *DoMatrix();
+ SmSpecialNode *DoSpecial();
SmGlyphSpecialNode *DoGlyphSpecial();
SmExpressionNode *DoError(SmParseError Error);
// end of grammar
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index eabb837123aa..dc557095decd 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1207,7 +1207,7 @@ void SmParser::DoSubSup(TG nActiveGroup)
DoRelation();
}
else
- DoTerm(true);
+ m_aNodeStack.emplace_front(DoTerm(true));
switch (eType)
{
@@ -1249,12 +1249,12 @@ void SmParser::DoOpSubSup()
void SmParser::DoPower()
{
// get body for sub- supscripts on top of stack
- DoTerm(false);
+ m_aNodeStack.emplace_front(DoTerm(false));
DoSubSup(TG::Power);
}
-void SmParser::DoBlank()
+SmBlankNode *SmParser::DoBlank()
{
OSL_ENSURE(TokenInGroup(TG::Blank), "Sm : wrong token");
std::unique_ptr<SmBlankNode> pBlankNode(new SmBlankNode(m_aCurToken));
@@ -1271,17 +1271,15 @@ void SmParser::DoBlank()
{
pBlankNode->Clear();
}
-
- m_aNodeStack.push_front(std::move(pBlankNode));
+ return pBlankNode.release();
}
-void SmParser::DoTerm(bool bGroupNumberIdent)
+SmNode *SmParser::DoTerm(bool bGroupNumberIdent)
{
switch (m_aCurToken.eType)
{
case TESCAPE :
- DoEscape();
- break;
+ return DoEscape();
case TNOSPACE :
case TLGROUP :
@@ -1295,52 +1293,50 @@ void SmParser::DoTerm(bool bGroupNumberIdent)
if (m_aCurToken.eType != TLGROUP)
{
m_aNodeStack.pop_front(); // get rid of the 'no space' node pushed above
- DoTerm(false);
+ return DoTerm(false);
}
- else
- {
- NextToken();
+ NextToken();
- // allow for empty group
- if (m_aCurToken.eType == TRGROUP)
- {
- if (bNoSpace) // get rid of the 'no space' node pushed above
- m_aNodeStack.pop_front();
- std::unique_ptr<SmStructureNode> pSNode(new SmExpressionNode(m_aCurToken));
- pSNode->SetSubNodes(nullptr, nullptr);
- m_aNodeStack.push_front(std::move(pSNode));
+ // allow for empty group
+ if (m_aCurToken.eType == TRGROUP)
+ {
+ if (bNoSpace) // get rid of the 'no space' node pushed above
+ m_aNodeStack.pop_front();
+ std::unique_ptr<SmStructureNode> pSNode(new SmExpressionNode(m_aCurToken));
+ pSNode->SetSubNodes(nullptr, nullptr);
- NextToken();
- }
- else // go as usual
- {
- DoAlign();
- if (m_aCurToken.eType != TRGROUP)
- Error(SmParseError::RgroupExpected);
- else
- NextToken();
- }
+ NextToken();
+ return pSNode.release();
}
+ // go as usual
+ DoAlign();
+ if (m_aCurToken.eType != TRGROUP)
+ return DoError(SmParseError::RgroupExpected);
+ NextToken();
+ auto pNode = std::move(m_aNodeStack.front());
+ m_aNodeStack.pop_front();
+ return pNode.release();
}
- break;
case TLEFT :
- DoBrace();
- break;
+ return DoBrace();
case TBLANK :
case TSBLANK :
- DoBlank();
- break;
+ return DoBlank();
case TTEXT :
- m_aNodeStack.push_front(o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_TEXT));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_TEXT);
+ NextToken();
+ return pNode.release();
+ }
case TCHARACTER :
- m_aNodeStack.push_front(o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_VARIABLE));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_VARIABLE);
+ NextToken();
+ return pNode.release();
+ }
case TIDENT :
case TNUMBER :
{
@@ -1399,10 +1395,12 @@ void SmParser::DoTerm(bool bGroupNumberIdent)
}
std::unique_ptr<SmExpressionNode> pNode(new SmExpressionNode(SmToken()));
pNode->SetSubNodes(nodeArray);
- m_aNodeStack.push_front(std::move(pNode));
+ return pNode.release();
}
}
- break;
+ auto pNode = std::move(m_aNodeStack.front());
+ m_aNodeStack.pop_front();
+ return pNode.release();
}
case TLEFTARROW :
case TRIGHTARROW :
@@ -1424,9 +1422,11 @@ void SmParser::DoTerm(bool bGroupNumberIdent)
case TDOTSLOW :
case TDOTSUP :
case TDOTSVERT :
- m_aNodeStack.push_front(o3tl::make_unique<SmMathSymbolNode>(m_aCurToken));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmMathSymbolNode>(m_aCurToken);
+ NextToken();
+ return pNode.release();
+ }
case TSETN :
case TSETZ :
@@ -1442,46 +1442,40 @@ void SmParser::DoTerm(bool bGroupNumberIdent)
case TWP :
case TEMPTYSET :
case TINFINITY :
- m_aNodeStack.push_front(o3tl::make_unique<SmMathIdentifierNode>(m_aCurToken));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmMathIdentifierNode>(m_aCurToken);
+ NextToken();
+ return pNode.release();
+ }
case TPLACE:
- m_aNodeStack.push_front(o3tl::make_unique<SmPlaceNode>(m_aCurToken));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmPlaceNode>(m_aCurToken);
+ NextToken();
+ return pNode.release();
+ }
case TSPECIAL:
- DoSpecial();
- break;
+ return DoSpecial();
case TBINOM:
- DoBinom();
- break;
+ return DoBinom();
case TSTACK:
- DoStack();
- break;
+ return DoStack();
case TMATRIX:
- DoMatrix();
- break;
+ return DoMatrix();
default:
if (TokenInGroup(TG::LBrace))
- {
- DoBrace();
- }
- else if (TokenInGroup(TG::Oper))
- {
- DoOperator();
- }
- else if (TokenInGroup(TG::UnOper))
- {
- DoUnOper();
- }
- else if ( TokenInGroup(TG::Attribute)
- || TokenInGroup(TG::FontAttr))
+ return DoBrace();
+ if (TokenInGroup(TG::Oper))
+ return DoOperator();
+ if (TokenInGroup(TG::UnOper))
+ return DoUnOper();
+ if ( TokenInGroup(TG::Attribute) ||
+ TokenInGroup(TG::FontAttr) )
{
std::stack<SmStructureNode *> aStack;
bool bIsAttr;
@@ -1499,18 +1493,15 @@ void SmParser::DoTerm(bool bGroupNumberIdent)
pNode->SetSubNodes(nullptr, pFirstNode);
pFirstNode = pNode;
}
- m_aNodeStack.push_front(std::unique_ptr<SmNode>(pFirstNode));
+ return pFirstNode;
}
- else if (TokenInGroup(TG::Function))
- {
- DoFunction();
- }
- else
- Error(SmParseError::UnexpectedChar);
+ if (TokenInGroup(TG::Function))
+ return DoFunction();
+ return DoError(SmParseError::UnexpectedChar);
}
}
-void SmParser::DoEscape()
+SmNode *SmParser::DoEscape()
{
NextToken();
@@ -1536,19 +1527,21 @@ void SmParser::DoEscape()
case TRLINE :
case TLDLINE :
case TRDLINE :
- m_aNodeStack.push_front(o3tl::make_unique<SmMathSymbolNode>(m_aCurToken));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmMathSymbolNode>(m_aCurToken);
+ NextToken();
+ return pNode.release();
+ }
default:
- Error(SmParseError::UnexpectedToken);
+ return DoError(SmParseError::UnexpectedToken);
}
}
-void SmParser::DoOperator()
+SmOperNode *SmParser::DoOperator()
{
assert(TokenInGroup(TG::Oper));
- std::unique_ptr<SmStructureNode> pSNode(new SmOperNode(m_aCurToken));
+ auto pSNode = o3tl::make_unique<SmOperNode>(m_aCurToken);
// put operator on top of stack
DoOper();
@@ -1561,7 +1554,7 @@ void SmParser::DoOperator()
DoPower();
pSNode->SetSubNodes(pOperator, popOrZero(m_aNodeStack));
- m_aNodeStack.push_front(std::move(pSNode));
+ return pSNode.release();
}
void SmParser::DoOper()
@@ -1618,7 +1611,7 @@ void SmParser::DoOper()
NextToken();
}
-void SmParser::DoUnOper()
+SmStructureNode *SmParser::DoUnOper()
{
assert(TokenInGroup(TG::UnOper));
@@ -1703,8 +1696,7 @@ void SmParser::DoUnOper()
// prefix operator
pSNode->SetSubNodes(pOper, pArg);
}
-
- m_aNodeStack.push_front(std::move(pSNode));
+ return pSNode.release();
}
SmAttributNode *SmParser::DoAttribut()
@@ -1900,7 +1892,7 @@ SmStructureNode *SmParser::DoFontSize()
return pFontNode.release();
}
-void SmParser::DoBrace()
+SmStructureNode *SmParser::DoBrace()
{
assert(m_aCurToken.eType == TLEFT || TokenInGroup(TG::LBrace));
@@ -1979,10 +1971,9 @@ void SmParser::DoBrace()
assert(pRight);
pSNode->SetSubNodes(pLeft.release(), pBody.release(), pRight.release());
pSNode->SetScaleMode(eScaleMode);
- m_aNodeStack.push_front(std::move(pSNode));
+ return pSNode.release();
}
- else
- Error(eError);
+ return DoError(eError);
}
SmBracebodyNode *SmParser::DoBracebody(bool bIsLeftRight)
@@ -2044,7 +2035,7 @@ SmBracebodyNode *SmParser::DoBracebody(bool bIsLeftRight)
return pBody.release();
}
-void SmParser::DoFunction()
+SmTextNode *SmParser::DoFunction()
{
switch (m_aCurToken.eType)
{
@@ -2071,18 +2062,21 @@ void SmParser::DoFunction()
case TLN :
case TLOG :
case TEXP :
- m_aNodeStack.push_front(o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_FUNCTION));
- NextToken();
- break;
+ {
+ auto pNode = o3tl::make_unique<SmTextNode>(m_aCurToken, FNT_FUNCTION);
+ NextToken();
+ return pNode.release();
+ }
default:
assert(false);
+ return nullptr;
}
}
-void SmParser::DoBinom()
+SmTableNode *SmParser::DoBinom()
{
- std::unique_ptr<SmStructureNode> pSNode(new SmTableNode(m_aCurToken));
+ auto pSNode = o3tl::make_unique<SmTableNode>(m_aCurToken);
NextToken();
@@ -2092,10 +2086,10 @@ void SmParser::DoBinom()
SmNode *pSecond = popOrZero(m_aNodeStack);
SmNode *pFirst = popOrZero(m_aNodeStack);
pSNode->SetSubNodes(pFirst, pSecond);
- m_aNodeStack.push_front(std::move(pSNode));
+ return pSNode.release();
}
-void SmParser::DoStack()
+SmStructureNode *SmParser::DoStack()
{
std::unique_ptr<SmStructureNode> pSNode(new SmTableNode(m_aCurToken));
NextToken();
@@ -2121,15 +2115,14 @@ void SmParser::DoStack()
Error(SmParseError::RgroupExpected);
pSNode->SetSubNodes(ExpressionArray);
- m_aNodeStack.push_front(std::move(pSNode));
NextToken();
+ return pSNode.release();
}
- else
- Error(SmParseError::LgroupExpected);
+ return DoError(SmParseError::LgroupExpected);
}
-void SmParser::DoMatrix()
+SmStructureNode *SmParser::DoMatrix()
{
std::unique_ptr<SmMatrixNode> pMNode(new SmMatrixNode(m_aCurToken));
NextToken();
@@ -2180,15 +2173,14 @@ void SmParser::DoMatrix()
pMNode->SetSubNodes(ExpressionArray);
pMNode->SetRowCol(r, c);
- m_aNodeStack.push_front(std::move(pMNode));
NextToken();
+ return pMNode.release();
}
- else
- Error(SmParseError::LgroupExpected);
+ return DoError(SmParseError::LgroupExpected);
}
-void SmParser::DoSpecial()
+SmSpecialNode *SmParser::DoSpecial()
{
bool bReplace = false;
OUString &rName = m_aCurToken.aText;
@@ -2225,8 +2217,9 @@ void SmParser::DoSpecial()
if (!aSymbolName.isEmpty())
m_aUsedSymbols.insert( aSymbolName );
- m_aNodeStack.push_front(o3tl::make_unique<SmSpecialNode>(m_aCurToken));
+ auto pNode = o3tl::make_unique<SmSpecialNode>(m_aCurToken);
NextToken();
+ return pNode.release();
}
SmGlyphSpecialNode *SmParser::DoGlyphSpecial()