Ignore:
Timestamp:
Nov 8, 2017, 5:43:33 PM (8 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
954908d
Parents:
78315272 (diff), e35f30a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/Expression.h

    r78315272 r3f7e12cb  
    3131
    3232
    33 /// Expression is the root type for all expressions
    34 class Expression : public BaseSyntaxNode{
    35   public:
    36         Type * result;
    37         TypeSubstitution * env;
    38         Expression * argName; // if expression is used as an argument, it can be "designated" by this name
    39         bool extension = false;
    40 
    41         Expression( Expression * _aname = nullptr );
    42         Expression( const Expression & other );
    43         virtual ~Expression();
    44 
    45         Type *& get_result() { return result; }
    46         const Type * get_result() const { return result; }
    47         void set_result( Type * newValue ) { result = newValue; }
    48         bool has_result() const { return result != nullptr; }
    49 
    50         TypeSubstitution * get_env() const { return env; }
    51         void set_env( TypeSubstitution * newValue ) { env = newValue; }
    52         Expression * get_argName() const { return argName; }
    53         void set_argName( Expression * name ) { argName = name; }
    54         bool get_extension() const { return extension; }
    55         Expression * set_extension( bool exten ) { extension = exten; return this; }
    56 
    57         virtual Expression * clone() const = 0;
    58         virtual void accept( Visitor & v ) = 0;
    59         virtual Expression * acceptMutator( Mutator & m ) = 0;
    60         virtual void print( std::ostream & os, int indent = 0 ) const;
    61 };
    62 
    6333struct ParamEntry;
    6434
     
    7747        Type * actualType;
    7848        Type * formalType;
    79         Expression* expr;
     49        Expression * expr;
    8050        std::unique_ptr< InferredParams > inferParams;
     51};
     52
     53/// Expression is the root type for all expressions
     54class Expression : public BaseSyntaxNode {
     55  public:
     56        Type * result;
     57        TypeSubstitution * env;
     58        bool extension = false;
     59        InferredParams inferParams;
     60
     61        Expression();
     62        Expression( const Expression & other );
     63        virtual ~Expression();
     64
     65        Type *& get_result() { return result; }
     66        const Type * get_result() const { return result; }
     67        void set_result( Type * newValue ) { result = newValue; }
     68
     69        TypeSubstitution * get_env() const { return env; }
     70        void set_env( TypeSubstitution * newValue ) { env = newValue; }
     71        bool get_extension() const { return extension; }
     72        Expression * set_extension( bool exten ) { extension = exten; return this; }
     73
     74        InferredParams & get_inferParams() { return inferParams; }
     75
     76        virtual Expression * clone() const override = 0;
     77        virtual void accept( Visitor & v ) override = 0;
     78        virtual Expression * acceptMutator( Mutator & m ) override = 0;
     79        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    8180};
    8281
     
    8786        Expression * function;
    8887        std::list<Expression *> args;
    89         InferredParams inferParams;
    9088
    9189        ApplicationExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >() );
     
    9694        void set_function( Expression * newValue ) { function = newValue; }
    9795        std::list<Expression *>& get_args() { return args; }
    98         InferredParams & get_inferParams() { return inferParams; }
    9996
    10097        virtual ApplicationExpr * clone() const { return new ApplicationExpr( * this ); }
    10198        virtual void accept( Visitor & v ) { v.visit( this ); }
    10299        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    103         virtual void print( std::ostream & os, int indent = 0 ) const;
     100        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    104101};
    105102
     
    112109        std::list<Expression*> args;
    113110
    114         UntypedExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >(), Expression *_aname = nullptr );
     111        UntypedExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >() );
    115112        UntypedExpr( const UntypedExpr & other );
    116113        virtual ~UntypedExpr();
     
    119116        void set_function( Expression * newValue ) { function = newValue; }
    120117
    121         void set_args( std::list<Expression *> & listArgs ) { args = listArgs; }
    122118        std::list<Expression*>::iterator begin_args() { return args.begin(); }
    123119        std::list<Expression*>::iterator end_args() { return args.end(); }
     
    130126        virtual void accept( Visitor & v ) { v.visit( this ); }
    131127        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    132         virtual void print( std::ostream & os, int indent = 0 ) const;
    133         virtual void printArgs(std::ostream & os, int indent = 0) const;
     128        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    134129};
    135130
     
    139134        std::string name;
    140135
    141         NameExpr( std::string name, Expression *_aname = nullptr );
     136        NameExpr( std::string name );
    142137        NameExpr( const NameExpr & other );
    143138        virtual ~NameExpr();
     
    149144        virtual void accept( Visitor & v ) { v.visit( this ); }
    150145        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    151         virtual void print( std::ostream & os, int indent = 0 ) const;
     146        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    152147};
    153148
     
    160155        Expression * arg;
    161156
    162         AddressExpr( Expression * arg, Expression *_aname = nullptr );
     157        AddressExpr( Expression * arg );
    163158        AddressExpr( const AddressExpr & other );
    164159        virtual ~AddressExpr();
     
    170165        virtual void accept( Visitor & v ) { v.visit( this ); }
    171166        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    172         virtual void print( std::ostream & os, int indent = 0 ) const;
     167        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    173168};
    174169
     
    186181        virtual void accept( Visitor & v ) { v.visit( this ); }
    187182        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    188         virtual void print( std::ostream & os, int indent = 0 ) const;
     183        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    189184};
    190185
     
    194189        Expression * arg;
    195190
    196         CastExpr( Expression * arg, Expression *_aname = nullptr );
    197         CastExpr( Expression * arg, Type * toType, Expression *_aname = nullptr );
     191        CastExpr( Expression * arg );
     192        CastExpr( Expression * arg, Type * toType );
    198193        CastExpr( const CastExpr & other );
    199194        virtual ~CastExpr();
     
    205200        virtual void accept( Visitor & v ) { v.visit( this ); }
    206201        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    207         virtual void print( std::ostream & os, int indent = 0 ) const;
     202        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    208203};
    209204
     
    223218        virtual void accept( Visitor & v ) { v.visit( this ); }
    224219        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    225         virtual void print( std::ostream & os, int indent = 0 ) const;
     220        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    226221};
    227222
     
    232227        Expression * aggregate;
    233228
    234         UntypedMemberExpr( Expression * member, Expression * aggregate, Expression *_aname = nullptr );
     229        UntypedMemberExpr( Expression * member, Expression * aggregate );
    235230        UntypedMemberExpr( const UntypedMemberExpr & other );
    236231        virtual ~UntypedMemberExpr();
     
    244239        virtual void accept( Visitor & v ) { v.visit( this ); }
    245240        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    246         virtual void print( std::ostream & os, int indent = 0 ) const;
     241        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    247242};
    248243
     
    254249        Expression * aggregate;
    255250
    256         MemberExpr( DeclarationWithType * member, Expression * aggregate, Expression *_aname = nullptr );
     251        MemberExpr( DeclarationWithType * member, Expression * aggregate );
    257252        MemberExpr( const MemberExpr & other );
    258253        virtual ~MemberExpr();
     
    266261        virtual void accept( Visitor & v ) { v.visit( this ); }
    267262        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    268         virtual void print( std::ostream & os, int indent = 0 ) const;
     263        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    269264};
    270265
     
    275270        DeclarationWithType * var;
    276271
    277         VariableExpr( DeclarationWithType * var, Expression *_aname = nullptr );
     272        VariableExpr( DeclarationWithType * var );
    278273        VariableExpr( const VariableExpr & other );
    279274        virtual ~VariableExpr();
     
    287282        virtual void accept( Visitor & v ) { v.visit( this ); }
    288283        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    289         virtual void print( std::ostream & os, int indent = 0 ) const;
     284        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    290285};
    291286
     
    295290        Constant constant;
    296291
    297         ConstantExpr( Constant constant, Expression *_aname = nullptr );
     292        ConstantExpr( Constant constant );
    298293        ConstantExpr( const ConstantExpr & other );
    299294        virtual ~ConstantExpr();
     
    305300        virtual void accept( Visitor & v ) { v.visit( this ); }
    306301        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    307         virtual void print( std::ostream & os, int indent = 0 ) const;
     302        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    308303};
    309304
     
    315310        bool isType;
    316311
    317         SizeofExpr( Expression * expr, Expression *_aname = nullptr );
     312        SizeofExpr( Expression * expr );
    318313        SizeofExpr( const SizeofExpr & other );
    319         SizeofExpr( Type * type, Expression *_aname = nullptr );
     314        SizeofExpr( Type * type );
    320315        virtual ~SizeofExpr();
    321316
     
    330325        virtual void accept( Visitor & v ) { v.visit( this ); }
    331326        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    332         virtual void print( std::ostream & os, int indent = 0 ) const;
     327        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    333328};
    334329
     
    340335        bool isType;
    341336
    342         AlignofExpr( Expression * expr, Expression *_aname = nullptr );
     337        AlignofExpr( Expression * expr );
    343338        AlignofExpr( const AlignofExpr & other );
    344         AlignofExpr( Type * type, Expression *_aname = nullptr );
     339        AlignofExpr( Type * type );
    345340        virtual ~AlignofExpr();
    346341
     
    355350        virtual void accept( Visitor & v ) { v.visit( this ); }
    356351        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    357         virtual void print( std::ostream & os, int indent = 0 ) const;
     352        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    358353};
    359354
     
    364359        std::string member;
    365360
    366         UntypedOffsetofExpr( Type * type, const std::string & member, Expression *_aname = nullptr );
     361        UntypedOffsetofExpr( Type * type, const std::string & member );
    367362        UntypedOffsetofExpr( const UntypedOffsetofExpr & other );
    368363        virtual ~UntypedOffsetofExpr();
     
    376371        virtual void accept( Visitor & v ) { v.visit( this ); }
    377372        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    378         virtual void print( std::ostream & os, int indent = 0 ) const;
     373        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    379374};
    380375
     
    385380        DeclarationWithType * member;
    386381
    387         OffsetofExpr( Type * type, DeclarationWithType * member, Expression *_aname = nullptr );
     382        OffsetofExpr( Type * type, DeclarationWithType * member );
    388383        OffsetofExpr( const OffsetofExpr & other );
    389384        virtual ~OffsetofExpr();
     
    397392        virtual void accept( Visitor & v ) { v.visit( this ); }
    398393        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    399         virtual void print( std::ostream & os, int indent = 0 ) const;
     394        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    400395};
    401396
     
    405400        StructInstType * type;
    406401
    407         OffsetPackExpr( StructInstType * type_, Expression * aname_ = 0 );
     402        OffsetPackExpr( StructInstType * type );
    408403        OffsetPackExpr( const OffsetPackExpr & other );
    409404        virtual ~OffsetPackExpr();
     
    415410        virtual void accept( Visitor & v ) { v.visit( this ); }
    416411        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    417         virtual void print( std::ostream & os, int indent = 0 ) const;
     412        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    418413};
    419414
     
    426421        bool isType;
    427422
    428         AttrExpr(Expression * attr, Expression * expr, Expression *_aname = nullptr );
     423        AttrExpr(Expression * attr, Expression * expr );
    429424        AttrExpr( const AttrExpr & other );
    430         AttrExpr( Expression * attr, Type * type, Expression *_aname = nullptr );
     425        AttrExpr( Expression * attr, Type * type );
    431426        virtual ~AttrExpr();
    432427
     
    443438        virtual void accept( Visitor & v ) { v.visit( this ); }
    444439        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    445         virtual void print( std::ostream & os, int indent = 0 ) const;
     440        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    446441};
    447442
     
    452447        Expression * arg2;
    453448
    454         LogicalExpr( Expression * arg1, Expression * arg2, bool andp = true, Expression *_aname = nullptr );
     449        LogicalExpr( Expression * arg1, Expression * arg2, bool andp = true );
    455450        LogicalExpr( const LogicalExpr & other );
    456451        virtual ~LogicalExpr();
     
    465460        virtual void accept( Visitor & v ) { v.visit( this ); }
    466461        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    467         virtual void print( std::ostream & os, int indent = 0 ) const;
     462        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    468463
    469464  private:
     
    478473        Expression * arg3;
    479474
    480         ConditionalExpr( Expression * arg1, Expression * arg2, Expression * arg3, Expression *_aname = nullptr );
     475        ConditionalExpr( Expression * arg1, Expression * arg2, Expression * arg3 );
    481476        ConditionalExpr( const ConditionalExpr & other );
    482477        virtual ~ConditionalExpr();
     
    492487        virtual void accept( Visitor & v ) { v.visit( this ); }
    493488        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    494         virtual void print( std::ostream & os, int indent = 0 ) const;
     489        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    495490};
    496491
     
    501496        Expression * arg2;
    502497
    503         CommaExpr( Expression * arg1, Expression * arg2, Expression *_aname = nullptr );
     498        CommaExpr( Expression * arg1, Expression * arg2 );
    504499        CommaExpr( const CommaExpr & other );
    505500        virtual ~CommaExpr();
     
    513508        virtual void accept( Visitor & v ) { v.visit( this ); }
    514509        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    515         virtual void print( std::ostream & os, int indent = 0 ) const;
     510        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    516511};
    517512
     
    531526        virtual void accept( Visitor & v ) { v.visit( this ); }
    532527        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    533         virtual void print( std::ostream & os, int indent = 0 ) const;
     528        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    534529};
    535530
     
    557552        virtual void accept( Visitor & v ) { v.visit( this ); }
    558553        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    559         virtual void print( std::ostream & os, int indent = 0 ) const;
     554        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    560555
    561556        // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints
     
    585580        virtual void accept( Visitor & v ) { v.visit( this ); }
    586581        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    587         virtual void print( std::ostream & os, int indent = 0 ) const;
     582        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    588583};
    589584
     
    603598        virtual void accept( Visitor & v ) { v.visit( this ); }
    604599        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    605         virtual void print( std::ostream & os, int indent = 0 ) const;
     600        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    606601};
    607602
     
    621616        virtual void accept( Visitor & v ) { v.visit( this ); }
    622617        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    623         virtual void print( std::ostream & os, int indent = 0 ) const;
     618        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    624619};
    625620
     
    640635        virtual void accept( Visitor & v ) { v.visit( this ); }
    641636        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    642         virtual void print( std::ostream & os, int indent = 0 ) const;
     637        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    643638};
    644639
     
    648643        std::list<Expression*> exprs;
    649644
    650         UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
     645        UntypedTupleExpr( const std::list< Expression * > & exprs );
    651646        UntypedTupleExpr( const UntypedTupleExpr & other );
    652647        virtual ~UntypedTupleExpr();
     
    657652        virtual void accept( Visitor & v ) { v.visit( this ); }
    658653        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    659         virtual void print( std::ostream & os, int indent = 0 ) const;
     654        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    660655};
    661656
     
    665660        std::list<Expression*> exprs;
    666661
    667         TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
     662        TupleExpr( const std::list< Expression * > & exprs );
    668663        TupleExpr( const TupleExpr & other );
    669664        virtual ~TupleExpr();
     
    674669        virtual void accept( Visitor & v ) { v.visit( this ); }
    675670        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    676         virtual void print( std::ostream & os, int indent = 0 ) const;
     671        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    677672};
    678673
     
    695690        virtual void accept( Visitor & v ) { v.visit( this ); }
    696691        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    697         virtual void print( std::ostream & os, int indent = 0 ) const;
     692        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    698693};
    699694
     
    703698        StmtExpr * stmtExpr = nullptr;
    704699
    705         TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr );
     700        TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls );
    706701        TupleAssignExpr( const TupleAssignExpr & other );
    707702        virtual ~TupleAssignExpr();
     
    713708        virtual void accept( Visitor & v ) { v.visit( this ); }
    714709        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    715         virtual void print( std::ostream & os, int indent = 0 ) const;
     710        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    716711};
    717712
     
    736731        virtual void accept( Visitor & v ) { v.visit( this ); }
    737732        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    738         virtual void print( std::ostream & os, int indent = 0 ) const;
     733        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    739734};
    740735
     
    763758        virtual void accept( Visitor & v ) { v.visit( this ); }
    764759        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    765         virtual void print( std::ostream & os, int indent = 0 ) const;
     760        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    766761
    767762private:
     
    797792        virtual void accept( Visitor & v ) { v.visit( this ); }
    798793        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    799         virtual void print( std::ostream & os, int indent = 0 ) const;
     794        virtual void print( std::ostream & os, Indenter indent = {} ) const;
    800795};
    801796
     
    818813        virtual void accept( Visitor & v ) { v.visit( this ); }
    819814        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    820         virtual void print( std::ostream & os, int indent = 0 ) const;
    821 };
    822 
    823 
    824 std::ostream & operator<<( std::ostream & out, const Expression * expr );
     815        virtual void print( std::ostream & os, Indenter indent = {} ) const;
     816};
    825817
    826818// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.