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     virtual std::ostream & toXml (std::ostream & str, int indent ) const = 0;
00156 
00160     virtual bool isConstant () const;
00161 
00165     bool isError () const;
00166 
00170     virtual bool isStatement () const;
00171 
00175     virtual bool isBlock () const;
00176 
00180     virtual bool isReferenceable () const;
00181 
00189     virtual YCPValue evaluate (bool cse = false);
00190 
00194   virtual constTypePtr type() const;
00195 };
00196 
00197 
00202 class YConst : public YCode
00203 {
00204     REP_BODY(YConst);
00205     ykind m_kind;
00206     YCPValue m_value;           // constant (not allowed in union :-( )
00207 public:
00208     YConst (ykind kind, YCPValue value);                // Constant
00209     YConst (ykind kind, bytecodeistream & str);
00210     ~YConst () {};
00211     YCPValue value() const;
00212     virtual ykind kind() const;
00213     string toString() const;
00214     std::ostream & toStream (std::ostream & str) const;
00215     std::ostream & toXml (std::ostream & str, int indent ) const;
00217     virtual bool isConstant () const { return true; }
00218     YCPValue evaluate (bool cse = false);
00219     constTypePtr type() const;
00220 };
00221 
00222 #include <ext/hash_map>
00223 #include <string>
00224 #include <cstddef>
00225 
00232 class YELocale;
00233 
00234 class YLocale : public YCode
00235 {
00236     REP_BODY(YLocale);
00237     const char *m_locale;               // the string to be translated
00238 
00239     struct eqstr
00240     {
00241         bool operator()(const char* s1, const char* s2) const
00242         {
00243             return strcmp(s1, s2) == 0;
00244         }
00245     };
00246 
00247 public:
00248     typedef __gnu_cxx::hash_map<const char*, bool, __gnu_cxx::hash<const char*>, eqstr> t_uniquedomains;
00249 
00250     static t_uniquedomains domains;     // keep every textdomain only once
00251     static t_uniquedomains::const_iterator setDomainStatus (const string& domain, bool status);
00252     static void ensureBindDomain (const string& domain);
00253 
00254     YLocale (const char *locale, const char *textdomain);
00255     YLocale (bytecodeistream & str);
00256     ~YLocale ();
00257     virtual ykind kind () const { return ycLocale; }
00258     const char *value () const;
00259     const char *domain () const;
00260     string toString() const;
00261     std::ostream & toStream (std::ostream & str) const;
00262     std::ostream & toXml (std::ostream & str, int indent ) const;
00263     YCPValue evaluate (bool cse = false);
00264     constTypePtr type() const { return Type::Locale; }
00265     
00266 private:
00267 
00268     t_uniquedomains::const_iterator m_domain;
00269 
00270 };
00271 
00278 class YFunction : public YCode
00279 {
00280     REP_BODY(YFunction);
00281     // array of formal arguments of a function
00282     // the formal parameters must be available in the local scope during parse
00283     // of the function body (startDefinition()) and removed afterwards (endDefintion()).
00284     // Keep track of the table entries in this block.
00285     //
00286     // When calling a function during execution, the actual
00287     // arguments (values) are bound to the formal arguments
00288     // (this array) so the function body can be evaluated.
00289     // @see YEFunction::attachActualParameter()
00290     //
00291     // if NULL, it's a (void) function
00292     YBlockPtr m_declaration;
00293 
00294     // the function definition ('body') is the block defining this function
00295     YBlockPtr m_definition;
00296 
00297     bool m_is_global;
00298 
00299 public:
00300     YFunction (YBlockPtr parameterblock, const SymbolEntryPtr entry = 0);
00301     YFunction (bytecodeistream & str);
00302     ~YFunction ();
00303     virtual ykind kind () const { return ycFunction; }
00304 
00305     // access to formal parameters
00306     unsigned int parameterCount () const;
00307     YBlockPtr declaration () const;
00308     SymbolEntryPtr parameter (unsigned int position) const;
00309 
00310     // access to definition block (= 0 if declaration only)
00311     YBlockPtr definition () const;
00312     void setDefinition (YBlockPtr body);
00313     // read definition from stream
00314     void setDefinition (bytecodeistream & str);
00315 
00316     string toStringDeclaration () const;
00317     string toString () const;
00318     std::ostream & toStreamDefinition (std::ostream & str ) const;
00319     std::ostream & toXmlDefinition (std::ostream & str, int indent ) const;
00320     std::ostream & toStream (std::ostream & str ) const;
00321     std::ostream & toXml (std::ostream & str, int indent ) const;
00322     virtual YCPValue evaluate (bool cse = false);
00323     constTypePtr type() const;
00324 };
00325 
00326 
00327 #endif   // YCode_h

Generated on Tue Nov 6 01:27:46 2007 for yast2-core by  doxygen 1.5.3