Changeset 408ab79 for src/Parser/parser.yy
- Timestamp:
- Jan 25, 2021, 10:17:37 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 5282010
- Parents:
- 4f3a4d75
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r4f3a4d75 r408ab79 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 11 21:32:10202113 // Update Count : 46 3312 // Last Modified On : Mon Jan 25 21:41:56 2021 13 // Update Count : 4670 14 14 // 15 15 … … 63 63 extern TypedefTable typedefTable; 64 64 65 stack< LinkageSpec::Spec> linkageStack;65 stack<LinkageSpec::Spec> linkageStack; 66 66 67 67 bool appendStr( string & to, string & from ) { … … 187 187 ConstantExpr * constant = dynamic_cast<ConstantExpr *>(type->expr.get()); 188 188 if ( constant && (constant->get_constant()->get_value() == "0" || constant->get_constant()->get_value() == "1") ) { 189 type = new ExpressionNode( new CastExpr( maybeMoveBuild< Expression>(type), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ) );189 type = new ExpressionNode( new CastExpr( maybeMoveBuild<Expression>(type), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ) ); 190 190 } // if 191 191 return new ForCtrl( … … 440 440 441 441 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list 442 %type<decl> type_specifier type_specifier_nobody 442 %type<decl> type_specifier type_specifier_nobody enum_specifier_nobody 443 443 444 444 %type<decl> variable_declarator variable_ptr variable_array variable_function 445 445 %type<decl> variable_abstract_declarator variable_abstract_ptr variable_abstract_array variable_abstract_function 446 446 447 %type<decl> attribute_list_opt attribute_list attribute_ name_list attributeattribute_name447 %type<decl> attribute_list_opt attribute_list attribute_opt attribute attribute_name_list attribute_name 448 448 449 449 // initializers … … 578 578 { $$ = $2; } 579 579 | '(' compound_statement ')' // GCC, lambda expression 580 { $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement>($2) ) ) ); }580 { $$ = new ExpressionNode( new StmtExpr( dynamic_cast<CompoundStmt *>(maybeMoveBuild<Statement>($2) ) ) ); } 581 581 | type_name '.' identifier // CFA, nested type 582 582 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } … … 610 610 { 611 611 // create a GenericExpr wrapper with one association pair 612 $$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>( $3) } } );612 $$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>( $3 ) } } ); 613 613 } 614 614 | DEFAULT ':' assignment_expression 615 { $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>( $3) } } ); }615 { $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>( $3 ) } } ); } 616 616 ; 617 617 … … 743 743 switch ( $1 ) { 744 744 case OperKinds::AddressOf: 745 $$ = new ExpressionNode( new AddressExpr( maybeMoveBuild< Expression>( $2 ) ) );745 $$ = new ExpressionNode( new AddressExpr( maybeMoveBuild<Expression>( $2 ) ) ); 746 746 break; 747 747 case OperKinds::PointTo: … … 749 749 break; 750 750 case OperKinds::And: 751 $$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild< Expression>( $2 ) ) ) );751 $$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild<Expression>( $2 ) ) ) ); 752 752 break; 753 753 default: … … 762 762 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); } 763 763 | SIZEOF unary_expression 764 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild< Expression>( $2 ) ) ); }764 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild<Expression>( $2 ) ) ); } 765 765 | SIZEOF '(' type_no_function ')' 766 766 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuildType( $3 ) ) ); } 767 767 | ALIGNOF unary_expression // GCC, variable alignment 768 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild< Expression>( $2 ) ) ); }768 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild<Expression>( $2 ) ) ); } 769 769 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 770 770 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuildType( $3 ) ) ); } … … 794 794 { $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); } 795 795 | '(' VIRTUAL ')' cast_expression // CFA 796 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression>( $4 ), maybeMoveBuildType( nullptr ) ) ); }796 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild<Expression>( $4 ), maybeMoveBuildType( nullptr ) ) ); } 797 797 | '(' VIRTUAL type_no_function ')' cast_expression // CFA 798 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression>( $5 ), maybeMoveBuildType( $3 ) ) ); }798 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild<Expression>( $5 ), maybeMoveBuildType( $3 ) ) ); } 799 799 | '(' RETURN type_no_function ')' cast_expression // CFA 800 800 { SemanticError( yylloc, "Return cast is currently unimplemented." ); $$ = nullptr; } … … 977 977 assignment_expression 978 978 | comma_expression ',' assignment_expression 979 { $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression>( $3 ) ) ); }979 { $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); } 980 980 ; 981 981 … … 1102 1102 constant_expression { $$ = $1; } 1103 1103 | constant_expression ELLIPSIS constant_expression // GCC, subrange 1104 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression>( $3 ) ) ); }1104 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); } 1105 1105 | subrange // CFA, subrange 1106 1106 ; … … 1448 1448 asm_operand: // GCC 1449 1449 string_literal '(' constant_expression ')' 1450 { $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression>( $3 ) ) ); }1450 { $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild<Expression>( $3 ) ) ); } 1451 1451 | '[' IDENTIFIER ']' string_literal '(' constant_expression ')' 1452 { $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression>( $6 ) ) ); }1452 { $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild<Expression>( $6 ) ) ); } 1453 1453 ; 1454 1454 … … 1736 1736 | sue_type_specifier_nobody 1737 1737 | type_type_specifier 1738 ; 1739 1740 enum_specifier_nobody: // type specifier - {...} 1741 // Preclude SUE declarations in restricted scopes: 1742 // 1743 // int f( struct S { int i; } s1, Struct S s2 ) { struct S s3; ... } 1744 // 1745 // because it is impossible to call f due to name equivalence. 1746 basic_type_specifier 1747 | sue_type_specifier_nobody 1738 1748 ; 1739 1749 … … 2184 2194 ; 2185 2195 2196 // Cannot use attribute_list_opt because of ambiguity with enum_specifier_nobody, which already parses attributes. 2186 2197 enum_type: // enum 2187 ENUM attribute_ list_opt '{' enumerator_list comma_opt '}'2198 ENUM attribute_opt '{' enumerator_list comma_opt '}' 2188 2199 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); } 2189 | ENUM attribute_ list_opt identifier2200 | ENUM attribute_opt identifier 2190 2201 { typedefTable.makeTypedef( *$3 ); } 2191 2202 '{' enumerator_list comma_opt '}' 2192 2203 { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); } 2193 | ENUM attribute_ list_opt type_name2204 | ENUM attribute_opt typedef 2194 2205 '{' enumerator_list comma_opt '}' 2195 { $$ = DeclarationNode::newEnum( $3->type->symbolic.name, $5, true )->addQualifiers( $2 ); } 2206 { $$ = DeclarationNode::newEnum( $3->name, $5, true )->addQualifiers( $2 ); } 2207 | ENUM enum_specifier_nobody '{' enumerator_list comma_opt '}' 2208 // { $$ = DeclarationNode::newEnum( nullptr, $4, true ); } 2209 { SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; } 2210 | ENUM enum_specifier_nobody declarator '{' enumerator_list comma_opt '}' 2211 // { 2212 // typedefTable.makeTypedef( *$3->name ); 2213 // $$ = DeclarationNode::newEnum( nullptr, $5, true ); 2214 // } 2215 { SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; } 2196 2216 | enum_type_nobody 2197 2217 ; 2198 2218 2199 2219 enum_type_nobody: // enum - {...} 2200 ENUM attribute_ list_opt identifier2220 ENUM attribute_opt identifier 2201 2221 { 2202 2222 typedefTable.makeTypedef( *$3 ); 2203 2223 $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 ); 2204 2224 } 2205 | ENUM attribute_ list_opt type_name2225 | ENUM attribute_opt type_name 2206 2226 { 2207 2227 typedefTable.makeTypedef( *$3->type->symbolic.name ); … … 2220 2240 // empty 2221 2241 { $$ = nullptr; } 2222 | '=' constant_expression 2223 { $$ = $2; } 2242 // | '=' constant_expression 2243 // { $$ = $2; } 2244 | '=' initializer 2245 { $$ = $2->get_expression(); } // FIX ME: enum only deals with constant_expression 2224 2246 ; 2225 2247 … … 2403 2425 { $$ = $3; } 2404 2426 | '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements 2405 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $3 ), maybeMoveBuild< Expression>( $5 ) ) ); }2427 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $3 ), maybeMoveBuild<Expression>( $5 ) ) ); } 2406 2428 | '.' '[' push field_name_list pop ']' // CFA, tuple field selector 2407 2429 { $$ = $4; } … … 2441 2463 type_parameter: // CFA 2442 2464 type_class identifier_or_type_name 2443 { typedefTable.addToScope( *$2, TYPEDEFname, "9" ); 2465 { 2466 typedefTable.addToScope( *$2, TYPEDEFname, "9" ); 2444 2467 if ( $1 == TypeDecl::Otype ) { SemanticError( yylloc, "otype keyword is deprecated" ); } 2445 2468 if ( $1 == TypeDecl::Dtype ) { SemanticError( yylloc, "dtype keyword is deprecated" ); } … … 2738 2761 subrange: 2739 2762 constant_expression '~' constant_expression // CFA, integer subrange 2740 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression>( $3 ) ) ); }2763 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); } 2741 2764 ; 2742 2765 … … 2762 2785 | attribute_list attribute 2763 2786 { $$ = $2->addQualifiers( $1 ); } 2787 ; 2788 2789 attribute_opt: 2790 // empty 2791 { $$ = nullptr; } 2792 | attribute 2764 2793 ; 2765 2794
Note: See TracChangeset
for help on using the changeset viewer.