1 #ifndef PBLACKBOX_H
2 #define PBLACKBOX_H
3 
4 /*
5  * SOFTWARE RIGHTS
6  *
7  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
8  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
9  * company may do whatever they wish with source code distributed with
10  * PCCTS or the code generated by PCCTS, including the incorporation of
11  * PCCTS, or its output, into commerical software.
12  *
13  * We encourage users to develop software with PCCTS.  However, we do ask
14  * that credit is given to us for developing PCCTS.  By "credit",
15  * we mean that if you incorporate our source code into one of your
16  * programs (commercial product, research project, or otherwise) that you
17  * acknowledge this fact somewhere in the documentation, research report,
18  * etc...  If you like PCCTS and have developed a nice tool with the
19  * output, please mention that you developed it using PCCTS.  In
20  * addition, we ask that this header remain intact in our source code.
21  * As long as these guidelines are kept, we expect to continue enhancing
22  * this system and expect to make other tools available as they are
23  * completed.
24  *
25  * ANTLR 1.33
26  * Terence Parr
27  * Parr Research Corporation
28  * with Purdue University and AHPCRC, University of Minnesota
29  * 1989-2000
30  */
31 
32 /* Completely rewritten by Chris Uzdavinis (chris@atdesk.com) for MR23 */
33 
34 #include "pcctscfg.h"
35 
36 #include "pccts_iostream.h"
37 
38 PCCTS_NAMESPACE_STD
39 
40 //  MR20 Added #include for "DLexerBase.h"
41 
42 #include "DLexerBase.h"
43 
44 //
45 //  The default buffer size of the lexer is given by the
46 //   second argument of the lexer's ctor.  It is optional
47 //   and defaults to 2000
48 //
49 
50 template<class Lexer, class Parser, class Token>
51 class DllExportPCCTS ParserBlackBox {
52 private:
53   // no copy construction allowed
54   ParserBlackBox(ParserBlackBox const &);
55 
56   // no copy assignment allowed
57   ParserBlackBox & operator=(ParserBlackBox const &);
58 
59 protected:
60   DLGFileInput *in;
61   Lexer *scan;
62   _ANTLRTokenPtr tok;
63   ANTLRTokenBuffer *pipe;
64   Parser *_parser;
65   FILE *file;
66   int openByBlackBox;    /* MR21 Don't close what we haven't opened */
67 public:
68 
ParserBlackBox(FILE * f)69   ParserBlackBox(FILE *f)
70     : in(0)
71     , scan(0)
72     , tok(0)
73     , pipe(0)
74     , _parser(0)
75     , file(0)
76     , openByBlackBox(0)
77   {
78     if (f == NULL)
79     {
80       cerr << "invalid file pointer\n";
81     }
82     else
83     {
84       openByBlackBox = 0;     /* MR21a */
85       file = f;
86       in = new DLGFileInput(f);
87       scan = new Lexer(in);
88       pipe = new ANTLRTokenBuffer(scan);
89       tok = new Token;
90       scan->setToken(tok);
91       _parser = new Parser(pipe);
92       _parser->init();
93     }
94   }
ParserBlackBox(char * fname)95   ParserBlackBox(char *fname)
96     : in(0)
97     , scan(0)
98     , tok(0)
99     , pipe(0)
100     , _parser(0)
101     , file(0)
102     , openByBlackBox(0)
103   {
104     FILE *f = fopen(fname, "r");
105     if ( f==NULL ) {
106       openByBlackBox = 0;
107       cerr << "cannot open " << fname << "\n"; return;
108     }
109     else {
110       openByBlackBox = 1;
111       file = f;
112       in = new DLGFileInput(f);
113       scan = new Lexer(in);
114       pipe = new ANTLRTokenBuffer(scan);
115       tok = new Token;
116       scan->setToken(tok);
117       _parser = new Parser(pipe);
118       _parser->init();
119     }
120   }
121 
~ParserBlackBox()122   ~ParserBlackBox()
123   {
124     delete in; delete scan; delete pipe; delete _parser; delete tok;
125     if (1 == openByBlackBox) {
126       fclose(file);
127     }
128   }
129 
parser()130   Parser *parser()	   { return _parser; }
getLexer()131   Lexer  *getLexer()     { return scan; }
132 };
133 
134 #endif
135