|
||
attribnode.ccGo to the documentation of this file.00001 // $Id: attribnode.cc,v 1.3 2003/08/07 23:12:56 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 attribNode::attribNode(const char * name, exprNode * arg, const Coord coord) 00045 : stmtNode(Attrib, coord), 00046 _arg(arg), 00047 _name(string(name)) 00048 {} 00049 00050 // Was ConvertIdToAttrib in ast.c 00051 00052 attribNode::attribNode(idNode * id, exprNode * arg) 00053 : stmtNode(Attrib, id->coord()), 00054 _arg(arg), 00055 _name(id->name()) 00056 { 00057 //delete id; 00058 } 00059 00060 // ------------------------------------------------------------ 00061 // Walker 00062 // ------------------------------------------------------------ 00063 00064 void attribNode::visit(Visitor * the_visitor) 00065 { 00066 the_visitor->at_attrib(this); 00067 } 00068 00069 void attribNode::walk(Walker & the_walker) 00070 { 00071 Walker::Order ord = the_walker.order(); 00072 00073 if (ord == Walker::Preorder || ord == Walker::Both) 00074 the_walker.at_attrib(this, Walker::Preorder); 00075 00076 if (the_walker.depth() == Walker::Subtree) { 00077 // -- Visit the children 00078 00079 if (arg()) 00080 arg()->walk(the_walker); 00081 } 00082 00083 if (ord == Walker::Postorder || ord == Walker::Both) 00084 the_walker.at_attrib(this, Walker::Postorder); 00085 } 00086 00087 // ------------------------------------------------------------ 00088 // Output 00089 // ------------------------------------------------------------ 00090 00091 void attribNode::output_stmt(output_context & ct, Node * parent) 00092 { 00093 } 00094 00095 // ------------------------------------------------------------ 00096 // Changer 00097 // ------------------------------------------------------------ 00098 00099 Node * attribNode::change(Changer & the_changer, bool redispatch) 00100 { 00101 Changer::Order ord = the_changer.order(); 00102 attribNode * the_attrib = this; 00103 00104 if ((ord == Changer::Preorder || ord == Changer::Both) && ! redispatch) 00105 the_attrib = (attribNode *) the_changer.at_attrib(the_attrib, Changer::Preorder); 00106 00107 if (the_attrib) { 00108 00109 if (the_attrib != this) 00110 return the_attrib->change(the_changer, true); 00111 00112 exprNode * old_arg = the_attrib->arg(); 00113 if (old_arg) { 00114 exprNode * new_arg = (exprNode *) old_arg->change(the_changer); 00115 if (old_arg != new_arg) { 00116 //if (the_changer.delete_old()) 00117 // delete old_arg; 00118 the_attrib->arg(new_arg); 00119 } 00120 } 00121 00122 } 00123 00124 if ((ord == Changer::Postorder || ord == Changer::Both) && ! redispatch) 00125 the_attrib = (attribNode *) the_changer.at_attrib(the_attrib, Changer::Postorder); 00126 00127 return the_attrib; 00128 } 00129 00130 00131 // ------------------------------------------------------------ 00132 // Destructor 00133 // ------------------------------------------------------------ 00134 00135 attribNode::~attribNode() 00136 { 00137 //delete _arg; 00138 } |
Generated on August 27, 2003
Back to the C-Breeze home page