Changes in / [7de22b28:777ed2b]
- Location:
- src/Parser
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/TypedefTable.cc
r7de22b28 r777ed2b 10 10 // Created On : Sat May 16 15:20:13 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 22 06:14:39201813 // Update Count : 2 0612 // Last Modified On : Wed Jul 11 11:47:47 2018 13 // Update Count : 255 14 14 // 15 15 … … 77 77 auto scope = kindTable.currentScope(); 78 78 debugPrint( cerr << "Adding current at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << endl ); 79 auto ret = kindTable.insertAt( scope, identifier, kind ); 80 //if ( ! ret.second ) ret.first->second = kind; // exists => update 81 assert( ret.first->second == kind ); // exists 79 kindTable.insertAt( scope, identifier, kind ); 82 80 } // TypedefTable::addToScope 83 81 84 82 void TypedefTable::addToEnclosingScope( const string & identifier, int kind, const char * locn __attribute__((unused)) ) { 85 a ssert( kindTable.currentScope() >= 1 + level );86 auto scope = kindTable.currentScope() - 1 -level;87 debugPrint( cerr << "Adding enclosing at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << " level " << level << endl );83 auto scope = kindTable.currentScope() - 1 - kindTable.getNote( kindTable.currentScope() - 1 ).level; 84 // auto scope = level - kindTable.getNote( kindTable.currentScope() - 1 ).level; 85 debugPrint( cerr << "Adding enclosing at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << " level " << level << " note " << kindTable.getNote( kindTable.currentScope() - 1 ).level << endl ); 88 86 auto ret = kindTable.insertAt( scope, identifier, kind ); 89 if ( ! ret.second ) ret.first->second = kind; 87 if ( ! ret.second ) ret.first->second = kind; // exists => update 90 88 } // TypedefTable::addToEnclosingScope 91 89 92 90 void TypedefTable::enterScope() { 93 kindTable.beginScope( 0);94 debugPrint( cerr << "Entering scope " << kindTable.currentScope() << endl; print() );91 kindTable.beginScope( (Note){ 0, false } ); 92 debugPrint( cerr << "Entering scope " << kindTable.currentScope() << " level " << level << endl; print() ); 95 93 } // TypedefTable::enterScope 96 94 … … 100 98 } // TypedefTable::leaveScope 101 99 100 void TypedefTable::up( bool forall ) { 101 level += 1; 102 kindTable.getNote( kindTable.currentScope() ) = (Note){ level, forall | getEnclForall() }; 103 debugPrint( cerr << "Up " << " level " << level << " note " << kindTable.getNote( level ).level << ", " << kindTable.getNote( level ).forall << endl; ); 104 } // TypedefTable::up 105 106 void TypedefTable::down() { 107 level -= 1; 108 debugPrint( cerr << "Down " << " level " << level << " note " << kindTable.getNote( level ).level << endl; ); 109 } // TypedefTable::down 110 102 111 void TypedefTable::print( void ) const { 103 112 KindTable::size_type scope = kindTable.currentScope(); 104 debugPrint( cerr << "[" << scope << "] " );113 debugPrint( cerr << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" ); 105 114 for ( KindTable::const_iterator i = kindTable.begin(); i != kindTable.end(); i++ ) { 106 115 while ( i.get_level() != scope ) { 107 116 --scope; 108 debugPrint( cerr << endl << "[" << scope << "] " );117 debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" ); 109 118 } // while 110 119 debugPrint( cerr << " " << (*i).first << ":" << kindName( (*i).second ) ); … … 112 121 while ( scope > 0 ) { 113 122 --scope; 114 debugPrint( cerr << endl << "[" << scope << "] " );123 debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" ); 115 124 } // while 116 125 debugPrint( cerr << endl ); -
src/Parser/TypedefTable.h
r7de22b28 r777ed2b 10 10 // Created On : Sat May 16 15:24:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 22 05:29:58201813 // Update Count : 8612 // Last Modified On : Tue Jul 10 18:32:23 2018 13 // Update Count : 112 14 14 // 15 15 … … 23 23 24 24 class TypedefTable { 25 typedef ScopedMap< std::string, int, int > KindTable; 25 struct Note { size_t level; bool forall; }; 26 typedef ScopedMap< std::string, int, Note > KindTable; 26 27 KindTable kindTable; 27 unsigned int level ;28 unsigned int level = 0; 28 29 public: 29 TypedefTable() : kindTable{0}, level{0} {}30 30 ~TypedefTable(); 31 31 … … 35 35 void addToScope( const std::string & identifier, int kind, const char * ); 36 36 void addToEnclosingScope( const std::string & identifier, int kind, const char * ); 37 bool getEnclForall() { return kindTable.getNote( kindTable.currentScope() - 1 ).forall; } 37 38 38 39 void enterScope(); 39 40 void leaveScope(); 40 41 41 void up( ) { level += 1; }42 void down() { level -= 1; }42 void up( bool ); 43 void down(); 43 44 44 45 void print( void ) const; -
src/Parser/parser.yy
r7de22b28 r777ed2b 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 6 08:02:38201813 // Update Count : 37 1612 // Last Modified On : Wed Jul 11 11:55:24 2018 13 // Update Count : 3739 14 14 // 15 15 … … 166 166 } // build_postfix_name 167 167 168 bool forall = false, xxx = false, yyy = false;// aggregate have one or more forall qualifiers ?168 bool forall = false, yyy = false; // aggregate have one or more forall qualifiers ? 169 169 170 170 // https://www.gnu.org/software/bison/manual/bison.html#Location-Type … … 422 422 // Foo ( *fp )( int ); 423 423 // `---' matches start of TYPEGENname '(' 424 // Must be:424 // must be: 425 425 // Foo( int ) ( *fp )( int ); 426 // The same problem occurs here: 427 // forall( otype T ) struct Foo { T v; } ( *fp )( int ); 428 // must be: 429 // forall( otype T ) struct Foo { T v; } ( int ) ( *fp )( int ); 426 430 427 431 // Order of these lines matters (low-to-high precedence). … … 1856 1860 1857 1861 aggregate_type: // struct, union 1858 aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' type_parameters_opt 1859 { $$ = DeclarationNode::newAggregate( $1, nullptr, $6, $4, true )->addQualifiers( $2 ); } 1862 aggregate_key attribute_list_opt 1863 { forall = false; } // reset 1864 '{' field_declaration_list_opt '}' type_parameters_opt 1865 { $$ = DeclarationNode::newAggregate( $1, nullptr, $7, $5, true )->addQualifiers( $2 ); } 1860 1866 | aggregate_key attribute_list_opt no_attr_identifier fred 1861 1867 { 1862 typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname ); // create typedef1868 typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef 1863 1869 forall = false; // reset 1864 1870 } … … 1868 1874 { 1869 1875 // 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) 1870 typedefTable.makeTypedef( *$3->type->leafName(), forall ? TYPEGENname : TYPEDEFname ); // create typedef1876 typedefTable.makeTypedef( *$3->type->leafName(), forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef 1871 1877 forall = false; // reset 1872 1878 } … … 1886 1892 aggregate_key attribute_list_opt no_attr_identifier fred 1887 1893 { 1888 typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname );1894 typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); 1889 1895 forall = false; // reset 1890 1896 $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 ); … … 1892 1898 | aggregate_key attribute_list_opt type_name fred 1893 1899 { 1900 forall = false; // reset 1894 1901 // Create new generic declaration with same name as previous forward declaration, where the IDENTIFIER is 1895 1902 // switched to a TYPEGENname. Link any generic arguments from typegen_name to new generic declaration and … … 2365 2372 push external_definition pop 2366 2373 { $$ = $2; } 2367 | external_definition_list 2368 { forall = xxx; } 2369 push external_definition pop 2370 { $$ = $1 ? $1->appendList( $4 ) : $4; } 2374 | external_definition_list push external_definition pop 2375 { $$ = $1 ? $1->appendList( $3 ) : $3; } 2371 2376 ; 2372 2377 … … 2378 2383 2379 2384 up: 2380 { typedefTable.up( ); }2385 { typedefTable.up( forall ); forall = false; } 2381 2386 ; 2382 2387 … … 2411 2416 { 2412 2417 if ( $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); } 2413 if ( $1->type->forall ) xxx = forall = true;// remember generic type2418 if ( $1->type->forall ) forall = true; // remember generic type 2414 2419 } 2415 2420 '{' up external_definition_list_opt down '}' // CFA, namespace 2416 2421 { 2417 2422 distQual( $5, $1 ); 2418 xxx= false;2423 forall = false; 2419 2424 $$ = $5; 2420 2425 } … … 2422 2427 { 2423 2428 if ( $1->type && $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); } 2424 if ( $1->type && $1->type->forall ) xxx =forall = true; // remember generic type2429 if ( $1->type && $1->type->forall ) forall = true; // remember generic type 2425 2430 } 2426 2431 '{' up external_definition_list_opt down '}' // CFA, namespace 2427 2432 { 2428 2433 distQual( $5, $1 ); 2429 xxx= false;2434 forall = false; 2430 2435 $$ = $5; 2431 2436 } … … 2433 2438 { 2434 2439 if ( ($1->type && $1->type->qualifiers.val) || $2->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); } 2435 if ( ($1->type && $1->type->forall) || $2->type->forall ) xxx =forall = true; // remember generic type2440 if ( ($1->type && $1->type->forall) || $2->type->forall ) forall = true; // remember generic type 2436 2441 } 2437 2442 '{' up external_definition_list_opt down '}' // CFA, namespace 2438 2443 { 2439 2444 distQual( $6, $1->addQualifiers( $2 ) ); 2440 xxx= false;2445 forall = false; 2441 2446 $$ = $6; 2442 2447 }
Note: See TracChangeset
for help on using the changeset viewer.