source: src/Parser/TypedefTable.cc @ 93d0ed3

ADTast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 93d0ed3 was 6e50a6b, checked in by Michael Brooks <mlbrooks@…>, 3 years ago

Implementing language-provided syntax for (array) dimensions.

Former z(i) and Z(N) macros are eliminated.

  • Property mode set to 100644
File size: 5.4 KB
RevLine 
[b87a5ed]1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[79caea8]7// TypedefTable.cc --
[b87a5ed]8//
[7fdb94e]9// Author           : Peter A. Buhr
[b87a5ed]10// Created On       : Sat May 16 15:20:13 2015
11// Last Modified By : Peter A. Buhr
[6e50a6b]12// Last Modified On : Wed May 19 08:30:14 2021
13// Update Count     : 262
[b87a5ed]14//
15
[d180746]16
[984dce6]17#include "TypedefTable.h"
[2f0a0678]18#include <cassert>                                                                              // for assert
[a1c9ddd]19#include <iostream>
[51b7345]20
21#if 0
[3d26610]22#define debugPrint( code ) code
[51b7345]23#else
[3d26610]24#define debugPrint( code )
[51b7345]25#endif
26
[2f0a0678]27using namespace std;                                                                    // string, iostream
[51b7345]28
[a1c9ddd]29debugPrint(
30static const char *kindName( int kind ) {
31        switch ( kind ) {
32          case IDENTIFIER: return "identifier";
[6e50a6b]33          case TYPEDIMname: return "typedim";
[a1c9ddd]34          case TYPEDEFname: return "typedef";
35          case TYPEGENname: return "typegen";
36          default:
37                cerr << "Error: cfa-cpp internal error, invalid kind of identifier" << endl;
38                abort();
39        } // switch
40} // kindName
41)
42
[7fdb94e]43TypedefTable::~TypedefTable() {
44        if ( ! SemanticErrorThrow && kindTable.currentScope() != 0 ) {
[a1c9ddd]45                cerr << "Error: cfa-cpp internal error, scope failure " << kindTable.currentScope() << endl;
46                abort();
[7fdb94e]47        } // if
48} // TypedefTable::~TypedefTable
49
[60a8062]50bool TypedefTable::exists( const string & identifier ) const {
[7fdb94e]51        return kindTable.find( identifier ) != kindTable.end();
52} // TypedefTable::exists
[984dce6]53
[60a8062]54bool TypedefTable::existsCurr( const string & identifier ) const {
[c4f68dc]55        return kindTable.findAt( kindTable.currentScope() - 1, identifier ) != kindTable.end();
56} // TypedefTable::exists
57
[7fdb94e]58int TypedefTable::isKind( const string & identifier ) const {
59        KindTable::const_iterator posn = kindTable.find( identifier );
[2f0a0678]60        // Name lookup defaults to identifier, and then the identifier's kind is set by the parser.
[7fdb94e]61        if ( posn == kindTable.end() ) return IDENTIFIER;
62        return posn->second;
63} // TypedefTable::isKind
[45161b4d]64
65// SKULLDUGGERY: Generate a typedef for the aggregate name so the aggregate does not have to be qualified by
[7fdb94e]66// "struct". Only generate the typedef, if the name is not in use. The typedef is implicitly (silently) removed if the
67// name is explicitly used.
[a1c9ddd]68void TypedefTable::makeTypedef( const string & name, int kind ) {
69//    Check for existence is necessary to handle:
70//        struct Fred {};
71//        void Fred();
72//        void fred() {
73//           struct Fred act; // do not add as type in this scope
74//           Fred();
75//        }
[45161b4d]76        if ( ! typedefTable.exists( name ) ) {
[a1c9ddd]77                typedefTable.addToEnclosingScope( name, kind, "MTD" );
[45161b4d]78        } // if
[7fdb94e]79} // TypedefTable::makeTypedef
80
[a1c9ddd]81void TypedefTable::addToScope( const string & identifier, int kind, const char * locn __attribute__((unused)) ) {
[3d26610]82        auto scope = kindTable.currentScope();
[a1c9ddd]83        debugPrint( cerr << "Adding current at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << endl );
[fc20514]84        kindTable.insertAt( scope, identifier, kind );
[3d26610]85} // TypedefTable::addToScope
86
[a1c9ddd]87void TypedefTable::addToEnclosingScope( const string & identifier, int kind, const char * locn __attribute__((unused)) ) {
[fc20514]88        auto scope = kindTable.currentScope() - 1 - kindTable.getNote( kindTable.currentScope() - 1 ).level;
89//      auto scope = level - kindTable.getNote( kindTable.currentScope() - 1 ).level;
90        debugPrint( cerr << "Adding enclosing at " << locn << " " << identifier << " as " << kindName( kind ) << " scope " << scope << " level " << level << " note " << kindTable.getNote( kindTable.currentScope() - 1 ).level << endl );
[7fdb94e]91        auto ret = kindTable.insertAt( scope, identifier, kind );
[6259c7e]92        if ( ! ret.second ) ret.first->second = kind;           // exists => update
[7fdb94e]93} // TypedefTable::addToEnclosingScope
[51b7345]94
[de62360d]95void TypedefTable::enterScope() {
[fc20514]96        kindTable.beginScope( (Note){ 0, false } );
97        debugPrint( cerr << "Entering scope " << kindTable.currentScope() << " level " << level << endl; print() );
[7fdb94e]98} // TypedefTable::enterScope
[51b7345]99
[de62360d]100void TypedefTable::leaveScope() {
[3d56d15b]101        debugPrint( cerr << "Leaving scope " << kindTable.currentScope() << endl; print() );
[7fdb94e]102        kindTable.endScope();
103} // TypedefTable::leaveScope
104
[fc20514]105void TypedefTable::up( bool forall ) {
106        level += 1;
[26ef3b2]107        kindTable.getNote( kindTable.currentScope() ) = (Note){ level, forall || getEnclForall() };
[fc20514]108        debugPrint( cerr << "Up " << " level " << level << " note " << kindTable.getNote( level ).level << ", " << kindTable.getNote( level ).forall << endl; );
109} // TypedefTable::up
110
111void TypedefTable::down() {
112        level -= 1;
113        debugPrint( cerr << "Down " << " level " << level << " note " << kindTable.getNote( level ).level << endl; );
114} // TypedefTable::down
115
[3d26610]116void TypedefTable::print( void ) const {
117        KindTable::size_type scope = kindTable.currentScope();
[fc20514]118        debugPrint( cerr << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
[3d26610]119        for ( KindTable::const_iterator i = kindTable.begin(); i != kindTable.end(); i++ ) {
120                while ( i.get_level() != scope ) {
121                        --scope;
[fc20514]122                        debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
[3d26610]123                } // while
[a1c9ddd]124                debugPrint( cerr << " " << (*i).first << ":" << kindName( (*i).second ) );
[3d26610]125        } // for
126        while ( scope > 0 ) {
127                --scope;
[fc20514]128                debugPrint( cerr << endl << "[" << scope << "] " << kindTable.getNote( scope ).level << ", " << kindTable.getNote( scope ).forall << ":" );
[3d56d15b]129        } // while
[3d26610]130        debugPrint( cerr << endl );
[3d56d15b]131} // TypedefTable::print
[b87a5ed]132
133// Local Variables: //
134// tab-width: 4 //
135// mode: c++ //
136// compile-command: "make install" //
137// End: //
Note: See TracBrowser for help on using the repository browser.