Ignore:
Timestamp:
Mar 6, 2024, 6:06:43 AM (22 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
647d633
Parents:
bbf2cb1 (diff), af60383 (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/Parser/ParseNode.h

    rbbf2cb1 rf6e8c67  
    3333
    3434struct DeclarationNode;
    35 class InitializerNode;
    36 class ExpressionNode;
     35struct InitializerNode;
     36struct ExpressionNode;
    3737struct StatementNode;
    3838
     
    4545extern YYLTYPE yylloc;
    4646
    47 class ParseNode {
    48   public:
    49         ParseNode() {};
    50         virtual ~ParseNode() { delete next; delete name; };
     47struct ParseNode {
     48        ParseNode() {}
     49        virtual ~ParseNode() {}
    5150        virtual ParseNode * clone() const = 0;
    5251
    53         ParseNode * get_next() const { return next; }
    54         ParseNode * set_next( ParseNode * newlink ) { next = newlink; return this; }
     52        virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
    5553
    56         ParseNode * get_last() {
    57                 ParseNode * current;
    58                 for ( current = this; current->get_next() != nullptr; current = current->get_next() );
     54        static int indent_by;
     55
     56        CodeLocation location = yylloc;
     57}; // ParseNode
     58
     59/// Only ever use in the form `struct NAME final : public ParseList<NAME>`!
     60template<typename Next>
     61struct ParseList : public ParseNode {
     62        ParseList() {}
     63        virtual ~ParseList() { delete next; };
     64        virtual ParseList<Next> * clone() const = 0;
     65
     66        Next * get_last() {
     67                Next * current = static_cast<Next *>( this );
     68                while ( current->next != nullptr ) current = current->next;
    5969                return current;
    6070        }
    61         ParseNode * set_last( ParseNode * newlast ) {
    62                 if ( newlast != nullptr ) get_last()->set_next( newlast );
    63                 return this;
     71        Next * set_last( Next * newlast ) {
     72                if ( newlast != nullptr ) get_last()->next = newlast;
     73                return static_cast<Next *>( this );
    6474        }
    6575
    66         virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
    6776        virtual void printList( std::ostream & os, int indent = 0 ) const {
    6877                print( os, indent );
     
    7079        }
    7180
    72         static int indent_by;
    73 
    74         ParseNode * next = nullptr;
    75         const std::string * name = nullptr;
    76         CodeLocation location = yylloc;
    77 }; // ParseNode
     81        Next * next = nullptr;
     82};
    7883
    7984// Must harmonize with OperName.
Note: See TracChangeset for help on using the changeset viewer.