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 / LetNode.h < prev    next >
C/C++ Source or Header  |  1998-11-23  |  5KB  |  185 lines

  1. // $Id: LetNode.h,v 1.13 1998/11/23 17:43:27 zeller Exp $
  2. // LET..IN construct in VSL
  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_LetNode_h
  30. #define _DDD_LetNode_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36.  
  37. // A LetNode implements a LET..IN construct.
  38.  
  39. // A LetNode contains a list of length 2.
  40. // Upon evaluation, the first list element is matched against a pattern.
  41. // The variables found this way are used in evaluating the second element.
  42.  
  43.  
  44. #include "assert.h"
  45. #include <iostream.h>
  46.  
  47. #include "VSLNode.h"
  48. #include "ListNode.h"
  49. #include "CallNode.h"
  50. #include "TrueNode.h"
  51.  
  52.  
  53.  
  54. // LetNode
  55.  
  56. class LetNode: public CallNode {
  57. public:
  58.     DECLARE_TYPE_INFO
  59.  
  60. private:
  61.     VSLNode *_node_pattern;    // Pattern
  62.     Box *_box_pattern;        // Compiled pattern
  63.  
  64.     unsigned _nargs;        // Number of args
  65.     bool _straight;        // Flag: use argument list `as is'?
  66.  
  67.     bool being_compiled;    // Protect against recursive patterns
  68.  
  69.     ListNode *_args() const      { return (ListNode *)arg(); }
  70.     ListNode *_body() const      { return (ListNode *)(_args()->tail()); }
  71.  
  72.     ListBox *arglist(const Box *arg) const;       // Build arg list (Box)
  73.     VSLNode **nodelist(const VSLNode *arg) const; // same, with nodes
  74.  
  75.     bool domatch(const Box *arg) const;        // Match against Box
  76.     bool domatch(const VSLNode *arg) const;    // Match against Ausdruck
  77.  
  78. protected:
  79.     void dump(ostream& s) const;
  80.     void _dumpTree(ostream& s) const;
  81.  
  82.     LetNode(const LetNode& node):
  83.     CallNode(node),
  84.     _node_pattern(node._node_pattern->dup()),
  85.     _box_pattern(0),
  86.     _nargs(node._nargs),
  87.     _straight(node._straight),
  88.     being_compiled(false)
  89.     {
  90.     if (node._box_pattern)
  91.         _box_pattern = node._box_pattern->link();
  92.     }
  93.  
  94.     // Never called
  95.     char *func_name() const       { assert(0); return "let"; }
  96.     const Box *call(Box *) const  { assert(0); return 0; }
  97.  
  98. private:
  99.     LetNode& operator = (const LetNode&) { assert(0); return *this; }
  100.  
  101. public:
  102.     // Constructor
  103.     LetNode(VSLNode *p, VSLNode *a, VSLNode *b, char *type = "LetNode"):
  104.     CallNode(new FixListNode(a, b), type),
  105.     _node_pattern(p),
  106.     _box_pattern(0),
  107.     _nargs(p->nargs()),
  108.     _straight(p->isStraight()),
  109.     being_compiled(false)
  110.     {}
  111.  
  112.     // Destructor
  113.     ~LetNode()
  114.     {
  115.     if (_node_pattern) delete _node_pattern;
  116.     if (_box_pattern) _box_pattern->unlink();
  117.     }
  118.  
  119.     // Resources
  120.     VSLNode *&node_pattern()    { return _node_pattern; }
  121.     Box *&box_pattern()         { return _box_pattern; }
  122.     VSLNode *&args()            { return _args()->head(); }
  123.     VSLNode *&body()            { return _body()->head(); }
  124.  
  125.     const VSLNode *node_pattern() const   { return _node_pattern; }
  126.     const Box *box_pattern() const        { return _box_pattern; }
  127.     const VSLNode *args() const           { return _args()->head(); }
  128.     const VSLNode *body() const           { return _body()->head(); }
  129.  
  130.     // Compilation
  131.     void compilePatterns(VSLDef *cdef) const;
  132.  
  133.     // Destroy BOX_PATTERN
  134.     void uncompilePatterns(VSLDef *cdef) const
  135.     {
  136.     CallNode::uncompilePatterns(cdef);
  137.  
  138.     if (_box_pattern) 
  139.         ((LetNode *)this)->_box_pattern->unlink();
  140.     ((LetNode *)this)->_box_pattern = 0;
  141.     }
  142.  
  143.     // Resolve all names
  144.     int _resolveNames(VSLDef *cdef, unsigned base);
  145.  
  146.     // Optimization
  147.     int inlineFuncs(VSLDef *cdef, VSLNode **node);
  148.     int _reBase(VSLDef *cdef, unsigned newBase);
  149.  
  150.     // Copy
  151.     VSLNode *dup() const { return new LetNode(*this); }
  152.  
  153.     const Box *_eval(ListBox *arglist) const;
  154.     
  155.     bool isLetNode() const { return true; }
  156.  
  157.     // Representation invariant
  158.     bool OK() const;
  159. };
  160.  
  161.  
  162. // A WhereNode is identical to a LetNode, but is dumped as "where"
  163. // instead of "let".
  164.  
  165. class WhereNode: public LetNode {
  166. public:
  167.     DECLARE_TYPE_INFO
  168.  
  169. protected:
  170.     void dump(ostream& s) const;
  171.  
  172.     // Copy
  173.     WhereNode(WhereNode& node):
  174.     LetNode(node)
  175.     {}
  176.  
  177. public:
  178.     // Create
  179.     WhereNode(VSLNode *p, VSLNode *a, VSLNode *b):
  180.     LetNode(p, a, b)
  181.     {}
  182. };
  183.  
  184. #endif
  185.