1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef PARSE_HXX 24 #define PARSE_HXX 25 26 27 #include <vcl/svapp.hxx> 28 #include <tools/stack.hxx> 29 #include <tools/list.hxx> 30 #include <tools/string.hxx> 31 32 #include <set> 33 #include <stack> 34 #include <list> 35 36 #include "types.hxx" 37 38 class SmNode; 39 class SmDocShell; 40 41 ////////////////////////////////////////////////////////////////////// 42 43 // TokenGroups 44 #define TGOPER 0x00000001 45 #define TGRELATION 0x00000002 46 #define TGSUM 0x00000004 47 #define TGPRODUCT 0x00000008 48 #define TGUNOPER 0x00000010 49 #define TGPOWER 0x00000020 50 #define TGATTRIBUT 0x00000040 51 #define TGALIGN 0x00000080 52 #define TGFUNCTION 0x00000100 53 #define TGBLANK 0x00000200 54 #define TGLBRACES 0x00000400 55 #define TGRBRACES 0x00000800 56 #define TGCOLOR 0x00001000 57 #define TGFONT 0x00002000 58 #define TGSTANDALONE 0x00004000 59 #define TGDISCARDED 0x00008000 60 #define TGLIMIT 0x00010000 61 #define TGFONTATTR 0x00020000 62 63 64 enum SmTokenType 65 { 66 TEND, TLGROUP, TRGROUP, TLPARENT, TRPARENT, 67 TLBRACKET, TRBRACKET, TPLUS, TMINUS, TMULTIPLY, 68 TDIVIDEBY, TASSIGN, TPOUND, TSPECIAL, TSLASH, 69 TBACKSLASH, TBLANK, TSBLANK, TRSUB, TRSUP, 70 TCSUB, TCSUP, TLSUB, TLSUP, TGT, 71 TLT, TAND, TOR, TINTERSECT, TUNION, 72 TNEWLINE, TBINOM, TFROM, TTO, TINT, 73 TSUM, TOPER, TABS, TSQRT, TFACT, 74 TNROOT, TOVER, TTIMES, TGE, TLE, 75 TGG, TLL, TDOTSAXIS, TDOTSLOW, TDOTSVERT, 76 TDOTSDIAG, TDOTSUP, TDOTSDOWN, TACUTE, TBAR, 77 TBREVE, TCHECK, TCIRCLE, TDOT, TDDOT, 78 TDDDOT, TGRAVE, THAT, TTILDE, TVEC, 79 TUNDERLINE, TOVERLINE, TOVERSTRIKE, TITALIC, TNITALIC, 80 TBOLD, TNBOLD, TPHANTOM, TFONT, TSIZE, 81 TCOLOR, TALIGNL, TALIGNC, TALIGNR, TLEFT, 82 TRIGHT, TLANGLE, TLBRACE, TLLINE, TLDLINE, 83 TLCEIL, TLFLOOR, TNONE, TMLINE, TRANGLE, 84 TRBRACE, TRLINE, TRDLINE, TRCEIL, TRFLOOR, 85 TSIN, TCOS, TTAN, TCOT, TFUNC, 86 TSTACK, TMATRIX, TMATFORM, TDPOUND, TPLACE, 87 TTEXT, TNUMBER, TCHARACTER, TIDENT, TNEQ, 88 TEQUIV, TDEF, TPROP, TSIM, TSIMEQ, 89 TAPPROX, TPARALLEL, TORTHO, TIN, TNOTIN, 90 TSUBSET, TSUBSETEQ, TSUPSET, TSUPSETEQ, TPLUSMINUS, 91 TMINUSPLUS, TOPLUS, TOMINUS, TDIV, TOTIMES, 92 TODIVIDE, TTRANSL, TTRANSR, TIINT, TIIINT, 93 TLINT, TLLINT, TLLLINT, TPROD, TCOPROD, 94 TFORALL, TEXISTS, TLIM, TNABLA, TTOWARD, 95 TSINH, TCOSH, TTANH, TCOTH, TASIN, 96 TACOS, TATAN, TLN, TLOG, TUOPER, 97 TBOPER, TBLACK, TWHITE, TRED, TGREEN, 98 TBLUE, TCYAN, TMAGENTA, TYELLOW, TFIXED, 99 TSANS, TSERIF, TPOINT, TASINH, TACOSH, 100 TATANH, TACOTH, TACOT, TEXP, TCDOT, 101 TODOT, TLESLANT, TGESLANT, TNSUBSET, TNSUPSET, 102 TNSUBSETEQ, TNSUPSETEQ, TPARTIAL, TNEG, TNI, 103 TBACKEPSILON, TALEPH, TIM, TRE, TWP, 104 TEMPTYSET, TINFINITY, TESCAPE, TLIMSUP, TLIMINF, 105 TNDIVIDES, TDRARROW, TDLARROW, TDLRARROW, TUNDERBRACE, 106 TOVERBRACE, TCIRC, TTOP, THBAR, TLAMBDABAR, 107 TLEFTARROW, TRIGHTARROW, TUPARROW, TDOWNARROW, TDIVIDES, 108 TNDIBVIDES, TSETN, TSETZ, TSETQ, TSETR, 109 TSETC, TWIDEVEC, TWIDETILDE, TWIDEHAT, TWIDESLASH, 110 TWIDEBACKSLASH, TLDBRACKET, TRDBRACKET, TNOSPACE, 111 TUNKNOWN, TDEBUG 112 }; 113 114 115 struct SmToken 116 { 117 118 String aText; // token text 119 SmTokenType eType; // token info 120 sal_Unicode cMathChar; 121 122 // parse-help info 123 sal_uLong nGroup; 124 sal_uInt16 nLevel; 125 126 // token position 127 sal_uInt16 nRow; 128 xub_StrLen nCol; 129 130 SmToken(); 131 }; 132 133 134 enum SmParseError 135 { 136 PE_NONE, PE_UNEXPECTED_END_OF_INPUT, 137 PE_UNEXPECTED_CHAR, PE_UNEXPECTED_TOKEN, 138 PE_FUNC_EXPECTED, PE_UNOPER_EXPECTED, 139 PE_BINOPER_EXPECTED, PE_SYMBOL_EXPECTED, 140 PE_IDENTIFIER_EXPECTED, PE_POUND_EXPECTED, 141 PE_COLOR_EXPECTED, PE_LGROUP_EXPECTED, 142 PE_RGROUP_EXPECTED, PE_LBRACE_EXPECTED, 143 PE_RBRACE_EXPECTED, PE_PARENT_MISMATCH, 144 PE_RIGHT_EXPECTED, PE_FONT_EXPECTED, 145 PE_SIZE_EXPECTED, PE_DOUBLE_ALIGN, 146 PE_DOUBLE_SUBSUPSCRIPT 147 }; 148 149 150 struct SmErrorDesc 151 { 152 SmParseError Type; 153 SmNode *pNode; 154 String Text; 155 }; 156 157 158 DECLARE_STACK(SmNodeStack, SmNode *) 159 DECLARE_LIST(SmErrDescList, SmErrorDesc *) 160 161 /**************************************************************************/ 162 163 // defines possible conversions of the formula text from the format of 164 // one release to the one of another. 165 enum SmConvert 166 { 167 CONVERT_NONE, 168 CONVERT_40_TO_50, 169 CONVERT_50_TO_60, 170 CONVERT_60_TO_50 171 }; 172 173 174 class SmParser 175 { 176 String m_aBufferString; 177 SmToken m_aCurToken; 178 SmNodeStack m_aNodeStack; 179 SmErrDescList m_aErrDescList; 180 int m_nCurError; 181 LanguageType m_nLang; 182 xub_StrLen m_nBufferIndex, 183 m_nTokenIndex; 184 sal_uInt16 m_Row, 185 m_nColOff; 186 SmConvert m_eConversion; 187 sal_Bool m_bImportSymNames, 188 m_bExportSymNames; 189 190 // map of used symbols (used to reduce file size by exporting only actually used symbols) 191 std::set< rtl::OUString > m_aUsedSymbols; 192 193 // declare copy-constructor and assignment-operator private 194 SmParser(const SmParser &); 195 SmParser & operator = (const SmParser &); 196 197 protected: 198 #if OSL_DEBUG_LEVEL 199 sal_Bool IsDelimiter( const String &rTxt, xub_StrLen nPos ); 200 #endif 201 void NextToken(); 202 xub_StrLen GetTokenIndex() const { return m_nTokenIndex; } 203 void Insert(const String &rText, sal_uInt16 nPos); 204 void Replace( sal_uInt16 nPos, sal_uInt16 nLen, const String &rText ); 205 206 inline sal_Bool TokenInGroup(sal_uLong nGroup); 207 208 // grammar 209 void Table(); 210 void Line(); 211 void Expression(); 212 void Relation(); 213 void Sum(); 214 void Product(); 215 void SubSup(sal_uLong nActiveGroup); 216 void OpSubSup(); 217 void Power(); 218 void Blank(); 219 void Term(); 220 void Escape(); 221 void Operator(); 222 void Oper(); 223 void UnOper(); 224 void Align(); 225 void FontAttribut(); 226 void Attribut(); 227 void Font(); 228 void FontSize(); 229 void Color(); 230 void Brace(); 231 void Bracebody(sal_Bool bIsLeftRight); 232 void Function(); 233 void Binom(); 234 void Stack(); 235 void Matrix(); 236 void Special(); 237 void GlyphSpecial(); 238 // end of grammar 239 240 LanguageType GetLanguage() const { return m_nLang; } 241 void SetLanguage( LanguageType nNewLang ) { m_nLang = nNewLang; } 242 243 void Error(SmParseError Error); 244 245 void ClearUsedSymbols() { m_aUsedSymbols.clear(); } 246 void AddToUsedSymbols( const String &rSymbolName ) { m_aUsedSymbols.insert( rSymbolName ); } 247 248 public: 249 SmParser(); 250 251 SmNode *Parse(const String &rBuffer); 252 253 const String & GetText() const { return m_aBufferString; }; 254 255 SmConvert GetConversion() const { return m_eConversion; } 256 void SetConversion(SmConvert eConv) { m_eConversion = eConv; } 257 258 sal_Bool IsImportSymbolNames() const { return m_bImportSymNames; } 259 void SetImportSymbolNames(sal_Bool bVal) { m_bImportSymNames = bVal; } 260 sal_Bool IsExportSymbolNames() const { return m_bExportSymNames; } 261 void SetExportSymbolNames(sal_Bool bVal) { m_bExportSymNames = bVal; } 262 263 sal_uInt16 AddError(SmParseError Type, SmNode *pNode); 264 265 const SmErrorDesc * NextError(); 266 const SmErrorDesc * PrevError(); 267 const SmErrorDesc * GetError(sal_uInt16 i = 0xFFFF); 268 269 bool IsUsedSymbol( const String &rSymbolName ) const { return m_aUsedSymbols.find( rSymbolName ) != m_aUsedSymbols.end(); } 270 std::set< rtl::OUString > GetUsedSymbols() const { return m_aUsedSymbols; } 271 }; 272 273 274 inline sal_Bool SmParser::TokenInGroup(sal_uLong nGroup) 275 { 276 return (m_aCurToken.nGroup & nGroup) ? sal_True : sal_False; 277 } 278 279 280 #endif 281 282