parser error message modified and bug 14039 fixed
[scilab.git] / scilab / modules / ast / includes / parse / parser.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  * === LICENSE_END ===
14  *
15  */
16
17 #ifndef __PARSER_HXX__
18 #define  __PARSER_HXX__
19
20 #include <cstdio>
21 #include <iostream>
22 #include <string>
23 #include <stdlib.h>
24 #include "parse.hxx"
25
26 extern "C"
27 {
28 #include "charEncoding.h"
29 #include "sci_malloc.h"
30 #include "dynlib_ast.h"
31 }
32
33 class EXTERN_AST Parser
34 {
35 public:
36     Parser() :
37         _strict_mode(false),
38         _parse_trace(false),
39         _exit_status(Succeded),
40         _control_status(AllControlClosed),
41         _the_program(NULL)
42     {
43     }
44
45     ~Parser()
46     {
47         // Do not delete Tree here.
48     }
49
50 public:
51     enum ParserStatus
52     {
53         Succeded ,
54         Failed
55     };
56
57 public:
58     enum ControlStatus
59     {
60         AllControlClosed,
61         WithinFor,
62         WithinWhile,
63         WithinIf,
64         WithinElse,
65         WithinElseIf,
66         WithinTry,
67         WithinCatch,
68         WithinFunction,
69         WithinSelect,
70         WithinSwitch,
71         WithinCase,
72         WithinOtherwise,
73         WithinMatrix,
74         WithinCell,
75         WithinBlockComment,
76         WithinDots
77     };
78
79 public:
80     /** \brief cleanup parser internal buffers */
81     static void cleanup();
82
83     /** \brief parse the given file name */
84     void parseFile(const std::wstring& name, const std::wstring& progName);
85
86     /** \brief parse the given file command */
87     void parse(const char *command);
88     void parse(const wchar_t *command);
89
90     /** \brief enable Bison trace mode */
91     void setParseTrace(bool parseTrace)
92     {
93         _parse_trace = parseTrace;
94     }
95     bool getParseTrace(void)
96     {
97         return _parse_trace;
98     }
99
100     /** Setters / Getters
101         \{ */
102
103     ast::Exp* getTree(void)
104     {
105         return _the_program;
106     }
107     void setTree(ast::Exp* theProgram)
108     {
109         _the_program = theProgram;
110     }
111
112     ParserStatus getExitStatus(void)
113     {
114         return _exit_status;
115     }
116     void setExitStatus(ParserStatus exit_status)
117     {
118         _exit_status = exit_status;
119     }
120
121     ControlStatus getControlStatus(void)
122     {
123         return _control_status;
124     }
125     void setControlStatus(ControlStatus controlStatus)
126     {
127         _control_status = controlStatus;
128     }
129
130     wchar_t *getErrorMessage(void)
131     {
132         return const_cast<wchar_t *>(_error_message.c_str());
133     }
134     void setErrorMessage(const std::wstring& errorMessage)
135     {
136         _error_message = errorMessage;
137     }
138
139     void enableStrictMode(void)
140     {
141         _strict_mode = true;
142     }
143     void disableStrictMode(void)
144     {
145         _strict_mode = false;
146     }
147
148     void releaseTmpFile();
149     bool stopOnFirstError(void);
150     void enableStopOnFirstError(void);
151     void disableStopOnFirstError(void);
152
153     /** \} */
154
155
156 private :
157     const std::wstring _file_name;
158     const std::wstring _prog_name;
159     std::wstring _error_message;
160     bool _strict_mode;
161     bool _parse_trace;
162     ParserStatus _exit_status;
163     ControlStatus _control_status;
164     ast::Exp* _the_program;
165 };
166
167 #endif /* !__PARSER_HXX__ */
168