Ignore:
Timestamp:
Apr 4, 2023, 2:25:52 PM (17 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, ast-experimental, master
Children:
beeff61e, e02e13f
Parents:
4541b09
Message:

Translated parser to the new ast. This incuded a small fix in the resolver so larger expressions can be used in with statements and some updated tests. errors/declaration just is a formatting update. attributes now actually preserves more attributes (unknown if all versions work).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/InitializerNode.cc

    r4541b09 rbb7422a  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:20:24 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 28 23:27:20 2017
    13 // Update Count     : 26
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue Apr  4 11:18:00 2023
     13// Update Count     : 27
    1414//
    1515
     
    2020using namespace std;
    2121
     22#include "AST/Expr.hpp"            // for Expr
     23#include "AST/Init.hpp"            // for Designator, Init, ListInit, Sing...
    2224#include "Common/SemanticError.h"  // for SemanticError
    2325#include "Common/utility.h"        // for maybeBuild
    2426#include "ParseNode.h"             // for InitializerNode, ExpressionNode
    25 #include "SynTree/Expression.h"    // for Expression
    26 #include "SynTree/Initializer.h"   // for Initializer, ListInit, SingleInit
     27
     28static ast::ConstructFlag toConstructFlag( bool maybeConstructed ) {
     29        return maybeConstructed ? ast::MaybeConstruct : ast::NoConstruct;
     30}
    2731
    2832InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode * des )
     
    3337        if ( kids )
    3438                set_last( nullptr );
    35 } // InitializerNode::InitializerNode
     39} // InitializerNode::InitializerNode
    3640
    3741InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode * des )
     
    8589} // InitializerNode::printOneLine
    8690
    87 Initializer * InitializerNode::build() const {
     91ast::Init * InitializerNode::build() const {
    8892        assertf( ! isDelete, "Should not build delete stmt InitializerNode" );
    8993        if ( aggregate ) {
    9094                // steal designators from children
    91                 std::list< Designation * > designlist;
     95                std::vector<ast::ptr<ast::Designation>> designlist;
    9296                InitializerNode * child = next_init();
    93                 for ( ; child != nullptr; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) {
    94                         std::list< Expression * > desList;
    95                         buildList< Expression, ExpressionNode >( child->designator, desList );
    96                         designlist.push_back( new Designation( desList ) );
     97                for ( ; child != nullptr ; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) {
     98                        std::deque<ast::ptr<ast::Expr>> desList;
     99                        buildList( child->designator, desList );
     100                        designlist.push_back(
     101                                new ast::Designation( location, std::move( desList ) ) );
    97102                } // for
    98                 std::list< Initializer * > initlist;
    99                 buildList< Initializer, InitializerNode >( next_init(), initlist );
    100                 return new ListInit( initlist, designlist, maybeConstructed );
    101         } else {
    102                 if ( get_expression() ) {
    103                         assertf( get_expression()->expr, "The expression of initializer must have value" );
    104                         return new SingleInit( maybeBuild( get_expression() ), maybeConstructed );
    105                 } // if
     103                std::vector<ast::ptr<ast::Init>> initlist;
     104                buildList( next_init(), initlist );
     105                return new ast::ListInit( location,
     106                        std::move( initlist ),
     107                        std::move( designlist ),
     108                        toConstructFlag( maybeConstructed )
     109                );
     110        } else if ( get_expression() ) {
     111                assertf( get_expression()->expr, "The expression of initializer must have value" );
     112                return new ast::SingleInit( location,
     113                        maybeBuild( get_expression() ),
     114                        toConstructFlag( maybeConstructed )
     115                );
    106116        } // if
    107117        return nullptr;
Note: See TracChangeset for help on using the changeset viewer.