Changeset 8024bc8 for src/Parser
- Timestamp:
- Sep 18, 2017, 11:02:23 AM (8 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:
- 6994d8c
- Parents:
- ed235b6 (diff), 5f782f7 (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:
-
- 3 edited
-
ExpressionNode.cc (modified) (6 diffs)
-
ParseNode.h (modified) (5 diffs)
-
parser.yy (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
red235b6 r8024bc8 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Sep 12 10:00:29201713 // Update Count : 6 7212 // Last Modified On : Thu Sep 14 23:09:34 2017 13 // Update Count : 690 14 14 // 15 15 … … 250 250 sepString( str, units, '"' ); // separate constant from units 251 251 252 BasicType::Kind strtype = BasicType::Char; // default string type253 switch ( str[0] ) { // str has >= 2 characters, i.e, null string "" 252 Type * strtype; 253 switch ( str[0] ) { // str has >= 2 characters, i.e, null string "" => safe to look at subscripts 0/1 254 254 case 'u': 255 if ( str[1] == '8' ) break; // utf-8 characters 256 strtype = BasicType::ShortUnsignedInt; 255 if ( str[1] == '8' ) goto Default; // utf-8 characters => array of char 256 // lookup type of associated typedef 257 strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char16_t", false ); 257 258 break; 258 259 case 'U': 259 strtype = BasicType::UnsignedInt;260 strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char32_t", false ); 260 261 break; 261 262 case 'L': 262 strtype = BasicType::SignedInt;263 strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "wchar_t", false ); 263 264 break; 265 Default: // char default string type 266 default: 267 strtype = new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ); 264 268 } // switch 265 ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), strtype ),269 ArrayType * at = new ArrayType( noQualifiers, strtype, 266 270 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"' 267 271 false, false ); … … 344 348 345 349 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) { 346 Type * targetType = maybeMoveBuildType( decl_node ); 347 Expression * castArg = maybeMoveBuild< Expression >( expr_node ); 348 return new VirtualCastExpr( castArg, targetType ); 350 return new VirtualCastExpr( maybeMoveBuild< Expression >( expr_node ), maybeMoveBuildType( decl_node ) ); 349 351 } // build_virtual_cast 350 352 351 353 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) { 352 UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) ); 353 return ret; 354 return new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) ); 354 355 } // build_fieldSel 355 356 … … 361 362 return ret; 362 363 } // build_pfieldSel 363 364 Expression * build_addressOf( ExpressionNode * expr_node ) {365 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );366 } // build_addressOf367 368 Expression * build_sizeOfexpr( ExpressionNode * expr_node ) {369 return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) );370 } // build_sizeOfexpr371 372 Expression * build_sizeOftype( DeclarationNode * decl_node ) {373 return new SizeofExpr( maybeMoveBuildType( decl_node ) );374 } // build_sizeOftype375 376 Expression * build_alignOfexpr( ExpressionNode * expr_node ) {377 return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) );378 } // build_alignOfexpr379 380 Expression * build_alignOftype( DeclarationNode * decl_node ) {381 return new AlignofExpr( maybeMoveBuildType( decl_node) );382 } // build_alignOftype383 364 384 365 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ) { … … 422 403 } // build_cond 423 404 424 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {425 return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) );426 } // build_comma427 428 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ) {429 return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) );430 } // build_attrexpr431 432 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node ) {433 return new AttrExpr( var, maybeMoveBuildType( decl_node ) );434 } // build_attrtype435 436 405 Expression * build_tuple( ExpressionNode * expr_node ) { 437 406 list< Expression * > exprs; … … 445 414 return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr ); 446 415 } // build_func 447 448 Expression * build_range( ExpressionNode * low, ExpressionNode * high ) {449 return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) );450 } // build_range451 452 Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand ) {453 return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );454 } // build_asmexpr455 456 Expression * build_valexpr( StatementNode * s ) {457 return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) );458 } // build_valexpr459 460 Expression * build_typevalue( DeclarationNode * decl ) {461 return new TypeExpr( maybeMoveBuildType( decl ) );462 } // build_typevalue463 416 464 417 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) { -
src/Parser/ParseNode.h
red235b6 r8024bc8 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Sep 10 09:56:32201713 // Update Count : 8 0112 // Last Modified On : Thu Sep 14 23:09:39 2017 13 // Update Count : 815 14 14 // 15 15 … … 122 122 123 123 template<typename T> 124 bool isExpressionType() const { 125 return nullptr != dynamic_cast<T>(expr.get()); 126 } 124 bool isExpressionType() const { return nullptr != dynamic_cast<T>(expr.get()); } 127 125 128 126 Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); } … … 172 170 173 171 NameExpr * build_varref( const std::string * name ); 174 Expression * build_typevalue( DeclarationNode * decl );175 172 176 173 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ); … … 178 175 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ); 179 176 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member ); 180 Expression * build_addressOf( ExpressionNode * expr_node );181 Expression * build_sizeOfexpr( ExpressionNode * expr_node );182 Expression * build_sizeOftype( DeclarationNode * decl_node );183 Expression * build_alignOfexpr( ExpressionNode * expr_node );184 Expression * build_alignOftype( DeclarationNode * decl_node );185 177 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ); 186 178 Expression * build_and( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); … … 191 183 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); 192 184 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 ); 193 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 );194 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node );195 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node );196 185 Expression * build_tuple( ExpressionNode * expr_node = nullptr ); 197 186 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ); 198 Expression * build_range( ExpressionNode * low, ExpressionNode * high );199 Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand );200 Expression * build_valexpr( StatementNode * s );201 187 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ); 202 188 -
src/Parser/parser.yy
red235b6 r8024bc8 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 11 18:12:00201713 // Update Count : 2 78712 // Last Modified On : Thu Sep 14 23:07:12 2017 13 // Update Count : 2815 14 14 // 15 15 … … 56 56 #include "LinkageSpec.h" 57 57 #include "Common/SemanticError.h" // error_str 58 #include "Common/utility.h" // for maybeMoveBuild, maybeBuild, CodeLo... 58 59 59 60 extern DeclarationNode * parseTree; … … 438 439 { $$ = $2; } 439 440 | '(' compound_statement ')' // GCC, lambda expression 440 { $$ = new ExpressionNode( build_valexpr( $2) ); }441 { $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); } 441 442 | primary_expression '{' argument_expression_list '}' // CFA, constructor call 442 443 { … … 562 563 switch ( $1 ) { 563 564 case OperKinds::AddressOf: 564 $$ = new ExpressionNode( build_addressOf( $2) );565 $$ = new ExpressionNode( new AddressExpr( maybeMoveBuild< Expression >( $2 ) ) ); 565 566 break; 566 567 case OperKinds::PointTo: … … 568 569 break; 569 570 case OperKinds::And: 570 $$ = new ExpressionNode( new AddressExpr( build_addressOf( $2) ) );571 $$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild< Expression >( $2 ) ) ) ); 571 572 break; 572 573 default: … … 581 582 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); } 582 583 | SIZEOF unary_expression 583 { $$ = new ExpressionNode( build_sizeOfexpr( $2) ); }584 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild< Expression >( $2 ) ) ); } 584 585 | SIZEOF '(' type_no_function ')' 585 { $$ = new ExpressionNode( build_sizeOftype( $3) ); }586 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuildType( $3 ) ) ); } 586 587 | ALIGNOF unary_expression // GCC, variable alignment 587 { $$ = new ExpressionNode( build_alignOfexpr( $2) ); }588 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild< Expression >( $2 ) ) ); } 588 589 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 589 { $$ = new ExpressionNode( build_alignOftype( $3) ); }590 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuildType( $3 ) ) ); } 590 591 | OFFSETOF '(' type_no_function ',' no_attr_identifier ')' 591 592 { $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); } 592 593 | ATTR_IDENTIFIER 593 { $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), nullptr) ); }594 { $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ) ) ); } 594 595 | ATTR_IDENTIFIER '(' argument_expression ')' 595 { $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), $3) ); }596 { $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 596 597 | ATTR_IDENTIFIER '(' type ')' 597 { $$ = new ExpressionNode( build_attrtype( build_varref( $1 ), $3) ); }598 { $$ = new ExpressionNode( new AttrExpr( build_varref( $1 ), maybeMoveBuildType( $3 ) ) ); } 598 599 ; 599 600 … … 618 619 // VIRTUAL cannot be opt because of look ahead issues 619 620 | '(' VIRTUAL ')' cast_expression 620 { $$ = new ExpressionNode( build_virtual_cast( nullptr, $4) ); }621 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $4 ), maybeMoveBuildType( nullptr ) ) ); } 621 622 | '(' VIRTUAL type_no_function ')' cast_expression 622 { $$ = new ExpressionNode( build_virtual_cast( $3, $5) ); }623 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $5 ), maybeMoveBuildType( $3 ) ) ); } 623 624 // | '(' type_no_function ')' tuple 624 625 // { $$ = new ExpressionNode( build_cast( $2, $4 ) ); } … … 771 772 assignment_expression 772 773 | comma_expression ',' assignment_expression 773 { $$ = new ExpressionNode( build_comma( $1, $3) ); }774 { $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 774 775 ; 775 776 … … 894 895 constant_expression { $$ = $1; } 895 896 | constant_expression ELLIPSIS constant_expression // GCC, subrange 896 { $$ = new ExpressionNode( build_range( $1, $3) ); }897 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 897 898 | subrange // CFA, subrange 898 899 ; … … 1154 1155 asm_operand: // GCC 1155 1156 string_literal '(' constant_expression ')' 1156 { $$ = new ExpressionNode( build_asmexpr( 0, $1, $3) ); }1157 { $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ), $1, maybeMoveBuild< Expression >( $3 ) ) ); } 1157 1158 | '[' constant_expression ']' string_literal '(' constant_expression ')' 1158 { $$ = new ExpressionNode( build_asmexpr( $2, $4, $6) ); }1159 { $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( $2 ), $4, maybeMoveBuild< Expression >( $6 ) ) ); } 1159 1160 ; 1160 1161 … … 1165 1166 { $$ = new ExpressionNode( $1 ); } 1166 1167 | asm_clobbers_list_opt ',' string_literal 1167 // set_last return ParseNode *1168 // set_last returns ParseNode * 1168 1169 { $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); } 1169 1170 ; … … 2088 2089 { $$ = $3; } 2089 2090 | '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements 2090 { $$ = new ExpressionNode( build_range( $3, $5) ); }2091 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $3 ), maybeMoveBuild< Expression >( $5 ) ) ); } 2091 2092 | '.' '[' push field_list pop ']' // CFA, tuple field selector 2092 2093 { $$ = $4; } … … 2165 2166 type_list: // CFA 2166 2167 type 2167 { $$ = new ExpressionNode( build_typevalue( $1) ); }2168 { $$ = new ExpressionNode( new TypeExpr( maybeMoveBuildType( $1 ) ) ); } 2168 2169 | assignment_expression 2169 2170 | type_list ',' type 2170 { $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( build_typevalue( $3) ) ) ); }2171 { $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) ) ); } 2171 2172 | type_list ',' assignment_expression 2172 2173 { $$ = (ExpressionNode *)( $1->set_last( $3 )); } … … 2406 2407 subrange: 2407 2408 constant_expression '~' constant_expression // CFA, integer subrange 2408 { $$ = new ExpressionNode( build_range( $1, $3) ); }2409 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 2409 2410 ; 2410 2411
Note:
See TracChangeset
for help on using the changeset viewer.