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 / VSLDef.h < prev    next >
C/C++ Source or Header  |  1998-11-23  |  4KB  |  144 lines

  1. // $Id: VSLDef.h,v 1.13 1998/11/23 17:43:42 zeller Exp $
  2. // VSL definition
  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_VSLDef_h
  30. #define _DDD_VSLDef_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36.  
  37. #include <limits.h>
  38. #include <iostream.h>
  39. #include "strclass.h"
  40. #include "bool.h"
  41. #include "VSLNode.h"
  42. #include "TypeInfo.h"
  43. #include "assert.h"
  44.  
  45. class Box;
  46. class VSLDefList;
  47.  
  48. class VSLDef {
  49. public:
  50.     DECLARE_TYPE_INFO
  51.  
  52. private:
  53.     VSLNode *_expr;             // Expr (definition body)
  54.     VSLNode *_node_pattern;     // Pattern
  55.     Box *_box_pattern;          // Compiled pattern
  56.  
  57.     unsigned _nargs;            // Number of args
  58.     bool _straight;        // Flag: Can we use arg list `as is'?
  59.  
  60.     string _filename;           // Position of definition
  61.     int _lineno;
  62.  
  63.     VSLDef *_listnext;          // next definition in VSLDefList
  64.     VSLDef *_libnext;           // next definition in VSLLib
  65.     VSLDef *_libprev;           // previous definition in VSLLib
  66.  
  67.     string args() const;        // Create argument list
  68.  
  69.     bool being_compiled;    // Protect against recursive compilePattern()
  70.  
  71. public:
  72.     VSLDefList *deflist;        // Parent
  73.  
  74.     // Constructor
  75.     VSLDef(VSLDefList* l, VSLNode *pattern, VSLNode *e = 0,
  76.        string filename = "builtin", int lineno = 0);
  77.  
  78. private:
  79.     // `Dummy' copy constructor
  80.     VSLDef(const VSLDef&);
  81.  
  82.     // `Dummy' assignment
  83.     VSLDef& operator = (const VSLDef&);
  84.  
  85. public:
  86.     // Resources
  87.     VSLNode*& expr()            { return _expr; }
  88.     VSLNode*& node_pattern()    { return _node_pattern; }
  89.     Box*& box_pattern()         { return _box_pattern; }
  90.     unsigned nargs() const      { return _nargs; }
  91.     bool straight() const       { return _straight; }
  92.  
  93.     VSLDef*& listnext()         { return _listnext; }
  94.     VSLDef*& libnext()          { return _libnext; }
  95.     VSLDef*& libprev()          { return _libprev; }
  96.  
  97.     VSLDef* listnext() const    { return _listnext; }
  98.     VSLDef* libnext() const     { return _libnext; }
  99.     VSLDef* libprev() const     { return _libprev; }
  100.  
  101.     string func_name() const;     // internal name (including args)
  102.     string f_name() const;        // external name (including args)
  103.     string longname() const;      // externak name (including args and loc)
  104.  
  105.     // Evaluate
  106.     const Box *eval(Box *arg) const;
  107.  
  108.     // Backtrace (in error handling)
  109.     static const VSLDef **backtrace;
  110.     static const Box **backtrace_args;
  111.  
  112.     // Create box_pattern
  113.     void compilePattern() const;
  114.  
  115.     // Destroy box_pattern
  116.     void uncompilePattern() const
  117.     {
  118.     if (_box_pattern) 
  119.         ((VSLDef *)this)->_box_pattern->unlink();
  120.     ((VSLDef *)this)->_box_pattern = 0;
  121.     }
  122.  
  123.     // Resolve names
  124.     int resolveNames();
  125.  
  126.     // Check if def matches ARG
  127.     bool matches(const Box *arg) const;
  128.     bool matches(const VSLNode *arg) const;
  129.  
  130.     // Convert arg into argument list
  131.     ListBox *arglist(const Box *arg) const;
  132.  
  133.     // Extract instances
  134.     VSLNode **nodelist(const VSLNode *arg) const;
  135.  
  136.     // Destructor
  137.     virtual ~VSLDef();
  138.  
  139.     // Representation invariant
  140.     virtual bool OK() const;
  141. };
  142.  
  143. #endif
  144.