Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ParseNode.h

    r44adf1b r5bf685f  
    3333
    3434struct DeclarationNode;
    35 struct InitializerNode;
    36 struct ExpressionNode;
     35class InitializerNode;
     36class ExpressionNode;
    3737struct StatementNode;
    3838
     
    4545extern YYLTYPE yylloc;
    4646
    47 struct ParseNode {
    48         ParseNode() {}
    49         virtual ~ParseNode() {}
     47class ParseNode {
     48  public:
     49        ParseNode() {};
     50        virtual ~ParseNode() { delete next; delete name; };
    5051        virtual ParseNode * clone() const = 0;
    5152
    52         virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
     53        ParseNode * get_next() const { return next; }
     54        ParseNode * set_next( ParseNode * newlink ) { next = newlink; return this; }
    5355
    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>`!
    60 template<typename Next>
    61 struct 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;
     56        ParseNode * get_last() {
     57                ParseNode * current;
     58                for ( current = this; current->get_next() != nullptr; current = current->get_next() );
    6959                return current;
    7060        }
    71         Next * set_last( Next * newlast ) {
    72                 if ( newlast != nullptr ) get_last()->next = newlast;
    73                 return static_cast<Next *>( this );
     61        ParseNode * set_last( ParseNode * newlast ) {
     62                if ( newlast != nullptr ) get_last()->set_next( newlast );
     63                return this;
    7464        }
    7565
     66        virtual void print( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
    7667        virtual void printList( std::ostream & os, int indent = 0 ) const {
    7768                print( os, indent );
     
    7970        }
    8071
    81         Next * next = nullptr;
    82 };
     72        static int indent_by;
     73
     74        ParseNode * next = nullptr;
     75        const std::string * name = nullptr;
     76        CodeLocation location = yylloc;
     77}; // ParseNode
    8378
    8479// Must harmonize with OperName.
Note: See TracChangeset for help on using the changeset viewer.