|
||
tdefnode.ccGo to the documentation of this file.00001 // $Id: tdefnode.cc,v 1.3 2003/08/07 23:13:14 pnav Exp $ 00002 // ---------------------------------------------------------------------- 00003 // 00004 // C-Breeze 00005 // C Compiler Framework 00006 // 00007 // Copyright (c) 2000 University of Texas at Austin 00008 // 00009 // Samuel Z. Guyer 00010 // Daniel A. Jimenez 00011 // Calvin Lin 00012 // 00013 // Permission is hereby granted, free of charge, to any person 00014 // obtaining a copy of this software and associated documentation 00015 // files (the "Software"), to deal in the Software without 00016 // restriction, including without limitation the rights to use, copy, 00017 // modify, merge, publish, distribute, sublicense, and/or sell copies 00018 // of the Software, and to permit persons to whom the Software is 00019 // furnished to do so, subject to the following conditions: 00020 // 00021 // The above copyright notice and this permission notice shall be 00022 // included in all copies or substantial portions of the Software. 00023 // 00024 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00025 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00026 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00027 // NONINFRINGEMENT. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT 00028 // AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 00029 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 00030 // OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00031 // THE SOFTWARE. 00032 // 00033 // We acknowledge the C-to-C Translator from MIT Laboratory for 00034 // Computer Science for inspiring parts of the C-Breeze design. 00035 // 00036 // ---------------------------------------------------------------------- 00037 00038 #include "c_breeze.h" 00039 00040 // -------------------------------------------------------------------- 00041 // Constructors 00042 // -------------------------------------------------------------------- 00043 00044 tdefNode::tdefNode(Type_qualifiers tq, const char * name, const Coord coord) 00045 : typeNode(Tdef, tq, 0, coord), 00046 _name(string(name)), 00047 _def(0) 00048 {} 00049 00050 // ------------------------------------------------------------ 00051 // ConvertIdToTdef in ast.c 00052 // ------------------------------------------------------------ 00053 00054 tdefNode::tdefNode(idNode * the_id, Type_qualifiers tq, typeNode * the_type) 00055 : typeNode(Tdef, tq, 0, the_id->coord()), 00056 _name(the_id->name()), 00057 _def(the_type) 00058 { 00059 //delete the_id; 00060 } 00061 00062 // ------------------------------------------------------------ 00063 // Data type base 00064 // ------------------------------------------------------------ 00065 00066 typeNode * tdefNode::base_type(bool TdefIndir) const 00067 { 00068 if (TdefIndir && def()) 00069 return def()->base_type(TdefIndir); 00070 else 00071 return (typeNode *) this; 00072 } 00073 00074 // ------------------------------------------------------------ 00075 // Walker 00076 // ------------------------------------------------------------ 00077 00078 void tdefNode::visit(Visitor * the_visitor) 00079 { 00080 the_visitor->at_tdef(this); 00081 } 00082 00083 void tdefNode::walk(Walker & the_walker) 00084 { 00085 Walker::Order ord = the_walker.order(); 00086 00087 if (ord == Walker::Preorder || ord == Walker::Both) 00088 the_walker.at_tdef(this, Walker::Preorder); 00089 00090 if (ord == Walker::Postorder || ord == Walker::Both) 00091 the_walker.at_tdef(this, Walker::Postorder); 00092 } 00093 00094 // ------------------------------------------------------------ 00095 // Output 00096 // ------------------------------------------------------------ 00097 00098 void tdefNode::output_type(output_context & ct, Node * parent, Assoc context, Type_qualifiers q) 00099 { 00100 if (context == Left) { 00101 const string & qs = type_qualifiers_name(q); 00102 const string & qs1 = type_qualifiers_name(); 00103 00104 if (! qs.empty()) 00105 ct.space(); 00106 ct << qs; 00107 00108 if (! qs1.empty()) 00109 ct.space(); 00110 00111 ct << qs1; 00112 00113 if (! name().empty()) 00114 ct.space(); 00115 00116 ct << name(); 00117 } 00118 } 00119 00120 // ------------------------------------------------------------ 00121 // Changer 00122 // ------------------------------------------------------------ 00123 00124 Node * tdefNode::change(Changer & the_changer, bool redispatch) 00125 { 00126 Changer::Order ord = the_changer.order(); 00127 tdefNode * the_tdef = this; 00128 00129 if ((ord == Changer::Preorder || ord == Changer::Both) && ! redispatch) 00130 the_tdef = (tdefNode *) the_changer.at_tdef(the_tdef, Changer::Preorder); 00131 00132 if (the_tdef) { 00133 00134 if (the_tdef != this) 00135 return the_tdef->change(the_changer, true); 00136 00137 } 00138 00139 if ((ord == Changer::Postorder || ord == Changer::Both) && ! redispatch) 00140 the_tdef = (tdefNode *) the_changer.at_tdef(the_tdef, Changer::Postorder); 00141 00142 return the_tdef; 00143 } 00144 00145 00146 // ------------------------------------------------------------ 00147 // Destructor 00148 // ------------------------------------------------------------ 00149 00150 tdefNode::~tdefNode() 00151 { 00152 } |
Generated on August 27, 2003
Back to the C-Breeze home page