Changeset 6b224a52 for src/Parser
- Timestamp:
- Aug 25, 2017, 12:11:53 PM (7 years ago)
- 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:
- bf7b9da7
- Parents:
- 135b431 (diff), f676b84 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src/Parser
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
r135b431 r6b224a52 340 340 } // DeclarationNode::newTypeDecl 341 341 342 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers ) {343 DeclarationNode * newnode = new DeclarationNode; 344 newnode->type = new TypeData( TypeData::Pointer);342 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers, OperKinds kind ) { 343 DeclarationNode * newnode = new DeclarationNode; 344 newnode->type = new TypeData( kind == OperKinds::PointTo ? TypeData::Pointer : TypeData::Reference ); 345 345 if ( qualifiers ) { 346 346 return newnode->addQualifiers( qualifiers ); … … 759 759 DeclarationNode * DeclarationNode::addPointer( DeclarationNode * p ) { 760 760 if ( p ) { 761 assert( p->type->kind == TypeData::Pointer );761 assert( p->type->kind == TypeData::Pointer || TypeData::Reference ); 762 762 setBase( p->type ); 763 763 p->type = nullptr; … … 781 781 DeclarationNode * DeclarationNode::addNewPointer( DeclarationNode * p ) { 782 782 if ( p ) { 783 assert( p->type->kind == TypeData::Pointer );783 assert( p->type->kind == TypeData::Pointer || p->type->kind == TypeData::Reference ); 784 784 if ( type ) { 785 785 switch ( type->kind ) { -
src/Parser/ExpressionNode.cc
r135b431 r6b224a52 314 314 Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) { 315 315 std::list< Expression * > args; 316 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) );316 args.push_back( maybeMoveBuild< Expression >(expr_node) ); // xxx 317 317 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 318 318 } // build_unary_ptr … … 327 327 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 328 328 std::list< Expression * > args; 329 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1)) );329 args.push_back( maybeMoveBuild< Expression >(expr_node1) ); 330 330 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 331 331 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); -
src/Parser/ParseNode.h
r135b431 r6b224a52 243 243 static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params ); 244 244 static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams ); 245 static DeclarationNode * newPointer( DeclarationNode * qualifiers );245 static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind ); 246 246 static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic ); 247 247 static DeclarationNode * newVarArray( DeclarationNode * qualifiers ); -
src/Parser/TypeData.cc
r135b431 r6b224a52 35 35 case Unknown: 36 36 case Pointer: 37 case Reference: 37 38 case EnumConstant: 38 39 // nothing else to initialize … … 104 105 case Unknown: 105 106 case Pointer: 107 case Reference: 106 108 case EnumConstant: 107 109 // nothing to destroy … … 170 172 case EnumConstant: 171 173 case Pointer: 174 case Reference: 172 175 // nothing else to copy 173 176 break; … … 405 408 // add dtor: void ^?{}(T *) 406 409 FunctionType * dtorType = new FunctionType( Type::Qualifiers(), false ); 407 dtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );410 dtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 408 411 td->get_assertions().push_front( new FunctionDecl( "^?{}", Type::StorageClasses(), LinkageSpec::Cforall, dtorType, nullptr ) ); 409 412 410 413 // add copy ctor: void ?{}(T *, T) 411 414 FunctionType * copyCtorType = new FunctionType( Type::Qualifiers(), false ); 412 copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );415 copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 413 416 copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); 414 417 td->get_assertions().push_front( new FunctionDecl( "?{}", Type::StorageClasses(), LinkageSpec::Cforall, copyCtorType, nullptr ) ); … … 416 419 // add default ctor: void ?{}(T *) 417 420 FunctionType * ctorType = new FunctionType( Type::Qualifiers(), false ); 418 ctorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );421 ctorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 419 422 td->get_assertions().push_front( new FunctionDecl( "?{}", Type::StorageClasses(), LinkageSpec::Cforall, ctorType, nullptr ) ); 420 423 421 424 // add assignment operator: T * ?=?(T *, T) 422 425 FunctionType * assignType = new FunctionType( Type::Qualifiers(), false ); 423 assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );426 assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 424 427 assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); 425 428 assignType->get_returnVals().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); … … 441 444 case TypeData::Array: 442 445 return buildArray( td ); 446 case TypeData::Reference: 447 return buildReference( td ); 443 448 case TypeData::Function: 444 449 return buildFunction( td ); … … 619 624 buildForall( td->forall, at->get_forall() ); 620 625 return at; 621 } // buildPointer 626 } // buildArray 627 628 ReferenceType * buildReference( const TypeData * td ) { 629 ReferenceType * rt; 630 if ( td->base ) { 631 rt = new ReferenceType( buildQualifiers( td ), typebuild( td->base ) ); 632 } else { 633 rt = new ReferenceType( buildQualifiers( td ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 634 } // if 635 buildForall( td->forall, rt->get_forall() ); 636 return rt; 637 } // buildReference 622 638 623 639 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { -
src/Parser/TypeData.h
r135b431 r6b224a52 26 26 27 27 struct TypeData { 28 enum Kind { Basic, Pointer, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,28 enum Kind { Basic, Pointer, Array, Reference, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic, 29 29 SymbolicInst, Tuple, Typeof, Builtin, Unknown }; 30 30 … … 109 109 PointerType * buildPointer( const TypeData * ); 110 110 ArrayType * buildArray( const TypeData * ); 111 ReferenceType * buildReference( const TypeData * ); 111 112 AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > ); 112 113 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ); -
src/Parser/lex.ll
r135b431 r6b224a52 237 237 __label__ { KEYWORD_RETURN(LABEL); } // GCC 238 238 long { KEYWORD_RETURN(LONG); } 239 lvalue { KEYWORD_RETURN(LVALUE); } // CFA240 239 monitor { KEYWORD_RETURN(MONITOR); } // CFA 241 240 mutex { KEYWORD_RETURN(MUTEX); } // CFA -
src/Parser/parser.yy
r135b431 r6b224a52 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 23 14:53:20201713 // Update Count : 270 212 // Last Modified On : Wed Aug 23 21:08:08 2017 13 // Update Count : 2704 14 14 // 15 15 … … 120 120 %token RESTRICT // C99 121 121 %token ATOMIC // C11 122 %token FORALL LVALUEMUTEX VIRTUAL // CFA122 %token FORALL MUTEX VIRTUAL // CFA 123 123 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED 124 124 %token BOOL COMPLEX IMAGINARY // C99 … … 307 307 // Similar issues exit with the waitfor statement. 308 308 309 // Order of these lines matters . THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left associative over310 // TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.309 // Order of these lines matters (low-to-high precedence). THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left 310 // associative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE. 311 311 %precedence THEN // rule precedence for IF/WAITFOR statement 312 312 %precedence WOR // token precedence for start of WOR in WAITFOR statement … … 569 569 | '&' { $$ = OperKinds::AddressOf; } 570 570 // GCC, address of label must be handled by semantic check for ref,ref,label 571 //| ANDAND { $$ = OperKinds::And; }571 | ANDAND { $$ = OperKinds::And; } 572 572 ; 573 573 … … 691 691 conditional_expression 692 692 | unary_expression assignment_operator assignment_expression 693 { $$ = new ExpressionNode( build_binary_ ptr( $2, $1, $3 ) ); }693 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); } 694 694 ; 695 695 … … 1494 1494 | VOLATILE 1495 1495 { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); } 1496 | LVALUE // CFA1497 { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }1498 1496 | MUTEX 1499 1497 { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); } … … 2477 2475 variable_ptr: 2478 2476 ptrref_operator variable_declarator 2479 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2477 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2480 2478 | ptrref_operator type_qualifier_list variable_declarator 2481 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2479 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2482 2480 | '(' variable_ptr ')' attribute_list_opt 2483 2481 { $$ = $2->addQualifiers( $4 ); } // redundant parenthesis … … 2525 2523 function_ptr: 2526 2524 ptrref_operator function_declarator 2527 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2525 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2528 2526 | ptrref_operator type_qualifier_list function_declarator 2529 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2527 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2530 2528 | '(' function_ptr ')' 2531 2529 { $$ = $2; } … … 2565 2563 KR_function_ptr: 2566 2564 ptrref_operator KR_function_declarator 2567 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2565 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2568 2566 | ptrref_operator type_qualifier_list KR_function_declarator 2569 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2567 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2570 2568 | '(' KR_function_ptr ')' 2571 2569 { $$ = $2; } … … 2609 2607 type_ptr: 2610 2608 ptrref_operator variable_type_redeclarator 2611 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2609 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2612 2610 | ptrref_operator type_qualifier_list variable_type_redeclarator 2613 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2611 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2614 2612 | '(' type_ptr ')' attribute_list_opt 2615 2613 { $$ = $2->addQualifiers( $4 ); } … … 2653 2651 identifier_parameter_ptr: 2654 2652 ptrref_operator identifier_parameter_declarator 2655 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2653 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2656 2654 | ptrref_operator type_qualifier_list identifier_parameter_declarator 2657 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2655 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2658 2656 | '(' identifier_parameter_ptr ')' attribute_list_opt 2659 2657 { $$ = $2->addQualifiers( $4 ); } … … 2713 2711 type_parameter_ptr: 2714 2712 ptrref_operator type_parameter_redeclarator 2715 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2713 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2716 2714 | ptrref_operator type_qualifier_list type_parameter_redeclarator 2717 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2715 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2718 2716 | '(' type_parameter_ptr ')' attribute_list_opt 2719 2717 { $$ = $2->addQualifiers( $4 ); } … … 2756 2754 abstract_ptr: 2757 2755 ptrref_operator 2758 { $$ = DeclarationNode::newPointer( 0 ); }2756 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2759 2757 | ptrref_operator type_qualifier_list 2760 { $$ = DeclarationNode::newPointer( $2 ); }2758 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2761 2759 | ptrref_operator abstract_declarator 2762 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2760 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2763 2761 | ptrref_operator type_qualifier_list abstract_declarator 2764 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2762 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2765 2763 | '(' abstract_ptr ')' attribute_list_opt 2766 2764 { $$ = $2->addQualifiers( $4 ); } … … 2845 2843 abstract_parameter_ptr: 2846 2844 ptrref_operator 2847 { $$ = DeclarationNode::newPointer( nullptr ); }2845 { $$ = DeclarationNode::newPointer( nullptr, $1 ); } 2848 2846 | ptrref_operator type_qualifier_list 2849 { $$ = DeclarationNode::newPointer( $2 ); }2847 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2850 2848 | ptrref_operator abstract_parameter_declarator 2851 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }2849 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); } 2852 2850 | ptrref_operator type_qualifier_list abstract_parameter_declarator 2853 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2851 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2854 2852 | '(' abstract_parameter_ptr ')' attribute_list_opt 2855 2853 { $$ = $2->addQualifiers( $4 ); } … … 2924 2922 variable_abstract_ptr: 2925 2923 ptrref_operator 2926 { $$ = DeclarationNode::newPointer( 0 ); }2924 { $$ = DeclarationNode::newPointer( 0, $1 ); } 2927 2925 | ptrref_operator type_qualifier_list 2928 { $$ = DeclarationNode::newPointer( $2 ); }2926 { $$ = DeclarationNode::newPointer( $2, $1 ); } 2929 2927 | ptrref_operator variable_abstract_declarator 2930 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }2928 { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2931 2929 | ptrref_operator type_qualifier_list variable_abstract_declarator 2932 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }2930 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); } 2933 2931 | '(' variable_abstract_ptr ')' attribute_list_opt 2934 2932 { $$ = $2->addQualifiers( $4 ); } … … 2970 2968 // No SUE declaration in parameter list. 2971 2969 ptrref_operator type_specifier_nobody 2972 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2970 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2973 2971 | type_qualifier_list ptrref_operator type_specifier_nobody 2974 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2972 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2975 2973 | ptrref_operator cfa_abstract_function 2976 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2974 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2977 2975 | type_qualifier_list ptrref_operator cfa_abstract_function 2978 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2976 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2979 2977 | ptrref_operator cfa_identifier_parameter_declarator_tuple 2980 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }2978 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 2981 2979 | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple 2982 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }2980 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 2983 2981 ; 2984 2982 … … 3058 3056 cfa_abstract_ptr: // CFA 3059 3057 ptrref_operator type_specifier 3060 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3058 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3061 3059 | type_qualifier_list ptrref_operator type_specifier 3062 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3060 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3063 3061 | ptrref_operator cfa_abstract_function 3064 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3062 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3065 3063 | type_qualifier_list ptrref_operator cfa_abstract_function 3066 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3064 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3067 3065 | ptrref_operator cfa_abstract_declarator_tuple 3068 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }3066 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); } 3069 3067 | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple 3070 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }3068 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); } 3071 3069 ; 3072 3070
Note: See TracChangeset
for help on using the changeset viewer.