source: translator/Parser/InitializerNode.cc @ 3848e0e

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since 3848e0e was 3848e0e, checked in by Peter A. Buhr <pabuhr@…>, 10 years ago

underscore changes, ptrdiff_t changes, formating, _Bool prelude

  • Property mode set to 100644
File size: 2.3 KB
RevLine 
[51b7345]1#include "ParseNode.h"
2#include "SynTree/Expression.h"
3#include "SynTree/Initializer.h"
4#include "utility.h"
5#include "SemanticError.h"
6// #include <cstdlib> // for strtol
7#include <cassert>
8
9
10InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des )
[3848e0e]11        : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) {
12    if ( aggrp )
13        kids = dynamic_cast< InitializerNode *>( get_link() );
[51b7345]14
[3848e0e]15    if ( kids != 0 )
16        set_link( 0 );
[51b7345]17}
18
19InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des )
[3848e0e]20        : aggregate( aggrp ), designator( des ), kids( 0 ) {
21    if ( init != 0 )
22        set_link(init);
[51b7345]23
[3848e0e]24    if ( aggrp )
25        kids = dynamic_cast< InitializerNode *>( get_link() );
[51b7345]26
[3848e0e]27    if ( kids != 0 )
28        set_next( 0 );
[51b7345]29}
30
31InitializerNode::~InitializerNode() {
[3848e0e]32    delete expr;
[51b7345]33}
34
35void InitializerNode::print( std::ostream &os, int indent ) const {
[3848e0e]36    os << std::string(indent, ' ') << "Initializer expression" << std::endl;
[51b7345]37}
38
39void InitializerNode::printOneLine( std::ostream &os ) const {
[3848e0e]40    if ( ! aggregate ) {
41        if ( designator != 0 ) {
42            os << "designated by: (";
43            ExpressionNode  *curdes = designator;
44            while( curdes != 0) {
45                curdes->printOneLine(os);
46                curdes = (ExpressionNode *)(curdes->get_link());
47                if ( curdes ) os << ", ";
48            }
49            os << ")";
[51b7345]50        }
[3848e0e]51        if ( expr ) expr->printOneLine(os);
52    } else {  // It's an aggregate
53        os << "[--";
54        if ( next_init() != 0 )
55            next_init()->printOneLine(os);
56        if (aggregate) os << "--]";
[51b7345]57    }
58
[3848e0e]59    InitializerNode *moreInit;
60    if  ( get_link() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_link() ) ) != 0) )
61        moreInit->printOneLine( os );
[51b7345]62}
63
64Initializer *InitializerNode::build() const {
[3848e0e]65    // if ( get_expression() == 0 ) return 0;  // XXX (?)
[51b7345]66
[3848e0e]67    if ( aggregate ) {
68        assert( next_init() != 0 );
[51b7345]69
[3848e0e]70        std::list< Initializer *> initlist;
71        buildList<Initializer, InitializerNode>( next_init(), initlist );
[51b7345]72
[3848e0e]73        std::list< Expression *> designlist;
74        if ( designator != 0 )
75            buildList<Expression, ExpressionNode>( designator, designlist );
[51b7345]76
[3848e0e]77        return new ListInit( initlist, designlist );
78    } else {
79        std::list< Expression *> designators;
[51b7345]80
[3848e0e]81        if ( designator != 0 )
82            buildList<Expression, ExpressionNode>( designator, designators );
[51b7345]83
[3848e0e]84        if ( get_expression() != 0)
85            return new SingleInit( get_expression()->build(), designators );
[51b7345]86    }
87
[3848e0e]88    return 0;
[51b7345]89}
Note: See TracBrowser for help on using the repository browser.