source: src/Designators/Processor.cc @ ecb1534

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since ecb1534 was 843054c2, checked in by Peter A. Buhr <pabuhr@…>, 10 years ago

licencing: seventh groups of files

  • Property mode set to 100644
File size: 5.5 KB
Line 
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//
7// Processor.cc --
8//
9// Author           : Rodolfo G. Esteves
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Tue May 19 16:23:10 2015
13// Update Count     : 2
14//
15
16#include <vector>
17#include <algorithm>
18
19#include "Processor.h"
20#include "SynTree/Declaration.h"
21
22namespace Designators {
23        Matcher::Matcher( const std::list< DeclarationWithType * > &decls ) {
24                int cnt = 0;
25                for ( std::list< DeclarationWithType * >::const_iterator i = decls.begin();
26                          i != decls.end(); i++, cnt++ ) {
27                        std::string newName = (*i)->get_name();
28                        if ( table.find( newName ) == table.end() ) {
29                                table.insert( std::pair<std::string, int>(newName, cnt) );
30                                order.push_back( newName );
31                                declarations.push_back( *i );
32                                alternatives.push_back( 0 );
33                        } // if
34                } // for
35        }
36
37        template< class InputIterator >
38        bool Matcher::add(InputIterator begin, InputIterator end, ResolvExpr::Alternative &alt ) {
39                while ( begin != end ) {
40                        if ( table.find( *begin ) != table.end() )
41                                alternatives[ table[ *begin ] ] = new ResolvExpr::Alternative(alt);
42                        else
43                                return false;
44                        begin++;
45                } // while
46                return true;
47        }
48
49        template< class InputIterator, class OutputIterator >
50        bool Matcher::slice(InputIterator begin, InputIterator end, OutputIterator out ) {
51                while ( begin != end )
52                        if ( table.find( *begin ) != table.end() )
53                                *out++ = declarations [ table[ *begin++ ] ];
54                        else
55                                return false; // throw 0;
56                return true;
57        }
58
59        template< class OutputIterator >
60        bool Matcher::get_reorderedCall( OutputIterator out ) {
61                // fill call with defaults, if need be
62                for (Matcher::iterator o = begin(); o != end(); o++ )
63                        if ( alternatives[ table[ *o ] ] == 0 )
64                                return false;
65                        else
66                                out++ = *alternatives[table[ *o ]];
67                return true;
68        }
69
70        bool fixDesignations( ResolvExpr::AlternativeFinder &finder, Expression *designation ) {
71                // Distribute `designation' over alternatives contained in `finder'
72                if ( ! designation) return false;
73                else
74                        for ( ResolvExpr::AlternativeFinder::iterator alt = finder.begin(); alt != finder.end(); alt++ )
75                                alt->expr->set_argName( designation );
76                return true;
77        }
78
79        template < class OutputIterator >
80        bool extractNames( Expression *expr, OutputIterator out, Matcher matcher ) {
81                Expression *designator = expr->get_argName();
82                if ( designator == 0 ) return false;
83
84                if ( NameExpr *ndes = dynamic_cast<NameExpr *>(designator) )
85                        out++ = ndes->get_name();
86                else if ( TupleExpr *tdes = dynamic_cast<TupleExpr *>(designator) ) {
87                        std::cerr << "Tuple designation" << std::endl;
88//      ObjectDecl *decl = extractTupleV(matcher, tdes); // xxx
89                        // transform?
90                        for ( std::list< Expression * >::iterator n = tdes->get_exprs().begin();
91                                  n != tdes->get_exprs().end(); n++ ) {
92
93                                if ( NameExpr *name = dynamic_cast<NameExpr *>(*n) )
94                                        out++ = name->get_name();
95                                else
96                                        // flatten nested Tuples
97                                        throw SemanticError( "Invalid tuple designation." );
98                        } // for
99                } // if
100                return true;
101        }
102
103        std::string extractName( Expression *expr ) /* throw NoNameExtraction */ {
104                if ( NameExpr *name = dynamic_cast< NameExpr *>(expr) )
105                        return name->get_name();
106                else /* if () */
107                        throw 0;
108        }
109
110        DeclarationWithType *gensym( DeclarationWithType *, std::string prefix ) {
111                return 0;
112        }
113
114        ObjectDecl *extractTupleV( Matcher matcher, TupleExpr *nmTuple ) {
115                // extract a subtuple of the function `fun' argument list, corresponding to the tuple of names requested by
116                // `nmTuple'.
117                std::list< Expression * > &exprs = nmTuple->get_exprs();
118                std::cerr << "In extractTupleV, the tuple has " << exprs.size() << " components." << std::endl;
119                std::list< std::string > names;
120                std::transform( exprs.begin(), exprs.end(), back_inserter(names), extractName );
121                std::list< DeclarationWithType * > decls;
122                matcher.slice( names.begin(), names.end(), back_inserter(decls) );
123                //std::for_each( decls.begin(), decls.end(), gensym );
124                std::cerr << "Returning declaration with " << decls.size() << " components." << std::endl;
125
126                return 0;//new ObjectDecl()
127        }
128
129        void check_alternative( FunctionType *fun, ResolvExpr::AltList &args ) {
130                using namespace ResolvExpr;
131
132                Matcher matcher( fun->get_parameters() );
133                for ( AltList::iterator a = args.begin(); a != args.end(); a++ ) {
134                        std::list< std::string > actNames;
135                        if ( ! extractNames( a->expr, back_inserter(actNames), matcher ) ) {
136                                return; // not a designated call, leave alternative alone
137                        } else {
138                                // see if there's a match
139                                matcher.add( actNames.begin(), actNames.end(), *a );
140                        } // if
141                } // for
142                //AltList newArgs;
143                args.clear();
144                matcher.get_reorderedCall( back_inserter(args) );
145
146                return;
147        }
148#if 0
149        void pruneAlternatives( Expression *expr, ResolvExpr::AlternativeFinder &finder ) {
150                if ( expr->get_argName() != 0 ) {
151                        // Looking at designated expression
152                        using namespace ResolvExpr;
153                        AltList &alternatives = finder.get_alternatives();
154                        std::cerr << "Now printing alternatives: " << std::endl;
155                        for ( AltList::iterator a = alternatives.begin(); a != alternatives.end(); a++ )
156                                a->expr->print( std::cerr );
157                        //std::cerr << "Looking for constructions of length no more than: " << tdes->get_exprs().size() << "." << std::endl;
158                }
159                return;
160        }
161#endif // 0
162} // namespaces Designators
163
164// Local Variables: //
165// tab-width: 4 //
166// mode: c++ //
167// compile-command: "make install" //
168// End: //
Note: See TracBrowser for help on using the repository browser.