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