summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/compiler.hxx8
-rw-r--r--sc/source/core/tool/compiler.cxx27
2 files changed, 33 insertions, 2 deletions
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index 298e341f8cd7..ec99d45ce260 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -313,6 +313,14 @@ private:
std::vector<OUString> maTabNames; /// sheet names mangled for the current grammar for output
std::vector<OUString> &GetSetupTabNames() const; /// get or setup tab names for the current grammar
+ struct TableRefEntry
+ {
+ ScTokenRef mxToken;
+ sal_uInt16 mnLevel;
+ TableRefEntry( formula::FormulaToken* p ) : mxToken(p), mnLevel(0) {}
+ };
+ std::vector<TableRefEntry> maTableRefs; /// "stack" of currently active ocTableRef tokens
+
bool NextNewToken(bool bInArray = false);
virtual void SetError(sal_uInt16 nError) SAL_OVERRIDE;
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index c913ab7ad4d6..fd5edd4da0d9 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -3938,11 +3938,34 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula )
const FormulaToken* pPrev = pArr->PeekPrev( nIdx);
if (pPrev && pPrev->GetOpCode() == ocDBArea)
{
+ FormulaToken* pTableRefToken = new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL);
+ maTableRefs.push_back( TableRefEntry( pTableRefToken));
// pPrev may be dead hereafter.
- static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1,
- new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL));
+ static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, pTableRefToken);
}
}
+ switch (eOp)
+ {
+ case ocTableRefOpen:
+ SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefOpen without TableRefEntry");
+ if (maTableRefs.empty())
+ SetError(errPair);
+ else
+ ++maTableRefs.back().mnLevel;
+ break;
+ case ocTableRefClose:
+ SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefClose without TableRefEntry");
+ if (maTableRefs.empty())
+ SetError(errPair);
+ else
+ {
+ if (--maTableRefs.back().mnLevel == 0)
+ maTableRefs.pop_back();
+ }
+ break;
+ default:
+ break;
+ }
eLastOp = maRawToken.GetOpCode();
if ( bAutoCorrect )
aCorrectedFormula += aCorrectedSymbol;