source: src/Designators/Processor.cc@ d06010a

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since d06010a 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.