13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* DLGLexerBase.h 23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 33eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * SOFTWARE RIGHTS 43eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We reserve no LEGAL rights to the Purdue Compiler Construction Tool 63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Set (PCCTS) -- PCCTS is in the public domain. An individual or 73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * company may do whatever they wish with source code distributed with 83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS or the code generated by PCCTS, including the incorporation of 93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS, or its output, into commerical software. 103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We encourage users to develop software with PCCTS. However, we do ask 123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * that credit is given to us for developing PCCTS. By "credit", 133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * we mean that if you incorporate our source code into one of your 143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * programs (commercial product, research project, or otherwise) that you 153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * acknowledge this fact somewhere in the documentation, research report, 163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * etc... If you like PCCTS and have developed a nice tool with the 173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * output, please mention that you developed it using PCCTS. In 183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * addition, we ask that this header remain intact in our source code. 193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * As long as these guidelines are kept, we expect to continue enhancing 203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * this system and expect to make other tools available as they are 213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * completed. 223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * ANTLR 1.33 243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Terence Parr 253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Parr Research Corporation 263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * with Purdue University and AHPCRC, University of Minnesota 273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 1989-1998 283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */ 293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef DLGX_H 313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define DLGX_H 323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pcctscfg.h" 343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_stdio.h" 353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPCCTS_NAMESPACE_STD 373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include ATOKEN_H 393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include ATOKENSTREAM_H 403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass ANTLRParser; // MR1 423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* must define what a char looks like; can make this a class too */ 443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangtypedef char DLGChar; 453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Can have it as a class too: (ack this looks weird; is it right?) 473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGChar { 483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprivate: 493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int c; 503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar(int ch) { c = ch; } 523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int atom() { return c; } 533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang*/ 553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* user must subclass this */ 573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGInputStream { 583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int nextChar() = 0; 603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Predefined char stream: Input from FILE */ 633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGFileInput : public DLGInputStream { 643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprivate: 653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int found_eof; 663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang FILE *input; 673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGFileInput(FILE *f) { input = f; found_eof = 0; } 693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int nextChar() { 703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int c; 713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang if ( found_eof ) return EOF; 723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang else { 733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang c=getc(input); 743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang if ( c==EOF ) found_eof = 1; 753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang return c; 763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } 773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } 783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void DLGFileReset(FILE *f) {input=f; found_eof = 0; }; // MR11 793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// MR9 Suggested by Bruce Guenter (bruceg@qcc.sk.ca) 823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// MR9 Make DLGStringInput const correct 833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Predefined char stream: Input from string */ 853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGStringInput : public DLGInputStream { 863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprivate: 873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang const DLGChar *input; // MR9 883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang const DLGChar *p; // MR9 893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGStringInput(const DLGChar *s) { input = s; p = &input[0];} // MR9 913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int nextChar() 923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang { 933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang if (*p) return (int) (unsigned char) *p++; // MR14 943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang else return EOF; 953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang } 963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void DLGStringReset(const DLGChar *s) {input=s; p= &input[0]; }; // MR11 // MR16 983eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGState { 1013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 1023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGInputStream *input; 1033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int interactive; 1043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int track_columns; 1053eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int auto_num; 1063eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int add_erase; 1073eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int lookc; 1083eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int char_full; 1093eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int begcol, endcol; 1103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int line; 1113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *lextext, *begexpr, *endexpr; 1123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int bufsize; 1133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int bufovf; 1143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *nextpos; 1153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int class_num; 1163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int debugLexerFlag; // MR1 1173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ANTLRParser *parser; // MR1 1183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 1193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* user must subclass this */ 1213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangclass DllExportPCCTS DLGLexerBase : public ANTLRTokenStream { 1223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 1233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ANTLRTokenType erraction(); 1243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangprotected: 1263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGInputStream *input; 1273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int interactive; 1283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int track_columns; 1293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *_lextext; /* text of most recently matched token */ 1303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *_begexpr; /* beginning of last reg expr recogn. */ 1313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *_endexpr; /* beginning of last reg expr recogn. */ 1323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int _bufsize; /* number of characters in lextext */ 1333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int _begcol; /* column that first character of token is in*/ 1343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int _endcol; /* column that last character of token is in */ 1353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int _line; /* line current token is on */ 1363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int ch; /* character to determine next state */ 1373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int bufovf; /* indicates that buffer too small for text */ 1383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int charfull; 1393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *nextpos; /* points to next available position in lextext*/ 1403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int cl; 1413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int automaton; 1423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int add_erase; 1433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar ebuf[70]; 1443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang _ANTLRTokenPtr token_to_fill; 1453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int debugLexerFlag; // MR1 1473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang ANTLRParser *parser; // MR1 1483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangpublic: 1493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual _ANTLRTokenPtr getToken(); // MR12 public 1503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void advance(void) = 0; 1513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void skip(void); /* erase lextext, look for antoher token */ 1523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void more(void); /* keep lextext, look for another token */ 1533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void mode(int k); /* switch to automaton 'k' */ 1543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void saveState(DLGState *); 1553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void restoreState(DLGState *); 1563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ANTLRTokenType nextTokenType(void)=0;/* get next token */ 1573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void replchar(DLGChar c); /* replace last recognized reg. expr. with 1583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang a character */ 1593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void replstr(const DLGChar *s); /* replace last recognized reg. expr. with 1603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang a string */ /* MR20 const */ 1613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int err_in(); // MR1 1623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void errstd(const char *); // MR1 MR20 const 1633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int line() { return _line; } 1643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void set_line(int newValue) { _line=newValue; }; // MR1 1653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void newline() { _line++; } 1663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *lextext() { return _lextext; } 1673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int begcol() { return _begcol; } 1693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int endcol() { return _endcol; } 1703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void set_begcol(int a) { _begcol=a; } 1713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void set_endcol(int a) { _endcol=a; } 1723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *begexpr() { return _begexpr; } 1733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGChar *endexpr() { return _endexpr; } 1743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int bufsize() { return _bufsize; } 1753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void setToken(ANTLRAbstractToken *t) { token_to_fill = t; } 1773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void setInputStream(DLGInputStream *); 1793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang DLGLexerBase(DLGInputStream *in, 1803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang unsigned bufsize=2000, 1813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int interactive=0, 1823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int track_columns=0); 1833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void reset(); // MR19 1843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ~DLGLexerBase() { delete [] _lextext; } 1853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual void panic(const char *msg); // MR1 MR20 const 1863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang void trackColumns() { 1873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang track_columns = 1; 1883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang this->_begcol = 0; 1893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang this->_endcol = 0; 1903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang }; 1913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ANTLRParser *setParser(ANTLRParser *p); // MR1 1923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual ANTLRParser *getParser(); // MR1 1933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang virtual int debugLexer(int value); // MR1 1943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang int lexErrCount; // MR12 1953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}; 1963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang 1973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif 198