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, TSILVER, 99 TGRAY, TMAROON, TPURPLE, TLIME, TOLIVE, 100 TNAVY, TTEAL, TAQUA, TFUCHSIA, TFIXED, 101 TSANS, TSERIF, TPOINT, TASINH, TACOSH, 102 TATANH, TACOTH, TACOT, TEXP, TCDOT, 103 TODOT, TLESLANT, TGESLANT, TNSUBSET, TNSUPSET, 104 TNSUBSETEQ, TNSUPSETEQ, TPARTIAL, TNEG, TNI, 105 TBACKEPSILON, TALEPH, TIM, TRE, TWP, 106 TEMPTYSET, TINFINITY, TESCAPE, TLIMSUP, TLIMINF, 107 TNDIVIDES, TDRARROW, TDLARROW, TDLRARROW, TUNDERBRACE, 108 TOVERBRACE, TCIRC, TTOP, THBAR, TLAMBDABAR, 109 TLEFTARROW, TRIGHTARROW, TUPARROW, TDOWNARROW, TDIVIDES, 110 TNDIBVIDES, TSETN, TSETZ, TSETQ, TSETR, 111 TSETC, TWIDEVEC, TWIDETILDE, TWIDEHAT, TWIDESLASH, 112 TWIDEBACKSLASH, TLDBRACKET, TRDBRACKET, TNOSPACE, 113 TUNKNOWN, TDEBUG 114 }; 115 116 117 struct SmToken 118 { 119 120 String aText; // token text 121 SmTokenType eType; // token info 122 sal_Unicode cMathChar; 123 124 // parse-help info 125 sal_uLong nGroup; 126 sal_uInt16 nLevel; 127 128 // token position 129 sal_uInt16 nRow; 130 xub_StrLen nCol; 131 132 SmToken(); 133 }; 134 135 136 enum SmParseError 137 { 138 PE_NONE, PE_UNEXPECTED_END_OF_INPUT, 139 PE_UNEXPECTED_CHAR, PE_UNEXPECTED_TOKEN, 140 PE_FUNC_EXPECTED, PE_UNOPER_EXPECTED, 141 PE_BINOPER_EXPECTED, PE_SYMBOL_EXPECTED, 142 PE_IDENTIFIER_EXPECTED, PE_POUND_EXPECTED, 143 PE_COLOR_EXPECTED, PE_LGROUP_EXPECTED, 144 PE_RGROUP_EXPECTED, PE_LBRACE_EXPECTED, 145 PE_RBRACE_EXPECTED, PE_PARENT_MISMATCH, 146 PE_RIGHT_EXPECTED, PE_FONT_EXPECTED, 147 PE_SIZE_EXPECTED, PE_DOUBLE_ALIGN, 148 PE_DOUBLE_SUBSUPSCRIPT 149 }; 150 151 152 struct SmErrorDesc 153 { 154 SmParseError Type; 155 SmNode *pNode; 156 String Text; 157 }; 158 159 160 DECLARE_STACK(SmNodeStack, SmNode *) 161 DECLARE_LIST(SmErrDescList, SmErrorDesc *) 162 163 /**************************************************************************/ 164 165 // defines possible conversions of the formula text from the format of 166 // one release to the one of another. 167 enum SmConvert 168 { 169 CONVERT_NONE, 170 CONVERT_40_TO_50, 171 CONVERT_50_TO_60, 172 CONVERT_60_TO_50 173 }; 174 175 176 class SmParser 177 { 178 String m_aBufferString; 179 SmToken m_aCurToken; 180 SmNodeStack m_aNodeStack; 181 SmErrDescList m_aErrDescList; 182 int m_nCurError; 183 LanguageType m_nLang; 184 xub_StrLen m_nBufferIndex, 185 m_nTokenIndex; 186 sal_uInt16 m_Row, 187 m_nColOff; 188 SmConvert m_eConversion; 189 sal_Bool m_bImportSymNames, 190 m_bExportSymNames; 191 192 // map of used symbols (used to reduce file size by exporting only actually used symbols) 193 std::set< rtl::OUString > m_aUsedSymbols; 194 195 // declare copy-constructor and assignment-operator private 196 SmParser(const SmParser &); 197 SmParser & operator = (const SmParser &); 198 199 protected: 200 #if OSL_DEBUG_LEVEL 201 sal_Bool IsDelimiter( const String &rTxt, xub_StrLen nPos ); 202 #endif 203 void NextToken(); 204 xub_StrLen GetTokenIndex() const { return m_nTokenIndex; } 205 void Insert(const String &rText, sal_uInt16 nPos); 206 void Replace( sal_uInt16 nPos, sal_uInt16 nLen, const String &rText ); 207 208 inline sal_Bool TokenInGroup(sal_uLong nGroup); 209 210 // grammar 211 void Table(); 212 void Line(); 213 void Expression(); 214 void Relation(); 215 void Sum(); 216 void Product(); 217 void SubSup(sal_uLong nActiveGroup); 218 void OpSubSup(); 219 void Power(); 220 void Blank(); 221 void Term(); 222 void Escape(); 223 void Operator(); 224 void Oper(); 225 void UnOper(); 226 void Align(); 227 void FontAttribut(); 228 void Attribut(); 229 void Font(); 230 void FontSize(); 231 void Color(); 232 void Brace(); 233 void Bracebody(sal_Bool bIsLeftRight); 234 void Function(); 235 void Binom(); 236 void Stack(); 237 void Matrix(); 238 void Special(); 239 void GlyphSpecial(); 240 // end of grammar 241 242 LanguageType GetLanguage() const { return m_nLang; } 243 void SetLanguage( LanguageType nNewLang ) { m_nLang = nNewLang; } 244 245 void Error(SmParseError Error); 246 247 void ClearUsedSymbols() { m_aUsedSymbols.clear(); } 248 void AddToUsedSymbols( const String &rSymbolName ) { m_aUsedSymbols.insert( rSymbolName ); } 249 250 public: 251 SmParser(); 252 253 SmNode *Parse(const String &rBuffer); 254 255 const String & GetText() const { return m_aBufferString; }; 256 257 SmConvert GetConversion() const { return m_eConversion; } 258 void SetConversion(SmConvert eConv) { m_eConversion = eConv; } 259 260 sal_Bool IsImportSymbolNames() const { return m_bImportSymNames; } 261 void SetImportSymbolNames(sal_Bool bVal) { m_bImportSymNames = bVal; } 262 sal_Bool IsExportSymbolNames() const { return m_bExportSymNames; } 263 void SetExportSymbolNames(sal_Bool bVal) { m_bExportSymNames = bVal; } 264 265 sal_uInt16 AddError(SmParseError Type, SmNode *pNode); 266 267 const SmErrorDesc * NextError(); 268 const SmErrorDesc * PrevError(); 269 const SmErrorDesc * GetError(sal_uInt16 i = 0xFFFF); 270 271 bool IsUsedSymbol( const String &rSymbolName ) const { return m_aUsedSymbols.find( rSymbolName ) != m_aUsedSymbols.end(); } 272 std::set< rtl::OUString > GetUsedSymbols() const { return m_aUsedSymbols; } 273 }; 274 275 276 inline sal_Bool SmParser::TokenInGroup(sal_uLong nGroup) 277 { 278 return (m_aCurToken.nGroup & nGroup) ? sal_True : sal_False; 279 } 280 281 282 #endif 283