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@…>, 9 years ago

underscore changes, ptrdiff_t changes, formating, _Bool prelude

  • Property mode set to 100644
File size: 2.3 KB
Line 
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 )
11        : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) {
12    if ( aggrp )
13        kids = dynamic_cast< InitializerNode *>( get_link() );
14
15    if ( kids != 0 )
16        set_link( 0 );
17}
18
19InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des )
20        : aggregate( aggrp ), designator( des ), kids( 0 ) {
21    if ( init != 0 )
22        set_link(init);
23
24    if ( aggrp )
25        kids = dynamic_cast< InitializerNode *>( get_link() );
26
27    if ( kids != 0 )
28        set_next( 0 );
29}
30
31InitializerNode::~InitializerNode() {
32    delete expr;
33}
34
35void InitializerNode::print( std::ostream &os, int indent ) const {
36    os << std::string(indent, ' ') << "Initializer expression" << std::endl;
37}
38
39void InitializerNode::printOneLine( std::ostream &os ) const {
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 << ")";
50        }
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 << "--]";
57    }
58
59    InitializerNode *moreInit;
60    if  ( get_link() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_link() ) ) != 0) )
61        moreInit->printOneLine( os );
62}
63
64Initializer *InitializerNode::build() const {
65    // if ( get_expression() == 0 ) return 0;  // XXX (?)
66
67    if ( aggregate ) {
68        assert( next_init() != 0 );
69
70        std::list< Initializer *> initlist;
71        buildList<Initializer, InitializerNode>( next_init(), initlist );
72
73        std::list< Expression *> designlist;
74        if ( designator != 0 )
75            buildList<Expression, ExpressionNode>( designator, designlist );
76
77        return new ListInit( initlist, designlist );
78    } else {
79        std::list< Expression *> designators;
80
81        if ( designator != 0 )
82            buildList<Expression, ExpressionNode>( designator, designators );
83
84        if ( get_expression() != 0)
85            return new SingleInit( get_expression()->build(), designators );
86    }
87
88    return 0;
89}
Note: See TracBrowser for help on using the repository browser.