Changes in / [7de22b28:777ed2b]


Ignore:
Location:
src/Parser
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/TypedefTable.cc

    r7de22b28 r777ed2b  
    1010// Created On       : Sat May 16 15:20:13 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun 22 06:14:39 2018
    13 // Update Count     : 206
     12// Last Modified On : Wed Jul 11 11:47:47 2018
     13// Update Count     : 255
    1414//
    1515
     
    7777        auto scope = kindTable.currentScope();
    7878        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 );
    8280} // TypedefTable::addToScope
    8381
    8482void TypedefTable::addToEnclosingScope( const string & identifier, int kind, const char * locn __attribute__((unused)) ) {
    85         assert( 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 );
    8886        auto ret = kindTable.insertAt( scope, identifier, kind );
    89         if ( ! ret.second ) ret.first->second = kind;           // exists => update
     87        if ( ! ret.second ) ret.first->second = kind;   // exists => update
    9088} // TypedefTable::addToEnclosingScope
    9189
    9290void 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() );
    9593} // TypedefTable::enterScope
    9694
     
    10098} // TypedefTable::leaveScope
    10199
     100void 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
     106void TypedefTable::down() {
     107        level -= 1;
     108        debugPrint( cerr << "Down " << " level " << level << " note " << kindTable.getNote( level ).level << endl; );
     109} // TypedefTable::down
     110
    102111void TypedefTable::print( void ) const {
    103112        KindTable::size_type scope = kindTable.currentScope();
    104         debugPrint( cerr << "[" << scope << "]" );
     113        debugPrint( cerr << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
    105114        for ( KindTable::const_iterator i = kindTable.begin(); i != kindTable.end(); i++ ) {
    106115                while ( i.get_level() != scope ) {
    107116                        --scope;
    108                         debugPrint( cerr << endl << "[" << scope << "]" );
     117                        debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
    109118                } // while
    110119                debugPrint( cerr << " " << (*i).first << ":" << kindName( (*i).second ) );
     
    112121        while ( scope > 0 ) {
    113122                --scope;
    114                 debugPrint( cerr << endl << "[" << scope << "]" );
     123                debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
    115124        } // while
    116125        debugPrint( cerr << endl );
  • src/Parser/TypedefTable.h

    r7de22b28 r777ed2b  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun 22 05:29:58 2018
    13 // Update Count     : 86
     12// Last Modified On : Tue Jul 10 18:32:23 2018
     13// Update Count     : 112
    1414//
    1515
     
    2323
    2424class 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;
    2627        KindTable kindTable;   
    27         unsigned int level;
     28        unsigned int level = 0;
    2829  public:
    29     TypedefTable() : kindTable{0}, level{0} {}
    3030        ~TypedefTable();
    3131
     
    3535        void addToScope( const std::string & identifier, int kind, const char * );
    3636        void addToEnclosingScope( const std::string & identifier, int kind, const char * );
     37        bool getEnclForall() { return kindTable.getNote( kindTable.currentScope() -  1 ).forall; }
    3738
    3839        void enterScope();
    3940        void leaveScope();
    4041
    41         void up() { level += 1; }
    42         void down() { level -= 1; }
     42        void up( bool );
     43        void down();
    4344
    4445        void print( void ) const;
  • src/Parser/parser.yy

    r7de22b28 r777ed2b  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul  6 08:02:38 2018
    13 // Update Count     : 3716
     12// Last Modified On : Wed Jul 11 11:55:24 2018
     13// Update Count     : 3739
    1414//
    1515
     
    166166} // build_postfix_name
    167167
    168 bool forall = false, xxx = false, yyy = false;                  // aggregate have one or more forall qualifiers ?
     168bool forall = false, yyy = false;                                               // aggregate have one or more forall qualifiers ?
    169169
    170170// https://www.gnu.org/software/bison/manual/bison.html#Location-Type
     
    422422//   Foo ( *fp )( int );
    423423//   `---'                                              matches start of TYPEGENname '('
    424 // Must be:
     424// must be:
    425425//   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 );
    426430
    427431// Order of these lines matters (low-to-high precedence).
     
    18561860
    18571861aggregate_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 ); }
    18601866        | aggregate_key attribute_list_opt no_attr_identifier fred
    18611867                {
    1862                         typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname ); // create typedef
     1868                        typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
    18631869                        forall = false;                                                         // reset
    18641870                }
     
    18681874                {
    18691875                        // 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 typedef
     1876                        typedefTable.makeTypedef( *$3->type->leafName(), forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
    18711877                        forall = false;                                                         // reset
    18721878                }
     
    18861892        aggregate_key attribute_list_opt no_attr_identifier fred
    18871893                {
    1888                         typedefTable.makeTypedef( *$3, forall ? TYPEGENname : TYPEDEFname );
     1894                        typedefTable.makeTypedef( *$3, forall | typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname );
    18891895                        forall = false;                                                         // reset
    18901896                        $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
     
    18921898        | aggregate_key attribute_list_opt type_name fred
    18931899                {
     1900                        forall = false;                                                         // reset
    18941901                        // Create new generic declaration with same name as previous forward declaration, where the IDENTIFIER is
    18951902                        // switched to a TYPEGENname. Link any generic arguments from typegen_name to new generic declaration and
     
    23652372        push external_definition pop
    23662373                { $$ = $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; }
    23712376        ;
    23722377
     
    23782383
    23792384up:
    2380                 { typedefTable.up(); }
     2385                { typedefTable.up( forall ); forall = false; }
    23812386        ;
    23822387
     
    24112416                {
    24122417                        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 type
     2418                        if ( $1->type->forall ) forall = true;          // remember generic type
    24142419                }
    24152420          '{' up external_definition_list_opt down '}'          // CFA, namespace
    24162421                {
    24172422                        distQual( $5, $1 );
    2418                         xxx = false;
     2423                        forall = false;
    24192424                        $$ = $5;
    24202425                }
     
    24222427                {
    24232428                        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 type
     2429                        if ( $1->type && $1->type->forall ) forall = true; // remember generic type
    24252430                }
    24262431          '{' up external_definition_list_opt down '}'          // CFA, namespace
    24272432                {
    24282433                        distQual( $5, $1 );
    2429                         xxx = false;
     2434                        forall = false;
    24302435                        $$ = $5;
    24312436                }
     
    24332438                {
    24342439                        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 type
     2440                        if ( ($1->type && $1->type->forall) || $2->type->forall ) forall = true; // remember generic type
    24362441                }
    24372442          '{' up external_definition_list_opt down '}'          // CFA, namespace
    24382443                {
    24392444                        distQual( $6, $1->addQualifiers( $2 ) );
    2440                         xxx = false;
     2445                        forall = false;
    24412446                        $$ = $6;
    24422447                }
Note: See TracChangeset for help on using the changeset viewer.