xref: /trunk/main/starmath/inc/parse.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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();
GetTokenIndex() const204     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 
GetLanguage() const242     LanguageType    GetLanguage() const { return m_nLang; }
SetLanguage(LanguageType nNewLang)243     void            SetLanguage( LanguageType nNewLang ) { m_nLang = nNewLang; }
244 
245     void    Error(SmParseError Error);
246 
ClearUsedSymbols()247     void    ClearUsedSymbols()                              { m_aUsedSymbols.clear(); }
AddToUsedSymbols(const String & rSymbolName)248     void    AddToUsedSymbols( const String &rSymbolName )   { m_aUsedSymbols.insert( rSymbolName ); }
249 
250 public:
251                  SmParser();
252 
253     SmNode      *Parse(const String &rBuffer);
254 
GetText() const255     const String & GetText() const { return m_aBufferString; };
256 
GetConversion() const257     SmConvert    GetConversion() const              { return m_eConversion; }
SetConversion(SmConvert eConv)258     void         SetConversion(SmConvert eConv)     { m_eConversion = eConv; }
259 
IsImportSymbolNames() const260     sal_Bool     IsImportSymbolNames() const        { return m_bImportSymNames; }
SetImportSymbolNames(sal_Bool bVal)261     void         SetImportSymbolNames(sal_Bool bVal)    { m_bImportSymNames = bVal; }
IsExportSymbolNames() const262     sal_Bool     IsExportSymbolNames() const        { return m_bExportSymNames; }
SetExportSymbolNames(sal_Bool bVal)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 
IsUsedSymbol(const String & rSymbolName) const271     bool    IsUsedSymbol( const String &rSymbolName ) const { return m_aUsedSymbols.find( rSymbolName ) != m_aUsedSymbols.end(); }
GetUsedSymbols() const272     std::set< rtl::OUString >   GetUsedSymbols() const      { return m_aUsedSymbols; }
273 };
274 
275 
TokenInGroup(sal_uLong nGroup)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