home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / CallNode.h < prev    next >
C/C++ Source or Header  |  1998-11-23  |  4KB  |  138 lines

  1. // $Id: CallNode.h,v 1.12 1998/11/23 17:43:18 zeller Exp $
  2. // Function call VSL nodes
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. #ifndef _DDD_CallNode_h
  30. #define _DDD_CallNode_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36.  
  37. // A CallNode calls a VSL function (builtin or user-defined)
  38.  
  39. #include "assert.h"
  40. #include <iostream.h>
  41.  
  42. #include "VSLNode.h"
  43.  
  44. #include "VSLDefList.h"
  45. #include "VSLDef.h"
  46.  
  47.  
  48. // CallNode
  49.  
  50. class CallNode: public VSLNode {
  51. public:
  52.     DECLARE_TYPE_INFO
  53.  
  54. protected:
  55.     VSLNode *_arg;
  56.  
  57.     CallNode(const CallNode& node):
  58.     VSLNode(node), 
  59.     _arg(node._arg->dup())
  60.     {}
  61.  
  62.     // Call function
  63.     virtual const Box *call(Box *arg) const = 0;
  64.  
  65.     // Dump name
  66.     void dump(ostream& s) const;
  67.     void _dumpTree(ostream& s) const;
  68.  
  69.     // Return name of callee
  70.     virtual char *func_name() const = 0;
  71.  
  72.     // Flag: Dump function name infix?
  73.     virtual bool isInfix() const { return false; }
  74.  
  75.     bool matches(const VSLNode& node) const
  76.     {
  77.     return matchesAll ||
  78.         (VSLNode::matches(node) &&
  79.         *_arg == *(((CallNode *)(&node))->_arg));   // dirty trick
  80.     }
  81.  
  82. private:
  83.     CallNode& operator = (const CallNode&)
  84.     {
  85.     assert(0); return *this;
  86.     }
  87.  
  88. public:
  89.     // Resources
  90.     VSLNode*& arg() { return _arg; }
  91.     VSLNode* arg() const { return _arg; }
  92.  
  93.     // Constructor
  94.     CallNode(VSLNode *a, char *type = "CallNode"):
  95.     VSLNode(type), _arg(a)
  96.     {}
  97.  
  98.     // Destructor (includes arg)
  99.     ~CallNode()
  100.     {
  101.     if (_arg) delete _arg;
  102.     }
  103.  
  104.     const Box *_eval(ListBox *arglist) const;
  105.  
  106.     // Optimization
  107.     int countSelfReferences(VSLDef *cdef, VSLDefList *deflist);
  108.     int resolveDefs(VSLDef *cdef, bool complain_recursive);
  109.     int resolveSynonyms(VSLDef *cdef, VSLNode **node);
  110.     int foldOps(VSLDef *cdef, VSLNode **node);
  111.     int foldConsts(VSLDef *cdef, VSLNode **node);
  112.     int inlineFuncs(VSLDef *cdef, VSLNode **node);
  113.     int instantiateArgs(VSLDef *cdef, VSLNode **node, VSLNode *values[],
  114.     unsigned base, unsigned n);
  115.     void countArgNodes(VSLDef *cdef, int instances[],
  116.     unsigned base, unsigned n);
  117.     int _reBase(VSLDef *cdef, unsigned newBase);
  118.  
  119.     // Other tree functions
  120.     void compilePatterns(VSLDef *cdef) const;
  121.     void uncompilePatterns(VSLDef *cdef) const;
  122.     int resolveName(VSLDef *cdef, VSLNode **node, string& name, unsigned id);
  123.     int _resolveNames(VSLDef *cdef, unsigned base);
  124.     string firstName() const;
  125.  
  126.     bool isConst() const { return _arg->isConst(); }
  127.     bool isCallNode() const { return true; }
  128.  
  129.     unsigned nargs() const { return _arg->nargs(); }
  130.  
  131.     static bool matchesAll;
  132.  
  133.     // Representation invariant
  134.     bool OK() const;
  135. };
  136.  
  137. #endif
  138.