13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef PBLACKBOX_H
23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define PBLACKBOX_H
33eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
43eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*
53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * SOFTWARE RIGHTS
63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * company may do whatever they wish with source code distributed with
103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS or the code generated by PCCTS, including the incorporation of
113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS, or its output, into commerical software.
123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We encourage users to develop software with PCCTS.  However, we do ask
143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * that credit is given to us for developing PCCTS.  By "credit",
153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * we mean that if you incorporate our source code into one of your
163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * programs (commercial product, research project, or otherwise) that you
173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * acknowledge this fact somewhere in the documentation, research report,
183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * etc...  If you like PCCTS and have developed a nice tool with the
193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * output, please mention that you developed it using PCCTS.  In
203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * addition, we ask that this header remain intact in our source code.
213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * As long as these guidelines are kept, we expect to continue enhancing
223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * this system and expect to make other tools available as they are
233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * completed.
243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * ANTLR 1.33
263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Terence Parr
273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Parr Research Corporation
283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * with Purdue University and AHPCRC, University of Minnesota
293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 1989-1998
303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pcctscfg.h"
333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_iostream.h"
353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPCCTS_NAMESPACE_STD
373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  MR20 Added #include for "DLexerBase.h"
393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "DLexerBase.h"
413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  The default buffer size of the lexer is given by the
443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//   second argument of the lexer's ctor.  It is optional
453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//   and defaults to 2000
463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtemplate<class Lexer, class Parser, class Token>
493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS ParserBlackBox {
503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprotected:
513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  DLGFileInput *in;
523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Lexer *scan;
533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  _ANTLRTokenPtr tok;
543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  ANTLRTokenBuffer *pipe;
553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Parser *_parser;
563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  FILE *file;
573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    int openByBlackBox;    /* MR21 Don't close what we haven't opened */
583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic:
593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  ParserBlackBox(FILE *f)
613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    {
623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            openByBlackBox = 0;     /* MR21a */
633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      file = f;
643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      in = new DLGFileInput(f);
653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      scan = new Lexer(in);
663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      pipe = new ANTLRTokenBuffer(scan);
673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      tok = new Token;
683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      scan->setToken(tok);
693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      _parser = new Parser(pipe);
703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      _parser->init();
713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    }
723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  ParserBlackBox(char *fname)
733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    {
743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      FILE *f = fopen(fname, "r");
753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      if ( f==NULL ) {
763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang                openByBlackBox = 0;
773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang                cerr << "cannot open " << fname << "\n"; return;
783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            }
793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      else {
803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang                openByBlackBox = 1;
813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        file = f;
823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        in = new DLGFileInput(f);
833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        scan = new Lexer(in);
843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        pipe = new ANTLRTokenBuffer(scan);
853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        tok = new Token;
863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        scan->setToken(tok);
873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        _parser = new Parser(pipe);
883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        _parser->init();
893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      }
903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    }
913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  ~ParserBlackBox()
933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    {
943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      delete in; delete scan; delete pipe; delete _parser; delete tok;
953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            if (1 == openByBlackBox) {
963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          fclose(file);
973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            }
983eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    }
993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Parser *parser()     { return _parser; }
1013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    Lexer  *getLexer()     { return scan; }
1023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang};
1033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
105