Changes in src/Parser/parser.yy [d8454b9:374cb117]
- File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rd8454b9 r374cb117 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat May 14 09:16:22202213 // Update Count : 5 40112 // Last Modified On : Mon Mar 14 16:35:29 2022 13 // Update Count : 5276 14 14 // 15 15 … … 54 54 #include "Common/SemanticError.h" // error_str 55 55 #include "Common/utility.h" // for maybeMoveBuild, maybeBuild, CodeLo... 56 57 #include "SynTree/Attribute.h" // for Attribute58 56 59 57 extern DeclarationNode * parseTree; … … 95 93 } // appendStr 96 94 97 DeclarationNode * distAttr( DeclarationNode * typeSpec, DeclarationNode * declList ) { 98 // distribute declaration_specifier across all declared variables, e.g., static, const, but not __attribute__. 99 assert( declList ); 100 // printf( "distAttr1 typeSpec %p\n", typeSpec ); typeSpec->print( std::cout ); 101 DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( typeSpec ); 102 // printf( "distAttr2 cl %p\n", cl ); cl->type->print( std::cout ); 103 // cl->type->aggregate.name = cl->type->aggInst.aggregate->aggregate.name; 104 95 DeclarationNode * distAttr( DeclarationNode * specifier, DeclarationNode * declList ) { 96 // distribute declaration_specifier across all declared variables, e.g., static, const, __attribute__. 97 DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( specifier ); 105 98 for ( cur = dynamic_cast<DeclarationNode *>( cur->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) { 106 99 cl->cloneBaseType( cur ); 107 100 } // for 108 101 declList->addType( cl ); 109 // printf( "distAttr3 declList %p\n", declList ); declList->print( std::cout, 0 );110 102 return declList; 111 103 } // distAttr … … 119 111 120 112 void distInl( DeclarationNode * declaration ) { 121 // distribute INLINEacross all declarations113 // distribute EXTENSION across all declarations 122 114 for ( DeclarationNode *iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) { 123 115 iter->set_inLine( true ); … … 179 171 if ( ! ( typeSpec->type && (typeSpec->type->kind == TypeData::Aggregate || typeSpec->type->kind == TypeData::Enum) ) ) { 180 172 stringstream ss; 181 // printf( "fieldDecl1 typeSpec %p\n", typeSpec ); typeSpec->type->print( std::cout);173 typeSpec->type->print( ss ); 182 174 SemanticWarning( yylloc, Warning::SuperfluousDecl, ss.str().c_str() ); 183 175 return nullptr; 184 176 } // if 185 // printf( "fieldDecl2 typeSpec %p\n", typeSpec ); typeSpec->type->print( std::cout );186 177 fieldList = DeclarationNode::newName( nullptr ); 187 178 } // if 188 // return distAttr( typeSpec, fieldList ); // mark all fields in list 189 190 // printf( "fieldDecl3 typeSpec %p\n", typeSpec ); typeSpec->print( std::cout, 0 ); 191 DeclarationNode * temp = distAttr( typeSpec, fieldList ); // mark all fields in list 192 // printf( "fieldDecl4 temp %p\n", temp ); temp->print( std::cout, 0 ); 193 return temp; 179 return distAttr( typeSpec, fieldList ); // mark all fields in list 194 180 } // fieldDecl 195 181 … … 1235 1221 1236 1222 iteration_statement: 1237 WHILE '(' ')' statement %prec THEN// CFA => while ( 1 )1223 WHILE '(' ')' statement // CFA => while ( 1 ) 1238 1224 { $$ = new StatementNode( build_while( new CondCtl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) ); } 1239 | WHILE '(' ')' statement ELSE statement // CFA1240 {1241 $$ = new StatementNode( build_while( new CondCtl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) );1242 SemanticWarning( yylloc, Warning::SuperfluousElse );1243 }1244 1225 | WHILE '(' conditional_declaration ')' statement %prec THEN 1245 1226 { $$ = new StatementNode( build_while( $3, maybe_build_compound( $5 ) ) ); } … … 1248 1229 | DO statement WHILE '(' ')' ';' // CFA => do while( 1 ) 1249 1230 { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); } 1250 | DO statement WHILE '(' ')' ELSE statement // CFA 1251 { 1252 $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); 1253 SemanticWarning( yylloc, Warning::SuperfluousElse ); 1254 } 1255 | DO statement WHILE '(' comma_expression ')' ';' 1231 | DO statement WHILE '(' comma_expression ')' ';' %prec THEN 1256 1232 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); } 1257 1233 | DO statement WHILE '(' comma_expression ')' ELSE statement // CFA 1258 1234 { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ), $8 ) ); } 1259 | FOR '(' ')' statement %prec THEN// CFA => for ( ;; )1235 | FOR '(' ')' statement // CFA => for ( ;; ) 1260 1236 { $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) ); } 1261 | FOR '(' ')' statement ELSE statement // CFA1262 {1263 $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) );1264 SemanticWarning( yylloc, Warning::SuperfluousElse );1265 }1266 1237 | FOR '(' for_control_expression_list ')' statement %prec THEN 1267 1238 { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); } … … 1634 1605 declaration: // old & new style declarations 1635 1606 c_declaration ';' 1636 {1637 // printf( "C_DECLARATION1 %p %s\n", $$, $$->name ? $$->name->c_str() : "(nil)" );1638 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {1639 // printf( "\tattr %s\n", attr->name.c_str() );1640 // } // for1641 }1642 1607 | cfa_declaration ';' // CFA 1643 1608 | static_assert // C11 … … 1845 1810 basic_type_specifier 1846 1811 | sue_type_specifier 1847 {1848 // printf( "sue_type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );1849 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {1850 // printf( "\tattr %s\n", attr->name.c_str() );1851 // } // for1852 }1853 1812 | type_type_specifier 1854 1813 ; … … 2067 2026 sue_declaration_specifier: // struct, union, enum + storage class + type specifier 2068 2027 sue_type_specifier 2069 {2070 // printf( "sue_declaration_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );2071 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2072 // printf( "\tattr %s\n", attr->name.c_str() );2073 // } // for2074 }2075 2028 | declaration_qualifier_list sue_type_specifier 2076 2029 { $$ = $2->addQualifiers( $1 ); } … … 2083 2036 sue_type_specifier: // struct, union, enum + type specifier 2084 2037 elaborated_type 2085 {2086 // printf( "sue_type_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );2087 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2088 // printf( "\tattr %s\n", attr->name.c_str() );2089 // } // for2090 }2091 2038 | type_qualifier_list 2092 2039 { if ( $1->type != nullptr && $1->type->forall ) forall = true; } // remember generic type … … 2161 2108 elaborated_type: // struct, union, enum 2162 2109 aggregate_type 2163 {2164 // printf( "elaborated_type %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );2165 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {2166 // printf( "\tattr %s\n", attr->name.c_str() );2167 // } // for2168 }2169 2110 | enum_type 2170 2111 ; … … 2186 2127 } 2187 2128 '{' field_declaration_list_opt '}' type_parameters_opt 2188 { 2189 // printf( "aggregate_type1 %s\n", $3.str->c_str() ); 2190 // if ( $2 ) 2191 // for ( Attribute * attr: reverseIterate( $2->attributes ) ) { 2192 // printf( "copySpecifiers12 %s\n", attr->name.c_str() ); 2193 // } // for 2194 $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 ); 2195 // printf( "aggregate_type2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2196 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2197 // printf( "aggregate_type3 %s\n", attr->name.c_str() ); 2198 // } // for 2199 } 2129 { $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 ); } 2200 2130 | aggregate_key attribute_list_opt TYPEDEFname // unqualified type name 2201 2131 { … … 2205 2135 '{' field_declaration_list_opt '}' type_parameters_opt 2206 2136 { 2207 // printf( "AGG3\n" );2208 2137 DeclarationNode::newFromTypedef( $3 ); 2209 2138 $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 ); … … 2216 2145 '{' field_declaration_list_opt '}' type_parameters_opt 2217 2146 { 2218 // printf( "AGG4\n" );2219 2147 DeclarationNode::newFromTypeGen( $3, nullptr ); 2220 2148 $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 ); … … 2293 2221 field_declaration: 2294 2222 type_specifier field_declaring_list_opt ';' 2295 { 2296 // printf( "type_specifier1 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2297 $$ = fieldDecl( $1, $2 ); 2298 // printf( "type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" ); 2299 // for ( Attribute * attr: reverseIterate( $$->attributes ) ) { 2300 // printf( "\tattr %s\n", attr->name.c_str() ); 2301 // } // for 2302 } 2223 { $$ = fieldDecl( $1, $2 ); } 2303 2224 | EXTENSION type_specifier field_declaring_list_opt ';' // GCC 2304 2225 { $$ = fieldDecl( $2, $3 ); distExt( $$ ); } … … 2382 2303 ; 2383 2304 2384 enum_type: 2305 enum_type: // static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed ); // enum 2385 2306 ENUM attribute_list_opt '{' enumerator_list comma_opt '}' 2386 2307 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); } … … 2397 2318 { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } 2398 2319 2399 $$ = DeclarationNode::newEnum( nullptr, $7, true , $3 )->addQualifiers( $5);2400 } 2401 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt 2320 $$ = DeclarationNode::newEnum( nullptr, $7, true ) ->addQualifiers( $5 ) -> addEnumBase( $3 ); 2321 } 2322 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt // Question: why attributes/qualifier after identifier 2402 2323 { 2403 2324 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } … … 2406 2327 '{' enumerator_list comma_opt '}' 2407 2328 { 2408 $$ = DeclarationNode::newEnum( $6, $10, true , $3 )->addQualifiers( $5 )->addQualifiers( $7);2329 $$ = DeclarationNode::newEnum( $6, $10, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 ); 2409 2330 } 2410 2331 | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt typedef_name attribute_list_opt '{' enumerator_list comma_opt '}' … … 2412 2333 if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); } 2413 2334 typedefTable.makeTypedef( *$6->name ); 2414 $$ = DeclarationNode::newEnum( $6->name, $9, true , $3 )->addQualifiers( $5 )->addQualifiers( $7);2335 $$ = DeclarationNode::newEnum( $6->name, $9, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 ); 2415 2336 } 2416 2337 | enum_type_nobody … … 2909 2830 // empty 2910 2831 { $$ = nullptr; forall = false; } 2911 | WITH '(' tuple_expression_list ')' attribute_list_opt 2912 { 2913 $$ = $3; forall = false; 2914 if ( $5 ) { 2915 SemanticError( yylloc, "Attributes cannot be associated with function body. Move attribute(s) before \"with\" clause." ); 2916 $$ = nullptr; 2917 } // if 2918 } 2832 | WITH '(' tuple_expression_list ')' 2833 { $$ = $3; forall = false; } 2919 2834 ; 2920 2835
Note:
See TracChangeset
for help on using the changeset viewer.