1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
23 #include <vcl/svapp.hxx>
24 #include <tools/string.hxx>
36 //////////////////////////////////////////////////////////////////////
39 #define TGOPER 0x00000001
40 #define TGRELATION 0x00000002
41 #define TGSUM 0x00000004
42 #define TGPRODUCT 0x00000008
43 #define TGUNOPER 0x00000010
44 #define TGPOWER 0x00000020
45 #define TGATTRIBUT 0x00000040
46 #define TGALIGN 0x00000080
47 #define TGFUNCTION 0x00000100
48 #define TGBLANK 0x00000200
49 #define TGLBRACES 0x00000400
50 #define TGRBRACES 0x00000800
51 #define TGCOLOR 0x00001000
52 #define TGFONT 0x00002000
53 #define TGSTANDALONE 0x00004000
54 #define TGDISCARDED 0x00008000
55 #define TGLIMIT 0x00010000
56 #define TGFONTATTR 0x00020000
61 /* 0*/ TEND
, TLGROUP
, TRGROUP
, TLPARENT
, TRPARENT
,
62 /* 5*/ TLBRACKET
, TRBRACKET
, TPLUS
, TMINUS
, TMULTIPLY
,
63 /* 10*/ TDIVIDEBY
, TASSIGN
, TPOUND
, TSPECIAL
, TSLASH
,
64 /* 15*/ TBACKSLASH
, TBLANK
, TSBLANK
, TRSUB
, TRSUP
,
65 /* 20*/ TCSUB
, TCSUP
, TLSUB
, TLSUP
, TGT
,
66 /* 25*/ TLT
, TAND
, TOR
, TINTERSECT
, TUNION
,
67 /* 30*/ TNEWLINE
, TBINOM
, TFROM
, TTO
, TINT
,
68 /* 35*/ TSUM
, TOPER
, TABS
, TSQRT
, TFACT
,
69 /* 40*/ TNROOT
, TOVER
, TTIMES
, TGE
, TLE
,
70 /* 45*/ TGG
, TLL
, TDOTSAXIS
, TDOTSLOW
, TDOTSVERT
,
71 /* 50*/ TDOTSDIAG
, TDOTSUP
, TDOTSDOWN
, TACUTE
, TBAR
,
72 /* 55*/ TBREVE
, TCHECK
, TCIRCLE
, TDOT
, TDDOT
,
73 /* 60*/ TDDDOT
, TGRAVE
, THAT
, TTILDE
, TVEC
,
74 /* 65*/ TUNDERLINE
, TOVERLINE
, TOVERSTRIKE
, TITALIC
, TNITALIC
,
75 /* 70*/ TBOLD
, TNBOLD
, TPHANTOM
, TFONT
, TSIZE
,
76 /* 75*/ TCOLOR
, TALIGNL
, TALIGNC
, TALIGNR
, TLEFT
,
77 /* 80*/ TRIGHT
, TLANGLE
, TLBRACE
, TLLINE
, TLDLINE
,
78 /* 85*/ TLCEIL
, TLFLOOR
, TNONE
, TMLINE
, TRANGLE
,
79 /* 90*/ TRBRACE
, TRLINE
, TRDLINE
, TRCEIL
, TRFLOOR
,
80 /* 95*/ TSIN
, TCOS
, TTAN
, TCOT
, TFUNC
,
81 /*100*/ TSTACK
, TMATRIX
, TMATFORM
, TDPOUND
, TPLACE
,
82 /*105*/ TTEXT
, TNUMBER
, TCHARACTER
, TIDENT
, TNEQ
,
83 /*110*/ TEQUIV
, TDEF
, TPROP
, TSIM
, TSIMEQ
,
84 /*115*/ TAPPROX
, TPARALLEL
, TORTHO
, TIN
, TNOTIN
,
85 /*120*/ TSUBSET
, TSUBSETEQ
, TSUPSET
, TSUPSETEQ
, TPLUSMINUS
,
86 /*125*/ TMINUSPLUS
, TOPLUS
, TOMINUS
, TDIV
, TOTIMES
,
87 /*130*/ TODIVIDE
, TTRANSL
, TTRANSR
, TIINT
, TIIINT
,
88 /*135*/ TLINT
, TLLINT
, TLLLINT
, TPROD
, TCOPROD
,
89 /*140*/ TFORALL
, TEXISTS
, TNOTEXISTS
, TLIM
, TNABLA
,
90 /*145*/ TTOWARD
, TSINH
, TCOSH
, TTANH
, TCOTH
,
91 /*150*/ TASIN
, TACOS
, TATAN
, TLN
, TLOG
,
92 /*155*/ TUOPER
, TBOPER
, TBLACK
, TWHITE
, TRED
,
93 /*160*/ TGREEN
, TBLUE
, TCYAN
, TMAGENTA
, TYELLOW
,
94 /*165*/ TFIXED
, TSANS
, TSERIF
, TPOINT
, TASINH
,
95 /*170*/ TACOSH
, TATANH
, TACOTH
, TACOT
, TEXP
,
96 /*175*/ TCDOT
, TODOT
, TLESLANT
, TGESLANT
, TNSUBSET
,
97 /*180*/ TNSUPSET
, TNSUBSETEQ
, TNSUPSETEQ
, TPARTIAL
, TNEG
,
98 /*185*/ TNI
, TBACKEPSILON
, TALEPH
, TIM
, TRE
,
99 /*190*/ TWP
, TEMPTYSET
, TINFINITY
, TESCAPE
, TLIMSUP
,
100 /*195*/ TLIMINF
, TNDIVIDES
, TDRARROW
, TDLARROW
, TDLRARROW
,
101 /*200*/ TUNDERBRACE
, TOVERBRACE
, TCIRC
, TTOP
, THBAR
,
102 /*205*/ TLAMBDABAR
, TLEFTARROW
, TRIGHTARROW
, TUPARROW
, TDOWNARROW
,
103 /*210*/ TDIVIDES
, TNDIBVIDES
, TSETN
, TSETZ
, TSETQ
,
104 /*215*/ TSETR
, TSETC
, TWIDEVEC
, TWIDETILDE
, TWIDEHAT
,
105 /*220*/ TWIDESLASH
, TWIDEBACKSLASH
, TLDBRACKET
, TRDBRACKET
, TNOSPACE
,
106 /*225*/ TUNKNOWN
, TDEBUG
, TPRECEDES
, TSUCCEEDS
, TPRECEDESEQUAL
,
107 /*230*/ TSUCCEEDSEQUAL
, TPRECEDESEQUIV
, TSUCCEEDSEQUIV
, TNOTPRECEDES
, TNOTSUCCEEDS
114 OUString aText
; // token text
115 SmTokenType eType
; // token info
116 sal_Unicode cMathChar
;
127 SmToken(SmTokenType eTokenType
,
129 const sal_Char
* pText
,
130 sal_uLong nTokenGroup
= 0,
131 sal_uInt16 nTokenLevel
= 0);
137 PE_NONE
, PE_UNEXPECTED_END_OF_INPUT
,
138 PE_UNEXPECTED_CHAR
, PE_UNEXPECTED_TOKEN
,
139 PE_FUNC_EXPECTED
, PE_UNOPER_EXPECTED
,
140 PE_BINOPER_EXPECTED
, PE_SYMBOL_EXPECTED
,
141 PE_IDENTIFIER_EXPECTED
, PE_POUND_EXPECTED
,
142 PE_COLOR_EXPECTED
, PE_LGROUP_EXPECTED
,
143 PE_RGROUP_EXPECTED
, PE_LBRACE_EXPECTED
,
144 PE_RBRACE_EXPECTED
, PE_PARENT_MISMATCH
,
145 PE_RIGHT_EXPECTED
, PE_FONT_EXPECTED
,
146 PE_SIZE_EXPECTED
, PE_DOUBLE_ALIGN
,
147 PE_DOUBLE_SUBSUPSCRIPT
159 typedef ::std::stack
< SmNode
* > SmNodeStack
;
160 typedef ::std::vector
< SmErrorDesc
* > SmErrDescList
;
162 /**************************************************************************/
164 // defines possible conversions of the formula text from the format of
165 // one release to the one of another.
174 struct SmTokenTableEntry
176 const sal_Char
* pIdent
;
178 sal_Unicode cMathChar
;
185 String m_aBufferString
;
187 SmNodeStack m_aNodeStack
;
188 SmErrDescList m_aErrDescList
;
190 LanguageType m_nLang
;
191 xub_StrLen m_nBufferIndex
,
195 SmConvert m_eConversion
;
196 bool bImportSymNames
,
199 // map of used symbols (used to reduce file size by exporting only actually used symbols)
200 std::set
< OUString
> m_aUsedSymbols
;
202 //! locale where '.' is decimal separator!
203 ::com::sun::star::lang::Locale m_aDotLoc
;
205 // declare copy-constructor and assignment-operator private
206 SmParser(const SmParser
&);
207 SmParser
& operator = (const SmParser
&);
210 #if OSL_DEBUG_LEVEL > 1
211 bool IsDelimiter( const String
&rTxt
, xub_StrLen nPos
);
214 xub_StrLen
GetTokenIndex() const { return m_nTokenIndex
; }
215 void Insert(const String
&rText
, sal_uInt16 nPos
);
216 void Replace( sal_uInt16 nPos
, sal_uInt16 nLen
, const String
&rText
);
218 inline bool TokenInGroup( sal_uLong nGroup
);
227 void SubSup(sal_uLong nActiveGroup
);
243 void Bracebody(bool bIsLeftRight
);
252 LanguageType
GetLanguage() const { return m_nLang
; }
253 void SetLanguage( LanguageType nNewLang
) { m_nLang
= nNewLang
; }
255 void Error(SmParseError Error
);
257 void ClearUsedSymbols() { m_aUsedSymbols
.clear(); }
258 void AddToUsedSymbols( const String
&rSymbolName
) { m_aUsedSymbols
.insert( rSymbolName
); }
263 /** Parse rBuffer to formula tree */
264 SmNode
*Parse(const String
&rBuffer
);
265 /** Parse rBuffer to formula subtree that constitutes an expression */
266 SmNode
*ParseExpression(const OUString
&rBuffer
);
268 const String
& GetText() const { return m_aBufferString
; };
270 SmConvert
GetConversion() const { return m_eConversion
; }
271 void SetConversion(SmConvert eConv
) { m_eConversion
= eConv
; }
273 bool IsImportSymbolNames() const { return bImportSymNames
; }
274 void SetImportSymbolNames(bool bVal
) { bImportSymNames
= bVal
; }
275 bool IsExportSymbolNames() const { return m_bExportSymNames
; }
276 void SetExportSymbolNames(bool bVal
) { m_bExportSymNames
= bVal
; }
278 size_t AddError(SmParseError Type
, SmNode
*pNode
);
279 const SmErrorDesc
* NextError();
280 const SmErrorDesc
* PrevError();
281 const SmErrorDesc
* GetError(size_t i
= size_t(-1) );
282 static const SmTokenTableEntry
* GetTokenTableEntry( const String
&rName
);
283 bool IsUsedSymbol( const String
&rSymbolName
) const { return m_aUsedSymbols
.find( rSymbolName
) != m_aUsedSymbols
.end(); }
284 std::set
< OUString
> GetUsedSymbols() const { return m_aUsedSymbols
; }
288 inline bool SmParser::TokenInGroup( sal_uLong nGroup
)
290 return (m_aCurToken
.nGroup
& nGroup
) ? true : false;
296 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */