Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ParseNode.h

    rfaddbd8 raefcc3b  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Oct  3 18:03:08 2016
    13 // Update Count     : 636
     12// Last Modified On : Mon Sep 12 08:00:05 2016
     13// Update Count     : 603
    1414//
    1515
     
    4141  public:
    4242        ParseNode() {};
    43         virtual ~ParseNode() { delete next; delete name; };
     43        ParseNode( const std::string * name ) : name( * name ) { assert( false ); delete name; }
     44        ParseNode( const std::string &name ) : name( name ) { assert( false ); }
     45        virtual ~ParseNode() { delete next; };
    4446        virtual ParseNode * clone() const = 0;
    4547
    4648        ParseNode * get_next() const { return next; }
    4749        ParseNode * set_next( ParseNode * newlink ) { next = newlink; return this; }
    48 
    4950        ParseNode * get_last() {
    5051                ParseNode * current;
    51                 for ( current = this; current->get_next() != nullptr; current = current->get_next() );
     52                for ( current = this; current->get_next() != 0; current = current->get_next() );
    5253                return current;
    5354        }
    5455        ParseNode * set_last( ParseNode * newlast ) {
    55                 if ( newlast != nullptr ) get_last()->set_next( newlast );
     56                if ( newlast != 0 ) get_last()->set_next( newlast );
    5657                return this;
    5758        }
     59
     60        const std::string &get_name() const { return name; }
     61        void set_name( const std::string &newValue ) { name = newValue; }
    5862
    5963        virtual void print( std::ostream &os, int indent = 0 ) const {}
    6064        virtual void printList( std::ostream &os, int indent = 0 ) const {}
    61 
     65  private:
    6266        static int indent_by;
    6367
    6468        ParseNode * next = nullptr;
    65         std::string * name = nullptr;
     69        std::string name;
    6670}; // ParseNode
    6771
     
    7074class InitializerNode : public ParseNode {
    7175  public:
    72         InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode * des = nullptr );
    73         InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );
     76        InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode * des = 0 );
     77        InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = 0 );
    7478        ~InitializerNode();
    7579        virtual InitializerNode * clone() const { assert( false ); return nullptr; }
     
    102106  public:
    103107        ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {}
     108        ExpressionNode( Expression * expr, const std::string * name ) : ParseNode( name ), expr( expr ) {}
    104109        ExpressionNode( const ExpressionNode &other );
    105110        virtual ~ExpressionNode() {}
     
    160165
    161166Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
    162 Expression * build_fieldSel( ExpressionNode * expr_node, NameExpr * member );
    163 Expression * build_pfieldSel( ExpressionNode * expr_node, NameExpr * member );
     167Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );
     168Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member );
    164169Expression * build_addressOf( ExpressionNode * expr_node );
    165170Expression * build_sizeOfexpr( ExpressionNode * expr_node );
     
    178183Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node );
    179184Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node );
    180 Expression * build_tuple( ExpressionNode * expr_node = nullptr );
     185Expression * build_tuple( ExpressionNode * expr_node = 0 );
    181186Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node );
    182187Expression * build_range( ExpressionNode * low, ExpressionNode * high );
     
    198203        enum Signedness { Signed, Unsigned, NoSignedness };
    199204        enum Length { Short, Long, LongLong, NoLength };
    200         enum Aggregate { Struct, Union, Trait, NoAggregate };
    201         enum TypeClass { Otype, Dtype, Ftype, NoTypeClass };
     205        enum Aggregate { Struct, Union, Trait };
     206        enum TypeClass { Otype, Dtype, Ftype };
    202207        enum BuiltinType { Valist };
    203208
     
    214219        static DeclarationNode * newFunction( std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle = false );
    215220        static DeclarationNode * newQualifier( Qualifier );
    216         static DeclarationNode * newForall( DeclarationNode * );
     221        static DeclarationNode * newForall( DeclarationNode *);
    217222        static DeclarationNode * newStorageClass( StorageClass );
    218223        static DeclarationNode * newBasicType( BasicType );
     
    221226        static DeclarationNode * newLength( Length lnth );
    222227        static DeclarationNode * newBuiltinType( BuiltinType );
    223         static DeclarationNode * newFromTypedef( std::string * );
     228        static DeclarationNode * newFromTypedef( std::string *);
    224229        static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
    225230        static DeclarationNode * newEnum( std::string * name, DeclarationNode * constants );
    226231        static DeclarationNode * newEnumConstant( std::string * name, ExpressionNode * constant );
    227         static DeclarationNode * newName( std::string * );
     232        static DeclarationNode * newName( std::string *);
    228233        static DeclarationNode * newFromTypeGen( std::string *, ExpressionNode * params );
    229         static DeclarationNode * newTypeParam( TypeClass, std::string * );
    230         static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
    231         static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
     234        static DeclarationNode * newTypeParam( TypeClass, std::string *);
     235        static DeclarationNode * newTrait( std::string * name, DeclarationNode * params, DeclarationNode * asserts );
     236        static DeclarationNode * newTraitUse( std::string * name, ExpressionNode * params );
    232237        static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams );
    233238        static DeclarationNode * newPointer( DeclarationNode * qualifiers );
     
    244249        DeclarationNode * clone() const;
    245250
    246         DeclarationNode * addQualifiers( DeclarationNode * );
     251        DeclarationNode * addQualifiers( DeclarationNode *);
    247252        void checkQualifiers( const TypeData *, const TypeData * );
    248         void checkStorageClasses( DeclarationNode * );
    249         DeclarationNode * copyStorageClasses( DeclarationNode * );
    250         DeclarationNode * addType( DeclarationNode * );
     253        void checkStorageClasses( DeclarationNode *q );
     254        DeclarationNode * copyStorageClasses( DeclarationNode *);
     255        DeclarationNode * addType( DeclarationNode *);
    251256        DeclarationNode * addTypedef();
    252         DeclarationNode * addAssertions( DeclarationNode * );
    253         DeclarationNode * addName( std::string * );
     257        DeclarationNode * addAssertions( DeclarationNode *);
     258        DeclarationNode * addName( std::string *);
    254259        DeclarationNode * addBitfield( ExpressionNode * size );
    255260        DeclarationNode * addVarArgs();
     
    265270
    266271        DeclarationNode * cloneType( std::string * newName );
     272        DeclarationNode * cloneType( DeclarationNode * existing );
     273        DeclarationNode * cloneType( int ) { return cloneType( ( std::string *)0 ); }
     274        DeclarationNode * cloneBaseType( std::string * newName );
    267275        DeclarationNode * cloneBaseType( DeclarationNode * newdecl );
    268276
     
    278286
    279287        bool get_hasEllipsis() const;
     288        const std::string &get_name() const { return name; }
    280289        LinkageSpec::Spec get_linkage() const { return linkage; }
    281290        DeclarationNode * extractAggregate() const;
     
    286295        DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }
    287296  public:
     297        // StorageClass buildStorageClass() const;
     298        // bool buildFuncSpecifier( StorageClass key ) const;
     299
    288300        struct Variable_t {
    289 //              const std::string * name;
    290301                DeclarationNode::TypeClass tyClass;
     302                std::string name;
    291303                DeclarationNode * assertions;
    292304        };
     
    294306
    295307        struct Attr_t {
    296 //              const std::string * name;
     308                std::string name;
    297309                ExpressionNode * expr;
    298310                DeclarationNode * type;
     
    303315
    304316        TypeData * type;
     317        std::string name;
    305318        StorageClass storageClass;
    306319        bool isInline, isNoreturn;
     
    318331
    319332Type * buildType( TypeData * type );
     333//Type::Qualifiers buildQualifiers( const TypeData::Qualifiers & qualifiers );
    320334
    321335static inline Type * maybeMoveBuildType( const DeclarationNode * orig ) {
     
    379393Statement * build_finally( StatementNode * stmt );
    380394Statement * build_compound( StatementNode * first );
    381 Statement * build_asmstmt( bool voltile, ConstantExpr * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
    382 
    383 //##############################################################################
    384 
    385 template< typename SynTreeType, typename NodeType >
    386 void buildList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) {
     395Statement * build_asmstmt( bool voltile, ConstantExpr * instruction, ExpressionNode * output = 0, ExpressionNode * input = 0, ExpressionNode * clobber = 0, LabelNode * gotolabels = 0 );
     396
     397//##############################################################################
     398
     399template< typename SynTreeType, typename NodeType, template< typename, typename...> class Container, typename... Args >
     400void buildList( const NodeType * firstNode, Container< SynTreeType *, Args... > &outputList ) {
    387401        SemanticError errors;
    388         std::back_insert_iterator< std::list< SynTreeType * > > out( outputList );
     402        std::back_insert_iterator< Container< SynTreeType *, Args... > > out( outputList );
    389403        const NodeType * cur = firstNode;
    390404
Note: See TracChangeset for help on using the changeset viewer.