Changes in src/Parser/parser.yy [6a99803:fd54fef]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (29 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
r6a99803 rfd54fef 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Feb 3 18:30:12202113 // Update Count : 4 70012 // Last Modified On : Mon Jan 11 21:32:10 2021 13 // Update Count : 4633 14 14 // 15 15 … … 41 41 42 42 %{ 43 #define YYDEBUG_LEXER_TEXT ( yylval )// lexer loads this up each time43 #define YYDEBUG_LEXER_TEXT (yylval) // lexer loads this up each time 44 44 #define YYDEBUG 1 // get the pretty debugging code to compile 45 45 #define YYERROR_VERBOSE // more information in syntax errors … … 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 enum_specifier_nobody442 %type<decl> type_specifier type_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_ opt attribute attribute_name_listattribute_name447 %type<decl> attribute_list_opt attribute_list attribute_name_list attribute 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 618 618 postfix_expression: 619 619 primary_expression 620 | postfix_expression '[' assignment_expression ',' comma_expression ']'621 // { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, new ExpressionNode( build_binary_val( OperKinds::Index, $3, $5 ) ) ) ); }622 { SemanticError( yylloc, "New array subscript is currently unimplemented." ); $$ = nullptr; }623 620 | postfix_expression '[' assignment_expression ']' 624 621 // CFA, comma_expression disallowed in this context because it results in a common user error: subscripting a … … 746 743 switch ( $1 ) { 747 744 case OperKinds::AddressOf: 748 $$ = new ExpressionNode( new AddressExpr( maybeMoveBuild< Expression>( $2 ) ) );745 $$ = new ExpressionNode( new AddressExpr( maybeMoveBuild< Expression >( $2 ) ) ); 749 746 break; 750 747 case OperKinds::PointTo: … … 752 749 break; 753 750 case OperKinds::And: 754 $$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild< Expression>( $2 ) ) ) );751 $$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild< Expression >( $2 ) ) ) ); 755 752 break; 756 753 default: … … 765 762 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); } 766 763 | SIZEOF unary_expression 767 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild< Expression>( $2 ) ) ); }764 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild< Expression >( $2 ) ) ); } 768 765 | SIZEOF '(' type_no_function ')' 769 766 { $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuildType( $3 ) ) ); } 770 767 | ALIGNOF unary_expression // GCC, variable alignment 771 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild< Expression>( $2 ) ) ); }768 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild< Expression >( $2 ) ) ); } 772 769 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 773 770 { $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuildType( $3 ) ) ); } … … 797 794 { $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); } 798 795 | '(' VIRTUAL ')' cast_expression // CFA 799 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression>( $4 ), maybeMoveBuildType( nullptr ) ) ); }796 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $4 ), maybeMoveBuildType( nullptr ) ) ); } 800 797 | '(' VIRTUAL type_no_function ')' cast_expression // CFA 801 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression>( $5 ), maybeMoveBuildType( $3 ) ) ); }798 { $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild< Expression >( $5 ), maybeMoveBuildType( $3 ) ) ); } 802 799 | '(' RETURN type_no_function ')' cast_expression // CFA 803 800 { SemanticError( yylloc, "Return cast is currently unimplemented." ); $$ = nullptr; } … … 980 977 assignment_expression 981 978 | comma_expression ',' assignment_expression 982 { $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild< Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }979 { $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 983 980 ; 984 981 … … 1105 1102 constant_expression { $$ = $1; } 1106 1103 | constant_expression ELLIPSIS constant_expression // GCC, subrange 1107 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }1104 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 1108 1105 | subrange // CFA, subrange 1109 1106 ; … … 1250 1247 { $$ = new StatementNode( build_computedgoto( $3 ) ); } 1251 1248 // A semantic check is required to ensure fallthru appears only in the body of a choose statement. 1252 | fall_through_name ';' // CFA1249 | fall_through_name ';' // CFA 1253 1250 { $$ = new StatementNode( build_branch( BranchStmt::FallThrough ) ); } 1254 | fall_through_name identifier_or_type_name ';' // CFA1251 | fall_through_name identifier_or_type_name ';' // CFA 1255 1252 { $$ = new StatementNode( build_branch( $2, BranchStmt::FallThrough ) ); } 1256 1253 | fall_through_name DEFAULT ';' // CFA … … 1451 1448 asm_operand: // GCC 1452 1449 string_literal '(' constant_expression ')' 1453 { $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression>( $3 ) ) ); }1450 { $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression >( $3 ) ) ); } 1454 1451 | '[' IDENTIFIER ']' string_literal '(' constant_expression ')' 1455 { $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression>( $6 ) ) ); }1452 { $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression >( $6 ) ) ); } 1456 1453 ; 1457 1454 … … 1739 1736 | sue_type_specifier_nobody 1740 1737 | type_type_specifier 1741 ;1742 1743 enum_specifier_nobody: // type specifier - {...}1744 // Preclude SUE declarations in restricted scopes (see type_specifier_nobody)1745 basic_type_specifier1746 | sue_type_specifier_nobody1747 1738 ; 1748 1739 … … 2013 2004 ; 2014 2005 2006 fred: 2007 // empty 2008 { yyy = false; } 2009 ; 2010 2015 2011 aggregate_type: // struct, union 2016 2012 aggregate_key attribute_list_opt … … 2018 2014 '{' field_declaration_list_opt '}' type_parameters_opt 2019 2015 { $$ = DeclarationNode::newAggregate( $1, nullptr, $7, $5, true )->addQualifiers( $2 ); } 2020 | aggregate_key attribute_list_opt identifier 2016 | aggregate_key attribute_list_opt identifier fred 2021 2017 { 2022 2018 typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef … … 2024 2020 } 2025 2021 '{' field_declaration_list_opt '}' type_parameters_opt 2026 { $$ = DeclarationNode::newAggregate( $1, $3, $ 8, $6, true )->addQualifiers( $2 ); }2027 | aggregate_key attribute_list_opt type_name 2022 { $$ = DeclarationNode::newAggregate( $1, $3, $9, $7, true )->addQualifiers( $2 ); } 2023 | aggregate_key attribute_list_opt type_name fred 2028 2024 { 2029 2025 // for type_name can be a qualified type name S.T, in which case only the last name in the chain needs a typedef (other names in the chain should already have one) … … 2032 2028 } 2033 2029 '{' field_declaration_list_opt '}' type_parameters_opt 2034 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $ 8, $6, true )->addQualifiers( $2 ); }2030 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $9, $7, true )->addQualifiers( $2 ); } 2035 2031 | aggregate_type_nobody 2036 2032 ; … … 2044 2040 2045 2041 aggregate_type_nobody: // struct, union - {...} 2046 aggregate_key attribute_list_opt identifier 2042 aggregate_key attribute_list_opt identifier fred 2047 2043 { 2048 2044 typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); … … 2050 2046 $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 ); 2051 2047 } 2052 | aggregate_key attribute_list_opt type_name 2048 | aggregate_key attribute_list_opt type_name fred 2053 2049 { 2054 2050 forall = false; // reset … … 2188 2184 ; 2189 2185 2190 // Cannot use attribute_list_opt because of ambiguity with enum_specifier_nobody, which already parses attribute.2191 // Hence, only a single attribute is allowed after the "ENUM".2192 2186 enum_type: // enum 2193 ENUM attribute_ opt '{' enumerator_list comma_opt '}'2187 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' 2194 2188 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); } 2195 | ENUM attribute_ opt identifier2189 | ENUM attribute_list_opt identifier 2196 2190 { typedefTable.makeTypedef( *$3 ); } 2197 2191 '{' enumerator_list comma_opt '}' 2198 2192 { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); } 2199 | ENUM attribute_ opt typedef // enum cannot be generic2193 | ENUM attribute_list_opt type_name 2200 2194 '{' enumerator_list comma_opt '}' 2201 { $$ = DeclarationNode::newEnum( $3->name, $5, true )->addQualifiers( $2 ); } 2202 | ENUM enum_specifier_nobody '{' enumerator_list comma_opt '}' 2203 // { $$ = DeclarationNode::newEnum( nullptr, $4, true ); } 2204 { SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; } 2205 | ENUM enum_specifier_nobody declarator '{' enumerator_list comma_opt '}' 2206 // { 2207 // typedefTable.makeTypedef( *$3->name ); 2208 // $$ = DeclarationNode::newEnum( nullptr, $5, true ); 2209 // } 2210 { SemanticError( yylloc, "Typed enumeration is currently unimplemented." ); $$ = nullptr; } 2195 { $$ = DeclarationNode::newEnum( $3->type->symbolic.name, $5, true )->addQualifiers( $2 ); } 2211 2196 | enum_type_nobody 2212 2197 ; 2213 2198 2214 2199 enum_type_nobody: // enum - {...} 2215 ENUM attribute_ opt identifier2200 ENUM attribute_list_opt identifier 2216 2201 { 2217 2202 typedefTable.makeTypedef( *$3 ); 2218 2203 $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 ); 2219 2204 } 2220 | ENUM attribute_ opt type_name // enum cannot be generic2205 | ENUM attribute_list_opt type_name 2221 2206 { 2222 2207 typedefTable.makeTypedef( *$3->type->symbolic.name ); … … 2235 2220 // empty 2236 2221 { $$ = nullptr; } 2237 // | '=' constant_expression 2238 // { $$ = $2; } 2239 | '=' initializer 2240 { $$ = $2->get_expression(); } // FIX ME: enum only deals with constant_expression 2222 | '=' constant_expression 2223 { $$ = $2; } 2241 2224 ; 2242 2225 … … 2420 2403 { $$ = $3; } 2421 2404 | '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements 2422 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression>( $3 ), maybeMoveBuild<Expression>( $5 ) ) ); }2405 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $3 ), maybeMoveBuild< Expression >( $5 ) ) ); } 2423 2406 | '.' '[' push field_name_list pop ']' // CFA, tuple field selector 2424 2407 { $$ = $4; } … … 2458 2441 type_parameter: // CFA 2459 2442 type_class identifier_or_type_name 2460 { 2461 typedefTable.addToScope( *$2, TYPEDEFname, "9" ); 2462 if ( $1 == TypeDecl::Otype ) { SemanticError( yylloc, "otype keyword is deprecated, use T " ); } 2463 if ( $1 == TypeDecl::Dtype ) { SemanticError( yylloc, "dtype keyword is deprecated, use T &" ); } 2464 if ( $1 == TypeDecl::Ttype ) { SemanticError( yylloc, "ttype keyword is deprecated, use T ..." ); } 2443 { typedefTable.addToScope( *$2, TYPEDEFname, "9" ); 2444 if ( $1 == TypeDecl::Otype ) { SemanticError( yylloc, "otype keyword is deprecated" ); } 2445 if ( $1 == TypeDecl::Dtype ) { SemanticError( yylloc, "dtype keyword is deprecated" ); } 2446 if ( $1 == TypeDecl::Ttype ) { SemanticError( yylloc, "ttype keyword is deprecated" ); } 2465 2447 } 2466 2448 type_initializer_opt assertion_list_opt … … 2756 2738 subrange: 2757 2739 constant_expression '~' constant_expression // CFA, integer subrange 2758 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }2740 { $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild< Expression >( $1 ), maybeMoveBuild< Expression >( $3 ) ) ); } 2759 2741 ; 2760 2742 … … 2780 2762 | attribute_list attribute 2781 2763 { $$ = $2->addQualifiers( $1 ); } 2782 ;2783 2784 attribute_opt:2785 // empty2786 { $$ = nullptr; }2787 | attribute2788 2764 ; 2789 2765 … … 3190 3166 | '[' ']' multi_array_dimension 3191 3167 { $$ = DeclarationNode::newArray( 0, 0, false )->addArray( $3 ); } 3192 | '[' push assignment_expression pop ',' comma_expression ']'3193 { $$ = DeclarationNode::newArray( $3, 0, false )->addArray( DeclarationNode::newArray( $6, 0, false ) ); }3194 // { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }3195 3168 | multi_array_dimension 3196 3169 ;
Note:
See TracChangeset
for help on using the changeset viewer.