Changeset ce8c12f for src/Parser


Ignore:
Timestamp:
May 15, 2017, 11:30:26 AM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
d36c117
Parents:
65aca88
Message:

initial work on references: reference types passed through the system, very simple examples work

Location:
src/Parser
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    r65aca88 rce8c12f  
    326326} // DeclarationNode::newTypeDecl
    327327
    328 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers ) {
    329         DeclarationNode * newnode = new DeclarationNode;
    330         newnode->type = new TypeData( TypeData::Pointer );
     328DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers, OperKinds kind ) {
     329        DeclarationNode * newnode = new DeclarationNode;
     330        newnode->type = new TypeData( kind == OperKinds::PointTo ? TypeData::Pointer : TypeData::Reference );
    331331        if ( qualifiers ) {
    332332                return newnode->addQualifiers( qualifiers );
     
    745745DeclarationNode * DeclarationNode::addPointer( DeclarationNode * p ) {
    746746        if ( p ) {
    747                 assert( p->type->kind == TypeData::Pointer );
     747                assert( p->type->kind == TypeData::Pointer || TypeData::Reference );
    748748                setBase( p->type );
    749749                p->type = nullptr;
  • src/Parser/ParseNode.h

    r65aca88 rce8c12f  
    237237        static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
    238238        static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams );
    239         static DeclarationNode * newPointer( DeclarationNode * qualifiers );
     239        static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind );
    240240        static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic );
    241241        static DeclarationNode * newVarArray( DeclarationNode * qualifiers );
  • src/Parser/TypeData.cc

    r65aca88 rce8c12f  
    3030          case Unknown:
    3131          case Pointer:
     32          case Reference:
    3233          case EnumConstant:
    3334                // nothing else to initialize
     
    99100          case Unknown:
    100101          case Pointer:
     102          case Reference:
    101103          case EnumConstant:
    102104                // nothing to destroy
     
    165167          case EnumConstant:
    166168          case Pointer:
     169          case Reference:
    167170                // nothing else to copy
    168171                break;
     
    434437          case TypeData::Array:
    435438                return buildArray( td );
     439          case TypeData::Reference:
     440                return buildReference( td );
    436441          case TypeData::Function:
    437442                return buildFunction( td );
     
    612617        buildForall( td->forall, at->get_forall() );
    613618        return at;
    614 } // buildPointer
     619} // buildArray
     620
     621ReferenceType * buildReference( const TypeData * td ) {
     622        ReferenceType * rt;
     623        if ( td->base ) {
     624                rt = new ReferenceType( buildQualifiers( td ), typebuild( td->base ) );
     625        } else {
     626                rt = new ReferenceType( buildQualifiers( td ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
     627        } // if
     628        buildForall( td->forall, rt->get_forall() );
     629        return rt;
     630} // buildReference
    615631
    616632AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes ) {
  • src/Parser/TypeData.h

    r65aca88 rce8c12f  
    2121
    2222struct TypeData {
    23         enum Kind { Basic, Pointer, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
     23        enum Kind { Basic, Pointer, Array, Reference, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
    2424                                SymbolicInst, Tuple, Typeof, Builtin, Unknown };
    2525
     
    101101PointerType * buildPointer( const TypeData * );
    102102ArrayType * buildArray( const TypeData * );
     103ReferenceType * buildReference( const TypeData * );
    103104AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > );
    104105ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes );
  • src/Parser/parser.yy

    r65aca88 rce8c12f  
    23772377variable_ptr:
    23782378        ptrref_operator variable_declarator
    2379                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2379                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    23802380        | ptrref_operator type_qualifier_list variable_declarator
    2381                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2381                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    23822382        | '(' variable_ptr ')' attribute_list_opt
    23832383                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    24252425function_ptr:
    24262426        ptrref_operator function_declarator
    2427                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2427                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    24282428        | ptrref_operator type_qualifier_list function_declarator
    2429                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2429                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    24302430        | '(' function_ptr ')'
    24312431                { $$ = $2; }
     
    24652465KR_function_ptr:
    24662466        ptrref_operator KR_function_declarator
    2467                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2467                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    24682468        | ptrref_operator type_qualifier_list KR_function_declarator
    2469                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2469                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    24702470        | '(' KR_function_ptr ')'
    24712471                { $$ = $2; }
     
    25092509type_ptr:
    25102510        ptrref_operator variable_type_redeclarator
    2511                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2511                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25122512        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2513                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2513                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25142514        | '(' type_ptr ')' attribute_list_opt
    25152515                { $$ = $2->addQualifiers( $4 ); }
     
    25532553identifier_parameter_ptr:
    25542554        ptrref_operator identifier_parameter_declarator
    2555                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2555                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25562556        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2557                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2557                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25582558        | '(' identifier_parameter_ptr ')' attribute_list_opt
    25592559                { $$ = $2->addQualifiers( $4 ); }
     
    26132613type_parameter_ptr:
    26142614        ptrref_operator type_parameter_redeclarator
    2615                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2615                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26162616        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2617                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2617                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26182618        | '(' type_parameter_ptr ')' attribute_list_opt
    26192619                { $$ = $2->addQualifiers( $4 ); }
     
    26562656abstract_ptr:
    26572657        ptrref_operator
    2658                 { $$ = DeclarationNode::newPointer( 0 ); }
     2658                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    26592659        | ptrref_operator type_qualifier_list
    2660                 { $$ = DeclarationNode::newPointer( $2 ); }
     2660                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    26612661        | ptrref_operator abstract_declarator
    2662                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2662                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26632663        | ptrref_operator type_qualifier_list abstract_declarator
    2664                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2664                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26652665        | '(' abstract_ptr ')' attribute_list_opt
    26662666                { $$ = $2->addQualifiers( $4 ); }
     
    27452745abstract_parameter_ptr:
    27462746        ptrref_operator
    2747                 { $$ = DeclarationNode::newPointer( nullptr ); }
     2747                { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
    27482748        | ptrref_operator type_qualifier_list
    2749                 { $$ = DeclarationNode::newPointer( $2 ); }
     2749                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    27502750        | ptrref_operator abstract_parameter_declarator
    2751                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
     2751                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
    27522752        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2753                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2753                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    27542754        | '(' abstract_parameter_ptr ')' attribute_list_opt
    27552755                { $$ = $2->addQualifiers( $4 ); }
     
    28242824variable_abstract_ptr:
    28252825        ptrref_operator
    2826                 { $$ = DeclarationNode::newPointer( 0 ); }
     2826                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    28272827        | ptrref_operator type_qualifier_list
    2828                 { $$ = DeclarationNode::newPointer( $2 ); }
     2828                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    28292829        | ptrref_operator variable_abstract_declarator
    2830                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2830                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    28312831        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2832                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2832                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    28332833        | '(' variable_abstract_ptr ')' attribute_list_opt
    28342834                { $$ = $2->addQualifiers( $4 ); }
     
    28702870                // No SUE declaration in parameter list.
    28712871        ptrref_operator type_specifier_nobody
    2872                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2872                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    28732873        | type_qualifier_list ptrref_operator type_specifier_nobody
    2874                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2874                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    28752875        | ptrref_operator cfa_abstract_function
    2876                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2876                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    28772877        | type_qualifier_list ptrref_operator cfa_abstract_function
    2878                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2878                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    28792879        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2880                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2880                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    28812881        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2882                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2882                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    28832883        ;
    28842884
     
    29582958cfa_abstract_ptr:                                                                               // CFA
    29592959        ptrref_operator type_specifier
    2960                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2960                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29612961        | type_qualifier_list ptrref_operator type_specifier
    2962                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2962                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29632963        | ptrref_operator cfa_abstract_function
    2964                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2964                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29652965        | type_qualifier_list ptrref_operator cfa_abstract_function
    2966                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2966                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29672967        | ptrref_operator cfa_abstract_declarator_tuple
    2968                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2968                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29692969        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    2970                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2970                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29712971        ;
    29722972
Note: See TracChangeset for help on using the changeset viewer.