Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/Initializer.h

    re4d829b rd7dc824  
    2525#include "Visitor.h"
    2626
    27 // Designation: list of designator (NameExpr, VariableExpr, and ConstantExpr) expressions that specify an object being initialized.
    28 class Designation : public BaseSyntaxNode {
    29 public:
    30         Designation( const std::list< Expression * > & designators );
    31         Designation( const Designation & other );
    32         virtual ~Designation();
    33 
    34         std::list< Expression * > & get_designators() { return designators; }
    35 
    36         virtual Designation * clone() const { return new Designation( *this ); };
    37         virtual void accept( Visitor &v ) { v.visit( this ); }
    38         virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); }
    39         virtual void print( std::ostream &os, int indent = 0 ) const;
    40 private:
    41         std::list< Expression * > designators;
    42 };
    43 
    44 const std::list<Designation *> noDesignators;
     27const std::list<Expression*> noDesignators;
    4528
    4629// Initializer: base class for object initializers (provide default values)
    4730class Initializer : public BaseSyntaxNode {
    4831  public:
     32        //      Initializer( std::string _name = std::string(""), int _pos = 0 );
    4933        Initializer( bool maybeConstructed );
    5034        Initializer( const Initializer & other );
    5135        virtual ~Initializer();
     36
     37        static std::string designator_name( Expression *designator );
     38
     39        //      void set_name( std::string newValue ) { name = newValue; }
     40        //      std::string get_name() const { return name; }
     41
     42        //      void set_pos( int newValue ) { pos = newValue; }
     43        //      int get_pos() const { return pos; }
     44        virtual void set_designators( std::list<Expression *> & ) { assert(false); }
     45        virtual std::list<Expression *> &get_designators() {
     46                assert(false);
     47                std::list<Expression *> *ret = 0; return *ret;  // never reached
     48        }
    5249
    5350        bool get_maybeConstructed() { return maybeConstructed; }
     
    5653        virtual void accept( Visitor &v ) = 0;
    5754        virtual Initializer *acceptMutator( Mutator &m ) = 0;
    58         virtual void print( std::ostream &os, int indent = 0 ) const = 0;
     55        virtual void print( std::ostream &os, int indent = 0 ) = 0;
    5956  private:
     57        //      std::string name;
     58        //      int pos;
    6059        bool maybeConstructed;
    6160};
     
    6463class SingleInit : public Initializer {
    6564  public:
    66         SingleInit( Expression *value, bool maybeConstructed = false );
     65        SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
    6766        SingleInit( const SingleInit &other );
    6867        virtual ~SingleInit();
     
    7170        void set_value( Expression *newValue ) { value = newValue; }
    7271
     72        std::list<Expression *> &get_designators() { return designators; }
     73        void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }
     74
    7375        virtual SingleInit *clone() const { return new SingleInit( *this); }
    7476        virtual void accept( Visitor &v ) { v.visit( this ); }
    7577        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    76         virtual void print( std::ostream &os, int indent = 0 ) const;
     78        virtual void print( std::ostream &os, int indent = 0 );
    7779  private:
    7880        //Constant *value;
    7981        Expression *value;      // has to be a compile-time constant
     82        std::list< Expression * > designators;
    8083};
    8184
     
    8588  public:
    8689        ListInit( const std::list<Initializer*> &initializers,
    87                           const std::list<Designation *> &designators = {}, bool maybeConstructed = false );
     90                          const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
    8891        ListInit( const ListInit & other );
    8992        virtual ~ListInit();
    9093
    91         std::list<Designation *> & get_designations() { return designations; }
    92         std::list<Initializer *> & get_initializers() { return initializers; }
     94        void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }
     95        std::list<Expression *> &get_designators() { return designators; }
     96        void set_initializers( std::list<Initializer*> &newValue ) { initializers = newValue; }
     97        std::list<Initializer*> &get_initializers() { return initializers; }
    9398
    9499        typedef std::list<Initializer*>::iterator iterator;
    95         typedef std::list<Initializer*>::const_iterator const_iterator;
    96100        iterator begin() { return initializers.begin(); }
    97101        iterator end() { return initializers.end(); }
    98         const_iterator begin() const { return initializers.begin(); }
    99         const_iterator end() const { return initializers.end(); }
    100102
    101103        virtual ListInit *clone() const { return new ListInit( *this ); }
    102104        virtual void accept( Visitor &v ) { v.visit( this ); }
    103105        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    104         virtual void print( std::ostream &os, int indent = 0 ) const;
     106        virtual void print( std::ostream &os, int indent = 0 );
    105107  private:
    106         std::list<Initializer *> initializers;  // order *is* important
    107         std::list<Designation *> designations;  // order/length is consistent with initializers
     108        std::list<Initializer*> initializers;  // order *is* important
     109        std::list<Expression *> designators;
    108110};
    109111
     
    128130        virtual void accept( Visitor &v ) { v.visit( this ); }
    129131        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    130         virtual void print( std::ostream &os, int indent = 0 ) const;
     132        virtual void print( std::ostream &os, int indent = 0 );
    131133
    132134  private:
     
    138140};
    139141
    140 std::ostream & operator<<( std::ostream & out, const Initializer * init );
    141 std::ostream & operator<<( std::ostream & out, const Designation * des );
     142std::ostream & operator<<( std::ostream & out, Initializer * init );
    142143
    143144#endif // INITIALIZER_H
Note: See TracChangeset for help on using the changeset viewer.