#define FORMULA_MAXJUMPCOUNT 32/* maximum number of jumps (ocChoose) */ #define FORMULA_MAXTOKENS 8192/* maximum number of tokens in formula */ #define FORMULA_MAXPARAMS 255/* maximum number of parameters per function (byte) */ #define FORMULA_MAXPARAMSII 8/* maximum number of parameters for functions that have implicit intersection ranges */
/** Mappings from strings to OpCodes and vice versa. */ class FORMULA_DLLPUBLIC OpCodeMap final
{
OpCodeHashMap maHashMap; /// Hash map of symbols, OUString -> OpCode
std::unique_ptr<OUString[]> mpTable; /// Array of symbols, OpCode -> OUString, offset==OpCode
ExternalHashMap maExternalHashMap; /// Hash map of ocExternal, Filter String -> AddIn String
ExternalHashMap maReverseExternalHashMap; /// Hash map of ocExternal, AddIn String -> Filter String
FormulaGrammar::Grammar meGrammar; /// Grammar, language and reference convention
sal_uInt16 mnSymbols; /// Count of OpCode symbols bool mbCore : 1; /// If mapping was setup by core, not filters bool mbEnglish : 1; /// If English symbols and external names bool mbEnglishLocale : 1; /// If English locale for numbers
/** Copy mappings from r into this map, effectively replacing this map.
Overrideknownlegacybadfunctionnameswith correctonesiftheconditionscanbederivedfromthe currentmaps.
*/ void copyFrom( const OpCodeMap& r );
/// Get the symbol String -> OpCode hash map for finds. const OpCodeHashMap& getHashMap() const { return maHashMap; }
/// Get the symbol String -> AddIn String hash map for finds. const ExternalHashMap& getExternalHashMap() const { return maExternalHashMap; }
/// Get the AddIn String -> symbol String hash map for finds. const ExternalHashMap& getReverseExternalHashMap() const { return maReverseExternalHashMap; }
/// Get the symbol string matching an OpCode. const OUString& getSymbol( const OpCode eOp ) const
{
DBG_ASSERT( sal_uInt16(eOp) < mnSymbols, "OpCodeMap::getSymbol: OpCode out of range"); if (sal_uInt16(eOp) < mnSymbols) return mpTable[ eOp ]; static OUString s_sEmpty; return s_sEmpty;
}
/// Get the first character of the symbol string matching an OpCode.
sal_Unicode getSymbolChar( const OpCode eOp ) const { return getSymbol(eOp)[0]; };
/// Get the grammar.
FormulaGrammar::Grammar getGrammar() const { return meGrammar; }
/// Get the symbol count.
sal_uInt16 getSymbolCount() const { return mnSymbols; }
/** Are these English symbols, as opposed to native language (which may
be English as well)? */ bool isEnglish() const { return mbEnglish; }
/** Are inline numbers parsed/formatted in en-US locale, as opposed
to default locale? */ bool isEnglishLocale() const { return mbEnglishLocale; }
/// Is it an ODF 1.1 compatibility mapping? bool isPODF() const { return FormulaGrammar::isPODF( meGrammar); }
/* TODO: add isAPI() once a FormulaLanguage was added. */
/// Is it an ODFF / ODF 1.2 mapping? bool isODFF() const { return FormulaGrammar::isODFF( meGrammar); }
/// Is it an OOXML mapping? bool isOOXML() const { return FormulaGrammar::isOOXML( meGrammar); }
/// Does it have external symbol/name mappings? bool hasExternals() const { return !maExternalHashMap.empty(); }
/// Put entry of symbol String and OpCode pair. void putOpCode( const OUString & rStr, const OpCode eOp, const CharClass* pCharClass );
/// Put entry of symbol String and AddIn international String pair. void putExternal( const OUString & rSymbol, const OUString & rAddIn );
/** Put entry of symbol String and AddIn international String pair, notwarningjustinfoasusedforAddIncollectionandsettingup
alias names. */ void putExternalSoftly( const OUString & rSymbol, const OUString & rAddIn );
/** The value used in createSequenceOfAvailableMappings() and thus in
XFormulaOpCodeMapper::getMappings() for an unknown symbol. */ static sal_Int32 getOpCodeUnknown() { return -1; }
private:
/** Conditionally put a mapping in copyFrom() context.
/** Set symbol map corresponding to one of predefined formula::FormulaGrammar::Grammar,
including an address reference convention. */
FormulaGrammar::Grammar GetGrammar() const { return meGrammar; }
/** Whether current symbol set and grammar need transformation of Table structuredreferencestoA1stylereferenceswhenwriting/exporting (creatingstrings).
*/ bool NeedsTableRefTransformation() const;
/** If a parameter nParam (0-based) is to be forced to array for OpCode eOp,i.e.classifiedasParamClass::ForceArrayor
ParamClass::ReferenceOrForceArray type. */ virtual formula::ParamClass GetForceArrayParameter( const FormulaToken* pToken, sal_uInt16 nParam ) const;
/** Sets the implicit intersection compute flag */ void SetComputeIIFlag(bool bSet) { mbComputeII = bSet; }
/** Sets the matrix flag for the formula*/ void SetMatrixFlag(bool bSet) { mbMatrixFlag = bSet; }
/** Separators mapped when loading opcodes from the resource, values other thanRESOURCE_BASEmayoverridetheresourcestrings.UsedbyOpCodeList implementationvialoadSymbols().
*/ enumclass SeparatorType
{
RESOURCE_BASE,
SEMICOLON_BASE
};
// Returns whether the opcode has implicit intersection ranges as parameters. // Called for (most) opcodes to possibly handle implicit intersection for the parameters. virtualvoid HandleIIOpCode(FormulaToken* /*token*/,
FormulaToken*** /*pppToken*/, sal_uInt8 /*nNumParams*/) {}
// Called from CompileTokenArray() after RPN code generation is done. virtualvoid PostProcessCode() {}
virtualvoid AnnotateOperands() {}
OUString aCorrectedFormula; // autocorrected Formula
OUString aCorrectedSymbol; // autocorrected Symbol
OpCodeMapPtr mxSymbols; // which symbols are used
FormulaTokenRef mpToken; // current token
FormulaTokenRef pCurrentFactorToken; // current factor token (of Factor() method)
sal_uInt16 nCurrentFactorParam; // current factor token's parameter, 1-based
FormulaTokenArray* pArr;
FormulaTokenArrayPlainIterator maArrIterator;
FormulaTokenRef mpLastToken; // last token
FormulaToken** pCode;
FormulaArrayStack* pStack;
OpCode eLastOp; short nRecursion; // GetToken() recursions
SvNumFormatType nNumFmt; // set during CompileTokenArray()
sal_uInt16 pc; // program counter
FormulaGrammar::Grammar meGrammar; // The grammar used, language plus convention.
bool bAutoCorrect; // whether to apply AutoCorrection bool bCorrected; // AutoCorrection was applied bool glSubTotal; // if code contains one or more subtotal functions bool needsRPNTokenCheck; // whether to make FormulaTokenArray check all tokens at the end
bool mbJumpCommandReorder; /// Whether or not to reorder RPN for jump commands. bool mbStopOnError; /// Whether to stop compilation on first encountered error.
bool mbComputeII; // whether to attempt computing implicit intersection ranges while building the RPN array. bool mbMatrixFlag; // whether the formula is a matrix formula (needed for II computation)
struct LambdaFunc
{ bool bInLambdaFunction = false; short nBracketPos = 0; short nParaPos = 0; short nParaCount = 3; // minimum required parameter count: 3
std::unordered_set<OUString> aNameSet;
} m_aLambda;
// ODF version at time of saving. Set by ScXMLExport::WriteCell().
std::optional< SvtSaveOptions::ODFSaneDefaultVersion > m_oODFSavingVersion;
private: bool InitSymbolsNative( InitSymbols ) const; /// only SymbolsNative, on first document creation bool InitSymbolsEnglish( InitSymbols ) const; /// only SymbolsEnglish, maybe later bool InitSymbolsPODF( InitSymbols ) const; /// only SymbolsPODF, on demand bool InitSymbolsAPI( InitSymbols ) const; /// only SymbolsAPI, on demand bool InitSymbolsODFF( InitSymbols ) const; /// only SymbolsODFF, on demand bool InitSymbolsEnglishXL( InitSymbols ) const; /// only SymbolsEnglishXL, on demand bool InitSymbolsOOXML( InitSymbols ) const; /// only SymbolsOOXML, on demand
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.