~ubuntu-branches/ubuntu/wily/opencollada/wily-proposed

« back to all changes in this revision

Viewing changes to Externals/MathMLSolver/include/MathMLStreamParser.h

  • Committer: Package Import Robot
  • Author(s): Matteo F. Vescovi
  • Date: 2015-05-14 17:23:27 UTC
  • Revision ID: package-import@ubuntu.com-20150514172327-f862u8envms01fra
Tags: upstream-0.1.0~20140703.ddf8f47+dfsg1
ImportĀ upstreamĀ versionĀ 0.1.0~20140703.ddf8f47+dfsg1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
Copyright (c) 2007 netAllied GmbH, Tettnang
 
3
 
 
4
Permission is hereby granted, free of charge, to any person
 
5
obtaining a copy of this software and associated documentation
 
6
files (the "Software"), to deal in the Software without
 
7
restriction, including without limitation the rights to use,
 
8
copy, modify, merge, publish, distribute, sublicense, and/or sell
 
9
copies of the Software, and to permit persons to whom the
 
10
Software is furnished to do so, subject to the following
 
11
conditions:
 
12
 
 
13
The above copyright notice and this permission notice shall be
 
14
included in all copies or substantial portions of the Software.
 
15
 
 
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
17
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 
18
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
19
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 
20
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 
21
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
22
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 
23
OTHER DEALINGS IN THE SOFTWARE.
 
24
******************************************************************************/
 
25
 
 
26
#ifndef __MATHML_STREAM_PARSER_H__
 
27
#define __MATHML_STREAM_PARSER_H__
 
28
 
 
29
#include "MathMLSolverPrerequisites.h"
 
30
#include <libxml/xmlreader.h>
 
31
#include "MathMLStreamParserHandler.h"
 
32
#include "MathMLASTConstantExpression.h"
 
33
 
 
34
#include <stack>
 
35
 
 
36
namespace MathML
 
37
{
 
38
    /** String representation for enum State::STATE_EMPTY. */
 
39
    const static String STATE_EMPTY_VALUE = "";
 
40
    /** String representation for enum State::STATE_INVALID. */
 
41
    const static String STATE_INVALID_VALUE = "state_invalid";
 
42
    /** String representation for enum State::STATE_DOCUMENT. */
 
43
    const static String STATE_DOCUMENT_VALUE = "document";
 
44
    /** String representation for enum State::STATE_MATH. */
 
45
    const static String STATE_MATH_VALUE = "math";
 
46
 
 
47
 
 
48
    /** Parses a MathML file and creates an AST.
 
49
    */
 
50
 
 
51
    class _MATHML_SOLVER_EXPORT StreamParser : public StreamParserHandler
 
52
    {
 
53
 
 
54
    public:
 
55
        /** States for parsing. */
 
56
        enum State
 
57
        {
 
58
            STATE_EMPTY,
 
59
            STATE_INVALID,
 
60
 
 
61
            STATE_DOCUMENT,
 
62
            STATE_MATH,
 
63
            STATE_APPLY,
 
64
            STATE_DECLARE,
 
65
            STATE_CN,
 
66
            STATE_CN_RATIONAL,
 
67
            STATE_CI,
 
68
            STATE_CSYMBOL
 
69
        };
 
70
 
 
71
 
 
72
        /** Type definition for a stack of node lists. */
 
73
        typedef std::stack<AST::NodeList*> NodeListStack;
 
74
        /** Type definition for a stack of operator strings. */
 
75
        typedef std::stack<String> OperatorStack;
 
76
        /** Type definition for a stack of states. */
 
77
        typedef std::stack<State> StateStack;
 
78
 
 
79
    private:
 
80
 
 
81
        /** The file path/url. */
 
82
        String mFile;
 
83
 
 
84
        /** NodeList stack. */
 
85
        NodeListStack mStackNodeList;
 
86
 
 
87
        /** Operator stack. */
 
88
        OperatorStack mStackOperator;
 
89
 
 
90
        /** State stack. */
 
91
        StateStack mStackState;
 
92
 
 
93
        /** FLAG for storing variable names for evaluating. */
 
94
        bool mStoreVariables;
 
95
 
 
96
        /** FLAG for APPLY check for operator (element). */
 
97
        bool mApplyOperatorChecked;
 
98
 
 
99
 
 
100
        /** The parser handler for notification. */
 
101
        MathML::ParserHandler* mParserHandler;
 
102
        /** Temporary list of variable names. */
 
103
        ParserHandler::VariableList mVariableList;
 
104
 
 
105
    public:
 
106
        /** C-tor. */
 
107
        StreamParser( MathML::ParserHandler* handler );
 
108
 
 
109
        /** D-tor. */
 
110
        virtual ~StreamParser();
 
111
 
 
112
        /** Getter for path/url of parsing document. */
 
113
        virtual const String& getFile();
 
114
 
 
115
        /** Methode for starting a parse-process.
 
116
        @param fileName The string of a file path or url.
 
117
        */
 
118
        virtual void parse( const String& fileName );
 
119
 
 
120
    public:
 
121
        /** Parsing a string to a State representation.
 
122
        @param name The string to retrieve the mapped state representation for.
 
123
        @return The state representation. STATE_INVALID is returned if no valid
 
124
        state could be found.
 
125
        */
 
126
        static State parseState( const String& name );
 
127
        /** Retrieving the string representation for a given state.
 
128
        @param state The state to retrieve the mapped string representation for.
 
129
        @return The string representation. The constant STATE_INVALID_VALUE is
 
130
        returned if no valid string representation could be found.
 
131
        */
 
132
        static const String& stateToString( State state );
 
133
 
 
134
 
 
135
    public:
 
136
        //overwriting of default stream parser handler method interested in.
 
137
 
 
138
        //see IStreamParserHandler::handleTypeNone( xmlTextReaderPtr& );
 
139
        virtual void handleTypeNone( xmlTextReaderPtr& reader );
 
140
 
 
141
        //see IStreamParserHandler::handleTypeElement( xmlTextReaderPtr& );
 
142
        virtual void handleTypeElement( xmlTextReaderPtr& reader );
 
143
 
 
144
        //see IStreamParserHandler::handleTypeAttribute( xmlTextReaderPtr& );
 
145
        //virtual void handleTypeAttribute( xmlTextReaderPtr& reader );
 
146
 
 
147
        //see IStreamParserHandler::handleTypeText( xmlTextReaderPtr& );
 
148
        virtual void handleTypeText( xmlTextReaderPtr& reader );
 
149
 
 
150
        //see IStreamParserHandler::handleTypeCData( xmlTextReaderPtr& );
 
151
        //virtual void handleTypeCData( xmlTextReaderPtr& reader );
 
152
 
 
153
        //see IStreamParserHandler::handleTypeEntityReference( xmlTextReaderPtr& );
 
154
        //virtual void handleTypeEntityReference( xmlTextReaderPtr& reader );
 
155
 
 
156
        //see IStreamParserHandler::handleTypeEntity( xmlTextReaderPtr& );
 
157
        //virtual void handleTypeEntity( xmlTextReaderPtr& reader );
 
158
 
 
159
        //see IStreamParserHandler::handleTypeProcessingInstruction( xmlTextReaderPtr& );
 
160
        //virtual void handleTypeProcessingInstruction( xmlTextReaderPtr& reader );
 
161
 
 
162
        //see IStreamParserHandler::handleTypeComment( xmlTextReaderPtr& );
 
163
        //virtual void handleTypeComment( xmlTextReaderPtr& reader );
 
164
 
 
165
        //see IStreamParserHandler::handleTypeDocument( xmlTextReaderPtr& );
 
166
        //virtual void handleTypeDocument( xmlTextReaderPtr& reader );
 
167
 
 
168
        //see IStreamParserHandler::handleTypeDocumentType( xmlTextReaderPtr& );
 
169
        //virtual void handleTypeDocumentType( xmlTextReaderPtr& reader );
 
170
 
 
171
        //see IStreamParserHandler::handleTypeDocumentFragment( xmlTextReaderPtr& );
 
172
        //virtual void handleTypeDocumentFragment( xmlTextReaderPtr& reader );
 
173
 
 
174
        //see IStreamParserHandler::handleTypeNotation( xmlTextReaderPtr& );
 
175
        //virtual void handleTypeNotation( xmlTextReaderPtr& reader );
 
176
 
 
177
        //see IStreamParserHandler::handleTypeWhitespace( xmlTextReaderPtr& );
 
178
        //virtual void handleTypeWhitespace( xmlTextReaderPtr& reader );
 
179
 
 
180
        //see IStreamParserHandler::handleTypeSignificantWhitespace( xmlTextReaderPtr& );
 
181
        //virtual void handleTypeSignificantWhitespace( xmlTextReaderPtr& reader );
 
182
 
 
183
        //see IStreamParserHandler::handleTypeEndElement( xmlTextReaderPtr& );
 
184
        virtual void handleTypeEndElement( xmlTextReaderPtr& reader );
 
185
 
 
186
        //see IStreamParserHandler::handleTypeEndEntity( xmlTextReaderPtr& );
 
187
        //virtual void handleTypeEndEntity( xmlTextReaderPtr& reader );
 
188
 
 
189
        //see IStreamParserHandler::handleTypeXMLDeclaration( xmlTextReaderPtr& );
 
190
        //virtual void handleTypeXMLDeclaration( xmlTextReaderPtr& reader )
 
191
 
 
192
 
 
193
    private:
 
194
        /** Getter for retrieving the parser handler. */
 
195
        virtual MathML::ParserHandler* getParserHandler();
 
196
 
 
197
        /** Main methode for handling the current xml node read from stream. */
 
198
        virtual void processNode ( xmlTextReaderPtr& reader );
 
199
 
 
200
        /** Handle current node and its subtree.
 
201
        */
 
202
        virtual int handleSubTree( xmlTextReaderPtr& reader );
 
203
 
 
204
 
 
205
        /** Method for finding element by id.
 
206
        @param reader The reader pointing to the current node in the xml stream.
 
207
        @param elementId The id to search for.
 
208
        @result 1 == success; -1 == error; 0 == not found
 
209
        */
 
210
        int findNodeById( xmlTextReaderPtr& reader, const String& elementId );
 
211
 
 
212
    private:
 
213
        /** Push new created AST-Node to current list of operands in the stack.
 
214
        @par Is stack empty the handler is notificated, otherwise node is stored as operand.
 
215
        */
 
216
        virtual void pushToListOrResult ( AST::NodePtr node );
 
217
                virtual void pushToListOrResult ( AST::INode* node );
 
218
 
 
219
    private:
 
220
        //-------------------------------------------------------------------------------------------
 
221
        //--- MATHML handling methods ---------------------------------------------------------------
 
222
        //-------------------------------------------------------------------------------------------
 
223
 
 
224
        /** Handling start of mathml apply-elements.
 
225
              @param reader The reader pointing to the node representing the xml-element.
 
226
              */
 
227
        virtual void handleElementApplyStart ( xmlTextReaderPtr& reader );
 
228
        /** Handling end of mathml apply-elements.
 
229
              @param reader The reader pointing to the node representing the xml-element.
 
230
              */
 
231
        virtual void handleElementApplyEnd ( xmlTextReaderPtr& reader );
 
232
 
 
233
        /** Handling start of mathml declare-elements.
 
234
        @param reader The reader pointing to the node representing the xml-element.
 
235
        */
 
236
        virtual void handleElementDeclareStart ( xmlTextReaderPtr& reader );
 
237
        /** Handling end of mathml declare-elements.
 
238
        @param reader The reader pointing to the node representing the xml-element.
 
239
        */
 
240
        virtual void handleElementDeclareEnd ( xmlTextReaderPtr& reader );
 
241
 
 
242
        /** Handling start of mathml cn-elements.
 
243
              @param reader The reader pointing to the node representing the xml-element.
 
244
              */
 
245
        virtual void handleElementCNStart( xmlTextReaderPtr& reader );
 
246
        /** Handling end of mathml cn-elements.
 
247
              @param reader The reader pointing to the node representing the xml-element.
 
248
              */
 
249
        virtual void handleElementCNEnd( xmlTextReaderPtr& reader );
 
250
 
 
251
        /** Handling start of mathml ci-elements.
 
252
              @param reader The reader pointing to the node representing the xml-element.
 
253
              */
 
254
        virtual void handleElementCIStart( xmlTextReaderPtr& reader );
 
255
        /** Handling end of mathml ci-elements.
 
256
              @param reader The reader pointing to the node representing the xml-element.
 
257
              */
 
258
        virtual void handleElementCIEnd( xmlTextReaderPtr& reader );
 
259
 
 
260
        /** Handling start of mathml csymbo-elements.
 
261
        @param reader The reader pointing to the node representing the xml-element.
 
262
        */
 
263
        virtual void handleElementCSymbolStart( xmlTextReaderPtr& reader );
 
264
        /** Handling end of mathml csymbo-elements.
 
265
        @param reader The reader pointing to the node representing the xml-element.
 
266
        */
 
267
        virtual void handleElementCSymbolEnd( xmlTextReaderPtr& reader );
 
268
 
 
269
        /** Handling start of mathml logbase-elements.
 
270
              @param reader The reader pointing to the node representing the xml-element.
 
271
              */
 
272
        virtual void handleElementLogbaseStart( xmlTextReaderPtr& reader );
 
273
        /** Handling end of mathml logbase-elements.
 
274
              @param reader The reader pointing to the node representing the xml-element.
 
275
        @todo: handle something other than AST::ConstantExpression
 
276
              */
 
277
        virtual void handleElementLogbaseEnd( xmlTextReaderPtr& reader );
 
278
 
 
279
        /** Handling start of mathml pi-elements.
 
280
              @param reader The reader pointing to the node representing the xml-element.
 
281
              */
 
282
        virtual void handleElementPIStart( xmlTextReaderPtr& reader );
 
283
        /** Handling end of mathml pi-elements.
 
284
              @param reader The reader pointing to the node representing the xml-element.
 
285
              */
 
286
        virtual void handleElementPIEnd( xmlTextReaderPtr& reader );
 
287
 
 
288
        /** Handling start of mathml exponential-elements.
 
289
              @param reader The reader pointing to the node representing the xml-element.
 
290
              */
 
291
        virtual void handleElementExponentialeStart( xmlTextReaderPtr& reader );
 
292
        /** Handling end of mathml exponential-elements.
 
293
              @param reader The reader pointing to the node representing the xml-element.
 
294
              */
 
295
        virtual void handleElementExponentialeEnd( xmlTextReaderPtr& reader );
 
296
 
 
297
        /** Handling start of mathml true-elements.
 
298
              @param reader The reader pointing to the node representing the xml-element.
 
299
              */
 
300
        virtual void handleElementTrueStart( xmlTextReaderPtr& reader );
 
301
        /** Handling end of mathml true-elements.
 
302
              @param reader The reader pointing to the node representing the xml-element.
 
303
              */
 
304
        virtual void handleElementTrueEnd( xmlTextReaderPtr& reader );
 
305
 
 
306
        /** Handling start of mathml false-elements.
 
307
              @param reader The reader pointing to the node representing the xml-element.
 
308
              */
 
309
        virtual void handleElementFalseStart( xmlTextReaderPtr& reader );
 
310
        /** Handling end of mathml false-elements.
 
311
              @param reader The reader pointing to the node representing the xml-element.
 
312
              */
 
313
        virtual void handleElementFalseEnd( xmlTextReaderPtr& reader );
 
314
 
 
315
    private:
 
316
        /** Handling of unary operations.
 
317
        @param operatorOrFunction The operator or function name.
 
318
        @param nodes The nodeslist of operand(s).
 
319
        */
 
320
        AST::NodePtr StreamParser::handleUnaryOperation( const String& operatorOrFunction, AST::NodeList* nodes );
 
321
 
 
322
        /** Handling of binary operations.
 
323
        @param operatorOrFunction The operator or function name.
 
324
        @param nodes The nodeslist of operands.
 
325
        */
 
326
        AST::NodePtr StreamParser::handleBinaryOperation( const String& operatorOrFunction, AST::NodeList* nodes );
 
327
 
 
328
        /** Handling of multi operand operations.
 
329
        @param operatorOrFunction The operator or function name.
 
330
        @param nodes The nodeslist of operands.
 
331
        */
 
332
        AST::NodePtr StreamParser::handleMultiOperandOperation( const String& operatorOrFunction, AST::NodeList* nodes );
 
333
 
 
334
        /** todo: description */
 
335
        virtual String getContainer( const String& url );
 
336
        /** todo: description */
 
337
        virtual String getId( const String& url );
 
338
 
 
339
    };
 
340
 
 
341
} //namespace MathML
 
342
 
 
343
#endif //__MATHML_STREAM_PARSER_H__