diff options
author | Eike Rathke <erack@redhat.com> | 2015-04-08 18:06:44 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-04-08 20:45:46 +0200 |
commit | 315e1cace3c1384fc37b1a36f48150f7d8afd43c (patch) | |
tree | 043d29bdbb697a4de64012ade5a3467cb8b62e65 /sc | |
parent | 2a176c2f658f30cf8b33d9338e931ebf01fd0f3d (diff) |
TableRef: keywords come with extra brackets each
Change-Id: Ie12264c02d178be9bc5752e7ea20b4feff409e68
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 400be9a7f3bd..ea752c305e88 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -1986,7 +1986,7 @@ Label_MaskStateMachine: else if( nMask & SC_COMPILER_C_CHAR_ERRCONST ) { *pSym++ = c; - if (!maTableRefs.empty() && maTableRefs.back().mnLevel) + if (!maTableRefs.empty() && maTableRefs.back().mnLevel == 2) eState = ssGetTableRefItem; else eState = ssGetErrorConstant; @@ -3664,7 +3664,7 @@ bool ScCompiler::NextNewToken( bool bInArray ) if (cSymbol[0] == '#') { // Check for TableRef item specifiers first. - if (!maTableRefs.empty()) + if (!maTableRefs.empty() && maTableRefs.back().mnLevel == 2) { if (IsTableRefItem( aUpper )) return true; @@ -4859,8 +4859,70 @@ bool ScCompiler::HandleTableRef() } break; } + bool bColumnRange = false; + if (bForwardToClose && (bGotToken = GetToken()) && mpToken->GetOpCode() == ocTableRefOpen) + { + int nLevel = 1; + enum + { + sOpen, + sItem, + sClose, + sSep, + sStop + } eState = sOpen; + do + { + if ((bGotToken = GetToken())) + { + switch (mpToken->GetOpCode()) + { + case ocTableRefOpen: + eState = ((eState == sOpen || eState == sSep) ? sOpen : sStop); + if (++nLevel > 2) + { + SetError( errPair); + eState = sStop; + } + break; + case ocTableRefItemAll: + case ocTableRefItemHeaders: + case ocTableRefItemData: + case ocTableRefItemTotals: + case ocTableRefItemThisRow: + eState = ((eState == sOpen) ? sItem : sStop); + break; + case ocTableRefClose: + eState = ((eState == sItem || eState == sClose) ? sClose : sStop); + if (--nLevel <= 0) + { + if (nLevel < 0) + SetError( errPair); + eState = sStop; + } + break; + case ocSep: + eState = ((eState == sClose) ? sSep : sStop); + break; + case ocPush: + if (mpToken->GetType() == svSingleRef || mpToken->GetType() == svDoubleRef) + bColumnRange = true; + eState = sStop; + break; + default: + eState = sStop; + } + } + } while (bGotToken && eState != sStop); + if (bGotToken && mpToken->GetOpCode() == ocTableRefClose) + bGotToken = false; // get next token below in return + } if (bAddRange) { + if (bColumnRange) + { + /* TODO: limit range to specified columns */ + } ScComplexRefData aRefData; aRefData.InitFlags(); aRefData.SetRange( aRange, aPos); @@ -4870,12 +4932,6 @@ bool ScCompiler::HandleTableRef() { SetError( errNoRef); } - if (bForwardToClose) - { - while ((bGotToken = GetToken()) && mpToken->GetOpCode() != ocTableRefClose) - ; - bGotToken = false; // get next token below - } PushTokenArray( pNew, true ); pNew->Reset(); return bGotToken ? true : GetToken(); |