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