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

  1. // $Id: VSLRead.C,v 1.20 1998/11/23 17:43:46 zeller Exp $
  2. // Read in VSL library
  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. #include "my-alloca.h"
  30.  
  31. // Yes, alloca() must come even before this simple stuff.  Sigh.
  32. char VSLRead_rcsid[] = 
  33.     "$Id: VSLRead.C,v 1.20 1998/11/23 17:43:46 zeller Exp $";
  34.  
  35. #include <stdlib.h>
  36. #include <limits.h>
  37. #include <iostream.h>
  38. #include <fstream.h>
  39. #include <strstream.h>
  40.  
  41. #include "assert.h"
  42. #include "strclass.h"
  43. #include "cook.h"
  44.  
  45. #include "VSLBuiltin.h"
  46.  
  47. #include "VSLLib.h"
  48. #include "VSLDef.h"
  49. #include "VSLDefList.h"
  50.  
  51. #include "Box.h"
  52. #include "PrimitiveB.h"
  53. #include "StringBox.h"
  54. #include "TrueBox.h"
  55. #include "ListBox.h"
  56.  
  57. #include "VSLNode.h"
  58. #include "ConstNode.h"
  59. #include "ListNode.h"
  60. #include "TestNode.h"
  61. #include "DefCallN.h"
  62. #include "LetNode.h"
  63. #include "ArgNode.h"
  64. #include "DummyNode.h"
  65. #include "NameNode.h"
  66. #include "TrueNode.h"
  67.  
  68. #include "VSEFlags.h"
  69. #include "config.h"
  70.  
  71.  
  72. static VSLLib *vsllib = 0;    // The VSL library to read
  73.  
  74. static string vslfilename = "standard input";   // Current file name
  75.  
  76.  
  77. // GNU C++ complains about the declaration of VSLSTYPE, so leave it alone
  78. #ifdef __GNUG__
  79. #define VSLSTYPE _xy_VSLSTYPE
  80. #define _VSLSTYPE _xy_underscore_VSLSTYPE
  81. #define vsllval  _xy_vsllval
  82. #include "vsl-gramma.h"
  83. #undef vsllval
  84. #undef _VSLSTYPE
  85. #undef VSLSTYPE
  86. #else
  87. #include "vsl-gramma.h"
  88. #endif
  89.  
  90. #define ASSERT(ignore)
  91.  
  92. // Set this to enable assertions while parsing
  93. // #undef ASSERT
  94. // #define ASSERT(x) assert(x)
  95.  
  96. // The parse function generated by YACC -- this cannot be a C++ name
  97. #define vslparse VSLLib_parse
  98.  
  99. #include "vsl-lex.C"
  100. #include "vsl-gramma.C"
  101.  
  102. #undef vslparse
  103.  
  104. // Read library
  105.  
  106. // Read library from stream
  107. VSLLib& VSLLib::read(istream& s, unsigned optimizeMode)
  108. {
  109.     vsllib = this;
  110.  
  111.     vslstream = &s;
  112.     vslfilename = _lib_name;
  113.  
  114.     // Einlesen...
  115.     vslnameSet.reset();
  116.     pushback_ptr = pushback;
  117.     parse();
  118.  
  119.     if (VSEFlags::verbose)
  120.     {
  121.     cout << ")";
  122.     cout.flush();
  123.     }
  124.  
  125.     // Post-processing (Binding, optimization, etc.)
  126.     process(optimizeMode);
  127.  
  128.     if (VSEFlags::verbose)
  129.     cout << ", done.\n";
  130.  
  131.     return *this;
  132. }
  133.  
  134.  
  135. // Read library from file
  136. VSLLib& VSLLib::read(const string& lib_name, unsigned optimizeMode)
  137. {
  138.     if (VSEFlags::verbose)
  139.     {
  140.     if (lib_name == "")
  141.         cout << "standard input";
  142.     else
  143.         cout << lib_name;
  144.     cout << ": reading";
  145.     cout.flush();
  146.     }
  147.  
  148.     vslfilename = lib_name;
  149.  
  150.     switchreset();
  151.     if (switchup(lib_name, True) == 0)
  152.     {
  153.     assert(vslstream != 0);
  154.  
  155.     topstack = 0;
  156.     read(*vslstream, optimizeMode);
  157.     }
  158.  
  159.     return *this;
  160. }
  161.  
  162.  
  163. // Error handling
  164.  
  165. // Yacc-specific error handling
  166. void vslerror(char *s)
  167. {
  168.     string errmsg = s;
  169.  
  170.     if (errmsg == "syntax error" || errmsg == "parse error")
  171.      errmsg += " near " + quote((char *)vsltext);
  172.  
  173.     VSLLib::parse_error(errmsg);
  174. }
  175.  
  176. // Parsing message
  177. void VSLLib::parse_echo(const string& msg)
  178. {
  179.     ostrstream os;
  180.     ostream& s = os;
  181.     
  182.     s << vslfilename << ":" << vsllinenumber << ": " << msg;
  183.     echo(os);
  184. }
  185.  
  186. // Parsing error
  187. void VSLLib::parse_error(const string& errmsg)
  188. {
  189.     parse_echo(errmsg);
  190. }
  191.  
  192. // Parsing warning
  193. void VSLLib::parse_warning(const string& errmsg)
  194. {
  195.     parse_echo("warning: " + errmsg);
  196. }
  197.