YCode.h

Go to the documentation of this file.
00001 /*-----------------------------------------------------------*- c++ -*-\
00002 |                                                                      |
00003 |                      __   __    ____ _____ ____                      |
00004 |                      \ \ / /_ _/ ___|_   _|___ \                     |
00005 |                       \ V / _` \___ \ | |   __) |                    |
00006 |                        | | (_| |___) || |  / __/                     |
00007 |                        |_|\__,_|____/ |_| |_____|                    |
00008 |                                                                      |
00009 |                               core system                            |
00010 |                                                        (C) SuSE GmbH |
00011 \----------------------------------------------------------------------/
00012 
00013    File:        YCode.h
00014 
00015    Author:      Klaus Kaempf <kkaempf@suse.de>
00016    Maintainer:  Klaus Kaempf <kkaempf@suse.de>
00017 
00018 /-*/
00019 // -*- c++ -*-
00020 
00021 #ifndef YCode_h
00022 #define YCode_h
00023 
00024 #include <string>
00025 using std::string;
00026 
00027 // MemUsage.h defines/undefines D_MEMUSAGE
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         // [1] Constants        (-> YCPValue, except(!) term -> yeLocale)
00063         ycVoid, ycBoolean, ycInteger, ycFloat,  // constants
00064         ycString, ycByteblock, ycPath, ycSymbol,
00065         ycList,                                 // list
00066         ycMap,                                  // map
00067         ycTerm,                                 // term
00068 
00069         ycEntry,
00070 
00071         ycConstant,             // -- placeholder --
00072         ycLocale,                               // locale constant (gettext)
00073         ycFunction,                             // a function definition (parameters and body)
00074 
00075         // [16] Expressions     (-> declaration_t + values)
00076         yePropagate,            // type propagation (value, type)
00077         yeUnary,                // unary (prefix) operator
00078         yeBinary,               // binary (infix) operator
00079         yeTriple,               // <exp> ? <exp> : <exp>
00080         yeCompare,              // compare
00081 
00082         // [21] Value expressions (-> values + internal)
00083         yeLocale,               // locale expression (ngettext)
00084         yeList,                 // list expression
00085         yeMap,                  // map expression
00086         yeTerm,                 // <name> ( ...)
00087         yeIs,                   // is()
00088         yeBracket,              // <name> [ <expr>, ... ] : <expr>
00089 
00090         // [27] Block (-> linked list of statements)
00091         yeBlock,                // block expression
00092         yeReturn,               // quoted expression, e.g. "``(<exp>)" which really is "{ return <exp>; }"
00093 
00094         // [29] Symbolref (-> SymbolEntry)
00095         yeVariable,             // variable ref
00096         yeBuiltin,              // builtin ref + args
00097         yeFunction,             // function ref + args
00098         yeReference,            // reference to a variable (identical to yeVariable but with different semantics)
00099         // SuSE Linux v9.2
00100         yeFunctionPointer,      // function pointer
00101 
00102         yeExpression,           // -- placeholder --
00103 
00104         // [35] Statements      (-> YCode + next)
00105         ysTypedef,              // typedef
00106         ysVariable,             // variable defintion (-> YSAssign)
00107         ysFunction,             // function definition
00108         ysAssign,               // variable assignment (-> YSAssign)
00109         ysBracket,              // <name> [ <expr>, ... ] = <expr>
00110         ysIf,                   // if, then, else
00111         ysWhile,                // while () do ...
00112         ysDo,                   // do ... while ()
00113         ysRepeat,               // repeat ... until ()
00114         ysExpression,           //  any expression (function call)
00115         ysReturn,               // return
00116         ysBreak,                // break
00117         ysContinue,             // continue
00118         ysTextdomain,           // textdomain
00119         ysInclude,              // include
00120         ysFilename,             //  restore filename after include
00121         ysImport,               // import
00122         ysBlock,                // a block as statement
00123         ysSwitch,               // switch (since 10.0)
00124         ysStatement             // [54] -- placeholder --
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;           // constant (not allowed in union :-( )
00206 public:
00207     YConst (ykind kind, YCPValue value);                // Constant
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;               // the string to be translated
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;     // keep every textdomain only once
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     // array of formal arguments of a function
00279     // the formal parameters must be available in the local scope during parse
00280     // of the function body (startDefinition()) and removed afterwards (endDefintion()).
00281     // Keep track of the table entries in this block.
00282     //
00283     // When calling a function during execution, the actual
00284     // arguments (values) are bound to the formal arguments
00285     // (this array) so the function body can be evaluated.
00286     // @see YEFunction::attachActualParameter()
00287     //
00288     // if NULL, it's a (void) function
00289     YBlockPtr m_declaration;
00290 
00291     // the function definition ('body') is the block defining this function
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     // access to formal parameters
00303     unsigned int parameterCount () const;
00304     YBlockPtr declaration () const;
00305     SymbolEntryPtr parameter (unsigned int position) const;
00306 
00307     // access to definition block (= 0 if declaration only)
00308     YBlockPtr definition () const;
00309     void setDefinition (YBlockPtr body);
00310     // read definition from stream
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

Generated on Tue Nov 6 01:20:21 2007 for yast2-core by  doxygen 1.5.0