diff options
author | Takeshi Abe <tabe@fixedpoint.jp> | 2017-03-25 15:42:31 +0900 |
---|---|---|
committer | Takeshi Abe <tabe@fixedpoint.jp> | 2017-03-29 13:11:35 +0000 |
commit | 435011a6a7924ac56ab1a0ee78a2eecb99bdb353 (patch) | |
tree | 4c066319cebdb260423fc27e5ed0cf4773b0d26e /starmath | |
parent | 19ae5ff9beb2af7da4c781f6e318128e4521efe2 (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.cxx | 82 |
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() |