00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef YCode_h
00022 #define YCode_h
00023
00024 #include <string>
00025 using std::string;
00026
00027
00028 #include <y2util/MemUsage.h>
00029 #include "ycp/YCodePtr.h"
00030
00031 #include "ycp/YCPValue.h"
00032 #include "ycp/YCPString.h"
00033 #include "ycp/Type.h"
00034 #include "ycp/YSymbolEntry.h"
00035
00043 struct ycodelist {
00044 struct ycodelist *next;
00045 YCodePtr code;
00046 constTypePtr type;
00047 };
00048 typedef struct ycodelist ycodelist_t;
00049
00053 class YCode : public Rep
00054 #ifdef D_MEMUSAGE
00055 , public MemUsage
00056 #endif
00057 {
00058 REP_BODY(YCode);
00059 public:
00060 enum ykind {
00061 yxError = 0,
00062
00063 ycVoid, ycBoolean, ycInteger, ycFloat,
00064 ycString, ycByteblock, ycPath, ycSymbol,
00065 ycList,
00066 ycMap,
00067 ycTerm,
00068
00069 ycEntry,
00070
00071 ycConstant,
00072 ycLocale,
00073 ycFunction,
00074
00075
00076 yePropagate,
00077 yeUnary,
00078 yeBinary,
00079 yeTriple,
00080 yeCompare,
00081
00082
00083 yeLocale,
00084 yeList,
00085 yeMap,
00086 yeTerm,
00087 yeIs,
00088 yeBracket,
00089
00090
00091 yeBlock,
00092 yeReturn,
00093
00094
00095 yeVariable,
00096 yeBuiltin,
00097 yeFunction,
00098 yeReference,
00099
00100 yeFunctionPointer,
00101
00102 yeExpression,
00103
00104
00105 ysTypedef,
00106 ysVariable,
00107 ysFunction,
00108 ysAssign,
00109 ysBracket,
00110 ysIf,
00111 ysWhile,
00112 ysDo,
00113 ysRepeat,
00114 ysExpression,
00115 ysReturn,
00116 ysBreak,
00117 ysContinue,
00118 ysTextdomain,
00119 ysInclude,
00120 ysFilename,
00121 ysImport,
00122 ysBlock,
00123 ysSwitch,
00124 ysStatement
00125 };
00126
00127 public:
00128
00132 YCode ();
00133
00137 virtual ~YCode();
00138
00142 virtual ykind kind() const = 0;
00143
00147 virtual string toString() const;
00148 static string toString(ykind kind);
00149
00154 virtual std::ostream & toStream (std::ostream & str) const = 0;
00155
00159 virtual bool isConstant () const;
00160
00164 bool isError () const;
00165
00169 virtual bool isStatement () const;
00170
00174 virtual bool isBlock () const;
00175
00179 virtual bool isReferenceable () const;
00180
00188 virtual YCPValue evaluate (bool cse = false);
00189
00193 virtual constTypePtr type() const;
00194 };
00195
00196
00201 class YConst : public YCode
00202 {
00203 REP_BODY(YConst);
00204 ykind m_kind;
00205 YCPValue m_value;
00206 public:
00207 YConst (ykind kind, YCPValue value);
00208 YConst (ykind kind, bytecodeistream & str);
00209 ~YConst () {};
00210 YCPValue value() const;
00211 virtual ykind kind() const;
00212 string toString() const;
00213 std::ostream & toStream (std::ostream & str) const;
00215 virtual bool isConstant () const { return true; }
00216 YCPValue evaluate (bool cse = false);
00217 constTypePtr type() const;
00218 };
00219
00220 #include <ext/hash_map>
00221 #include <string>
00222 #include <cstddef>
00223
00230 class YELocale;
00231
00232 class YLocale : public YCode
00233 {
00234 REP_BODY(YLocale);
00235 const char *m_locale;
00236
00237 struct eqstr
00238 {
00239 bool operator()(const char* s1, const char* s2) const
00240 {
00241 return strcmp(s1, s2) == 0;
00242 }
00243 };
00244
00245 public:
00246 typedef __gnu_cxx::hash_map<const char*, bool, __gnu_cxx::hash<const char*>, eqstr> t_uniquedomains;
00247
00248 static t_uniquedomains domains;
00249 static t_uniquedomains::const_iterator setDomainStatus (const string& domain, bool status);
00250 static void ensureBindDomain (const string& domain);
00251
00252 YLocale (const char *locale, const char *textdomain);
00253 YLocale (bytecodeistream & str);
00254 ~YLocale ();
00255 virtual ykind kind () const { return ycLocale; }
00256 const char *value () const;
00257 const char *domain () const;
00258 string toString() const;
00259 std::ostream & toStream (std::ostream & str) const;
00260 YCPValue evaluate (bool cse = false);
00261 constTypePtr type() const { return Type::Locale; }
00262
00263 private:
00264
00265 t_uniquedomains::const_iterator m_domain;
00266
00267 };
00268
00275 class YFunction : public YCode
00276 {
00277 REP_BODY(YFunction);
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 YBlockPtr m_declaration;
00290
00291
00292 YBlockPtr m_definition;
00293
00294 bool m_is_global;
00295
00296 public:
00297 YFunction (YBlockPtr parameterblock, const SymbolEntryPtr entry = 0);
00298 YFunction (bytecodeistream & str);
00299 ~YFunction ();
00300 virtual ykind kind () const { return ycFunction; }
00301
00302
00303 unsigned int parameterCount () const;
00304 YBlockPtr declaration () const;
00305 SymbolEntryPtr parameter (unsigned int position) const;
00306
00307
00308 YBlockPtr definition () const;
00309 void setDefinition (YBlockPtr body);
00310
00311 void setDefinition (bytecodeistream & str);
00312
00313 string toStringDeclaration () const;
00314 string toString () const;
00315 std::ostream & toStreamDefinition (std::ostream & str) const;
00316 std::ostream & toStream (std::ostream & str) const;
00317 virtual YCPValue evaluate (bool cse = false);
00318 constTypePtr type() const;
00319 };
00320
00321
00322 #endif // YCode_h