summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@fixedpoint.jp>2017-03-25 15:42:31 +0900
committerTakeshi Abe <tabe@fixedpoint.jp>2017-03-29 13:11:35 +0000
commit435011a6a7924ac56ab1a0ee78a2eecb99bdb353 (patch)
tree4c066319cebdb260423fc27e5ed0cf4773b0d26e /starmath
parent19ae5ff9beb2af7da4c781f6e318128e4521efe2 (diff)
starmath: Refrain from skipping an extra token at missing "}"
which requires closing "matrix {". Change-Id: I40cad5a29862d29cd2eda7f5641e732620bac217 Reviewed-on: https://gerrit.libreoffice.org/35785 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Takeshi Abe <tabe@fixedpoint.jp>
Diffstat (limited to 'starmath')
-rw-r--r--starmath/source/parse.cxx82
1 files changed, 40 insertions, 42 deletions
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index d090cfecf93e..bbfa2e0f67e7 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -2096,58 +2096,56 @@ SmStructureNode *SmParser::DoMatrix()
{
std::unique_ptr<SmMatrixNode> pMNode(new SmMatrixNode(m_aCurToken));
NextToken();
- if (m_aCurToken.eType == TLGROUP)
- {
- sal_uInt16 c = 0;
-
- do
- {
- NextToken();
- m_aNodeStack.emplace_front(DoAlign());
- c++;
- }
- while (m_aCurToken.eType == TPOUND);
+ if (m_aCurToken.eType != TLGROUP)
+ return DoError(SmParseError::LgroupExpected);
- sal_uInt16 r = 1;
+ SmNodeArray aExprArr;
+ do
+ {
+ NextToken();
+ aExprArr.push_back(DoAlign());
+ }
+ while (m_aCurToken.eType == TPOUND);
- while (m_aCurToken.eType == TDPOUND)
+ size_t nCol = aExprArr.size();
+ size_t nRow = 1;
+ while (m_aCurToken.eType == TDPOUND)
+ {
+ NextToken();
+ for (size_t i = 0; i < nCol; i++)
{
- NextToken();
- for (sal_uInt16 i = 0; i < c; i++)
+ std::unique_ptr<SmNode> pNode(DoAlign());
+ if (i < (nCol - 1))
{
- m_aNodeStack.emplace_front(DoAlign());
- if (i < (c - 1))
- {
- if (m_aCurToken.eType == TPOUND)
- {
- NextToken();
- }
- else
- Error(SmParseError::PoundExpected);
- }
+ if (m_aCurToken.eType == TPOUND)
+ NextToken();
+ else
+ pNode.reset(DoError(SmParseError::PoundExpected));
}
-
- r++;
+ aExprArr.push_back(pNode.release());
}
+ ++nRow;
+ }
- size_t nRC = static_cast<size_t>(r) * c;
-
- SmNodeArray ExpressionArray(nRC);
- for (auto rIt = ExpressionArray.rbegin(), rEnd = ExpressionArray.rend(); rIt != rEnd; ++rIt)
+ if (m_aCurToken.eType == TRGROUP)
+ NextToken();
+ else
+ {
+ auto pENode = DoError(SmParseError::RgroupExpected);
+ if (aExprArr.empty())
+ nRow = nCol = 1;
+ else
{
- *rIt = popOrZero(m_aNodeStack);
+ delete aExprArr.back();
+ aExprArr.pop_back();
}
-
- if (m_aCurToken.eType != TRGROUP)
- Error(SmParseError::RgroupExpected);
-
- pMNode->SetSubNodes(ExpressionArray);
- pMNode->SetRowCol(r, c);
-
- NextToken();
- return pMNode.release();
+ aExprArr.push_back(pENode);
}
- return DoError(SmParseError::LgroupExpected);
+
+ pMNode->SetSubNodes(aExprArr);
+ pMNode->SetRowCol(static_cast<sal_uInt16>(nRow),
+ static_cast<sal_uInt16>(nCol));
+ return pMNode.release();
}
SmSpecialNode *SmParser::DoSpecial()