1 /* "CodeWorker":	a scripting language for parsing and generating text.
2 
3 Copyright (C) 1996-1997, 1999-2002 C�dric Lemaire
4 
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9 
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 
19 To contact the author: codeworker@free.fr
20 */
21 
22 #ifndef _ExprScriptExpression_h_
23 #define _ExprScriptExpression_h_
24 
25 #include <string>
26 #include <list>
27 #include <map>
28 
29 namespace CodeWorker {
30 	enum EXPRESSION_RETURN_TYPE {
31 		NO_TYPE,
32 		BOOL_TYPE,
33 		INT_TYPE,
34 		DOUBLE_TYPE,
35 		STRING_TYPE,
36 		ULONG_TYPE,
37 		USHORT_TYPE,
38 		TREE_TYPE,
39 		ALIEN_TYPE
40 	};
41 
42 	class DtaScriptVariable;
43 	class ExprScriptVariable;
44 	class DtaScript;
45 	class CppCompilerEnvironment;
46 
47 	class ExprScriptExpression {
48 	protected:
ExprScriptExpression()49 		ExprScriptExpression() {}
50 
51 	public:
52 		virtual ~ExprScriptExpression();
isAFunctionExpression()53 		virtual bool isAFunctionExpression() const { return false; }
54 		virtual std::string getValue(DtaScriptVariable& visibility) const = 0;
55 		virtual double getDoubleValue(DtaScriptVariable& visibility) const;
56 		virtual int getIntValue(DtaScriptVariable& visibility) const;
57 		virtual DtaScriptVariable* getReferencedVariable() const;
58 
59 		virtual ExprScriptExpression* clone() const;
60 
61 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
62 		virtual bool compileCppBoolean(CppCompilerEnvironment& theCompilerEnvironment, bool bNegative) const;
63 		virtual bool compileCppInt(CppCompilerEnvironment& theCompilerEnvironment) const;
64 		virtual bool compileCppDouble(CppCompilerEnvironment& theCompilerEnvironment) const;
65 		virtual bool compileCppString(CppCompilerEnvironment& theCompilerEnvironment) const;
66 		virtual bool compileCppUnsignedShort(CppCompilerEnvironment& theCompilerEnvironment) const;
67 		virtual bool compileCppUnsignedLong(CppCompilerEnvironment& theCompilerEnvironment) const;
68 
69 		virtual bool compileCppExpr(CppCompilerEnvironment& theCompilerEnvironment) const;
70 
71 		virtual std::string toString() const;
72 	};
73 
74 
75 	class ExprScriptReference : public ExprScriptExpression {
76 	private:
77 		ExprScriptExpression* _pRef;
78 		DtaScriptVariable* _pVariable;
79 
80 	public:
ExprScriptReference(ExprScriptExpression * pRef)81 		ExprScriptReference(ExprScriptExpression* pRef) : _pRef(pRef), _pVariable(NULL) {}
ExprScriptReference(DtaScriptVariable * pVariable)82 		ExprScriptReference(DtaScriptVariable* pVariable) : _pRef(NULL), _pVariable(pVariable) {}
83 		virtual ~ExprScriptReference();
84 		virtual std::string getValue(DtaScriptVariable& visibility) const;
85 		virtual DtaScriptVariable* getReferencedVariable() const;
86 	};
87 
88 
89 	class ExprScriptUnaryMinus : public ExprScriptExpression {
90 	private:
91 		ExprScriptExpression* _pExpression;
92 
93 	public:
ExprScriptUnaryMinus(ExprScriptExpression * pExpression)94 		ExprScriptUnaryMinus(ExprScriptExpression* pExpression) : _pExpression(pExpression) {}
95 		virtual ~ExprScriptUnaryMinus();
96 
97 		virtual std::string getValue(DtaScriptVariable& visibility) const;
98 		virtual double getDoubleValue(DtaScriptVariable& visibility) const;
99 
100 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
101 		virtual bool compileCppDouble(CppCompilerEnvironment& theCompilerEnvironment) const;
102 
103 		virtual std::string toString() const;
104 	};
105 
106 	class ExprScriptBitwiseNot : public ExprScriptExpression {
107 	private:
108 		ExprScriptExpression* _pExpression;
109 
110 	public:
ExprScriptBitwiseNot(ExprScriptExpression * pExpression)111 		ExprScriptBitwiseNot(ExprScriptExpression* pExpression) : _pExpression(pExpression) {}
112 		virtual ~ExprScriptBitwiseNot();
113 
114 		virtual std::string getValue(DtaScriptVariable& visibility) const;
115 		virtual int getIntValue(DtaScriptVariable& visibility) const;
116 
117 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
118 		virtual bool compileCppInt(CppCompilerEnvironment& theCompilerEnvironment) const;
119 
120 		virtual std::string toString() const;
121 	};
122 
123 	class ExprScriptConstant : public ExprScriptExpression {
124 	protected:
125 		std::string _sValue;
126 
127 	public:
ExprScriptConstant()128 		ExprScriptConstant() {}
ExprScriptConstant(const char * sValue)129 		ExprScriptConstant(const char* sValue) : _sValue(sValue) {}
130 		ExprScriptConstant(bool bValue);
131 		ExprScriptConstant(int iValue);
132 		ExprScriptConstant(double dValue);
133 		virtual ~ExprScriptConstant();
134 
getConstant()135 		inline const std::string& getConstant() const { return _sValue; }
setConstant(const char * tcValue,int iLength)136 		inline void setConstant(const char* tcValue, int iLength) { _sValue.assign(tcValue, iLength); }
137 		virtual std::string getValue(DtaScriptVariable& /*visibility*/) const;
138 		virtual double getDoubleValue(DtaScriptVariable& visibility) const;
139 		virtual int getIntValue(DtaScriptVariable& visibility) const;
140 
141 		virtual ExprScriptExpression* clone() const;
142 
143 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
144 		virtual bool compileCppBoolean(CppCompilerEnvironment& theCompilerEnvironment, bool bNegative) const;
145 		virtual bool compileCppInt(CppCompilerEnvironment& theCompilerEnvironment) const;
146 		virtual bool compileCppDouble(CppCompilerEnvironment& theCompilerEnvironment) const;
147 		virtual bool compileCppString(CppCompilerEnvironment& theCompilerEnvironment) const;
148 
149 		virtual std::string toString() const;
150 	};
151 
152 
153 	class ExprScriptConstantTree : public ExprScriptExpression {
154 	private:
155 		ExprScriptExpression* _pValue;
156 		std::map<std::string, ExprScriptExpression*> _listOfAttributes;
157 		std::list<ExprScriptExpression*> _listOfItems;
158 		std::list<ExprScriptExpression*> _listOfKeys;
159 
160 	public:
ExprScriptConstantTree()161 		inline ExprScriptConstantTree() {}
162 		virtual ~ExprScriptConstantTree();
163 
164 		void setValueExpression(ExprScriptExpression* pValue);
165 		void addAttribute(const std::string& sName, ExprScriptExpression* pTree);
166 		void addItem(ExprScriptExpression* pKey, ExprScriptExpression* pItem);
167 		void addItem(ExprScriptExpression* pItem);
168 		void setTree(DtaScriptVariable& visibility, DtaScriptVariable&  theVariable) const;
169 		virtual std::string getValue(DtaScriptVariable& /*visibility*/) const;
170 
171 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
172 		EXPRESSION_RETURN_TYPE compileCppInit(CppCompilerEnvironment& theCompilerEnvironment, ExprScriptVariable& theVariable) const;
173 		EXPRESSION_RETURN_TYPE compileCppInit(CppCompilerEnvironment& theCompilerEnvironment, const std::string& sVariable) const;
174 
175 		virtual std::string toString() const;
176 
177 	private:
178 		EXPRESSION_RETURN_TYPE compileCppInit(CppCompilerEnvironment& theCompilerEnvironment, const std::string& sVariable, int iDepth) const;
179 	};
180 
181 
182 	class ExprScriptResolvedVariable : public ExprScriptExpression {
183 	private:
184 		DtaScriptVariable* _pVariable;
185 
186 	public:
ExprScriptResolvedVariable(DtaScriptVariable * pVariable)187 		inline ExprScriptResolvedVariable(DtaScriptVariable* pVariable) : _pVariable(pVariable) {}
188 		virtual ~ExprScriptResolvedVariable();
189 
getVariable()190 		inline DtaScriptVariable* getVariable() const { return _pVariable; }
191 
192 		virtual std::string getValue(DtaScriptVariable& /*visibility*/) const;
193 
194 		virtual std::string toString() const;
195 	};
196 
197 
198 	class ExprScriptScriptFile : public ExprScriptExpression {
199 	private:
200 		bool _bFileName;
201 		union SCRIPT_BODY {
202 			ExprScriptExpression* _pFileName;
203 			DtaScript* _pBody;
204 		};
205 		SCRIPT_BODY script;
206 
207 	public:
ExprScriptScriptFile(ExprScriptExpression * pFileName)208 		inline ExprScriptScriptFile(ExprScriptExpression* pFileName) : _bFileName(true) { script._pFileName = pFileName; }
ExprScriptScriptFile(DtaScript * pBody)209 		inline ExprScriptScriptFile(DtaScript* pBody) : _bFileName(false) { script._pBody = pBody; }
210 		~ExprScriptScriptFile();
211 
isFileName()212 		inline bool isFileName() const { return _bFileName; }
getFileName()213 		inline ExprScriptExpression* getFileName() const { return script._pFileName; }
getBody()214 		inline DtaScript* getBody() const { return script._pBody; }
215 
release()216 		inline void release() { script._pBody = NULL; }
217 
218 		virtual std::string getValue(DtaScriptVariable& visibility) const;
219 		virtual std::string toString() const;
220 	};
221 
222 
223 	class ExprScriptAlien : public ExprScriptConstant {
224 	private:
225 		std::string _sTargetLanguage;
226 
227 	public:
ExprScriptAlien(const char * tcAlien,const std::string & sTargetLanguage)228 		ExprScriptAlien(const char* tcAlien, const std::string& sTargetLanguage) : ExprScriptConstant(tcAlien), _sTargetLanguage(sTargetLanguage) {}
229 		virtual ~ExprScriptAlien();
230 
231 		virtual std::string getValue(DtaScriptVariable& /*visibility*/) const;
232 		virtual double getDoubleValue(DtaScriptVariable& visibility) const;
233 		virtual int getIntValue(DtaScriptVariable& visibility) const;
234 
235 		virtual ExprScriptExpression* clone() const;
236 
237 		virtual EXPRESSION_RETURN_TYPE compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;
238 		virtual bool compileCppBoolean(CppCompilerEnvironment& theCompilerEnvironment, bool bNegative) const;
239 		virtual bool compileCppInt(CppCompilerEnvironment& theCompilerEnvironment) const;
240 		virtual bool compileCppDouble(CppCompilerEnvironment& theCompilerEnvironment) const;
241 		virtual bool compileCppString(CppCompilerEnvironment& theCompilerEnvironment) const;
242 
243 		virtual std::string toString() const;
244 	};
245 }
246 
247 #endif
248