1 /* DLGLexerBase.h 2 * 3 * SOFTWARE RIGHTS 4 * 5 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool 6 * Set (PCCTS) -- PCCTS is in the public domain. An individual or 7 * company may do whatever they wish with source code distributed with 8 * PCCTS or the code generated by PCCTS, including the incorporation of 9 * PCCTS, or its output, into commerical software. 10 * 11 * We encourage users to develop software with PCCTS. However, we do ask 12 * that credit is given to us for developing PCCTS. By "credit", 13 * we mean that if you incorporate our source code into one of your 14 * programs (commercial product, research project, or otherwise) that you 15 * acknowledge this fact somewhere in the documentation, research report, 16 * etc... If you like PCCTS and have developed a nice tool with the 17 * output, please mention that you developed it using PCCTS. In 18 * addition, we ask that this header remain intact in our source code. 19 * As long as these guidelines are kept, we expect to continue enhancing 20 * this system and expect to make other tools available as they are 21 * completed. 22 * 23 * ANTLR 1.33 24 * Terence Parr 25 * Parr Research Corporation 26 * with Purdue University and AHPCRC, University of Minnesota 27 * 1989-1998 28 */ 29 30 #ifndef DLGX_H 31 #define DLGX_H 32 33 #include "pcctscfg.h" 34 #include "pccts_stdio.h" 35 36 PCCTS_NAMESPACE_STD 37 38 #include ATOKEN_H 39 #include ATOKENSTREAM_H 40 41 class ANTLRParser; // MR1 42 43 /* must define what a char looks like; can make this a class too */ 44 typedef char DLGChar; 45 46 /* Can have it as a class too: (ack this looks weird; is it right?) 47 class DllExportPCCTS DLGChar { 48 private: 49 int c; 50 public: 51 DLGChar(int ch) { c = ch; } 52 int atom() { return c; } 53 }; 54 */ 55 56 /* user must subclass this */ 57 class DllExportPCCTS DLGInputStream { 58 public: 59 virtual int nextChar() = 0; 60 }; 61 62 /* Predefined char stream: Input from FILE */ 63 class DllExportPCCTS DLGFileInput : public DLGInputStream { 64 private: 65 int found_eof; 66 FILE *input; 67 public: 68 DLGFileInput(FILE *f) { input = f; found_eof = 0; } 69 int nextChar() { 70 int c; 71 if ( found_eof ) return EOF; 72 else { 73 c=getc(input); 74 if ( c==EOF ) found_eof = 1; 75 return c; 76 } 77 } 78 void DLGFileReset(FILE *f) {input=f; found_eof = 0; }; // MR11 79 }; 80 81 // MR9 Suggested by Bruce Guenter (bruceg (at) qcc.sk.ca) 82 // MR9 Make DLGStringInput const correct 83 84 /* Predefined char stream: Input from string */ 85 class DllExportPCCTS DLGStringInput : public DLGInputStream { 86 private: 87 const DLGChar *input; // MR9 88 const DLGChar *p; // MR9 89 public: 90 DLGStringInput(const DLGChar *s) { input = s; p = &input[0];} // MR9 91 int nextChar() 92 { 93 if (*p) return (int) (unsigned char) *p++; // MR14 94 else return EOF; 95 } 96 97 void DLGStringReset(const DLGChar *s) {input=s; p= &input[0]; }; // MR11 // MR16 98 }; 99 100 class DllExportPCCTS DLGState { 101 public: 102 DLGInputStream *input; 103 int interactive; 104 int track_columns; 105 int auto_num; 106 int add_erase; 107 int lookc; 108 int char_full; 109 int begcol, endcol; 110 int line; 111 DLGChar *lextext, *begexpr, *endexpr; 112 int bufsize; 113 int bufovf; 114 DLGChar *nextpos; 115 int class_num; 116 int debugLexerFlag; // MR1 117 ANTLRParser *parser; // MR1 118 }; 119 120 /* user must subclass this */ 121 class DllExportPCCTS DLGLexerBase : public ANTLRTokenStream { 122 public: 123 virtual ANTLRTokenType erraction(); 124 125 protected: 126 DLGInputStream *input; 127 int interactive; 128 int track_columns; 129 DLGChar *_lextext; /* text of most recently matched token */ 130 DLGChar *_begexpr; /* beginning of last reg expr recogn. */ 131 DLGChar *_endexpr; /* beginning of last reg expr recogn. */ 132 int _bufsize; /* number of characters in lextext */ 133 int _begcol; /* column that first character of token is in*/ 134 int _endcol; /* column that last character of token is in */ 135 int _line; /* line current token is on */ 136 int ch; /* character to determine next state */ 137 int bufovf; /* indicates that buffer too small for text */ 138 int charfull; 139 DLGChar *nextpos; /* points to next available position in lextext*/ 140 int cl; 141 int automaton; 142 int add_erase; 143 DLGChar ebuf[70]; 144 _ANTLRTokenPtr token_to_fill; 145 146 int debugLexerFlag; // MR1 147 ANTLRParser *parser; // MR1 148 public: 149 virtual _ANTLRTokenPtr getToken(); // MR12 public 150 virtual void advance(void) = 0; 151 void skip(void); /* erase lextext, look for antoher token */ 152 void more(void); /* keep lextext, look for another token */ 153 void mode(int k); /* switch to automaton 'k' */ 154 void saveState(DLGState *); 155 void restoreState(DLGState *); 156 virtual ANTLRTokenType nextTokenType(void)=0;/* get next token */ 157 void replchar(DLGChar c); /* replace last recognized reg. expr. with 158 a character */ 159 void replstr(const DLGChar *s); /* replace last recognized reg. expr. with 160 a string */ /* MR20 const */ 161 virtual int err_in(); // MR1 162 virtual void errstd(const char *); // MR1 MR20 const 163 int line() { return _line; } 164 void set_line(int newValue) { _line=newValue; }; // MR1 165 virtual void newline() { _line++; } 166 DLGChar *lextext() { return _lextext; } 167 168 int begcol() { return _begcol; } 169 int endcol() { return _endcol; } 170 void set_begcol(int a) { _begcol=a; } 171 void set_endcol(int a) { _endcol=a; } 172 DLGChar *begexpr() { return _begexpr; } 173 DLGChar *endexpr() { return _endexpr; } 174 int bufsize() { return _bufsize; } 175 176 void setToken(ANTLRAbstractToken *t) { token_to_fill = t; } 177 178 void setInputStream(DLGInputStream *); 179 DLGLexerBase(DLGInputStream *in, 180 unsigned bufsize=2000, 181 int interactive=0, 182 int track_columns=0); 183 void reset(); // MR19 184 virtual ~DLGLexerBase() { delete [] _lextext; } 185 virtual void panic(const char *msg); // MR1 MR20 const 186 void trackColumns() { 187 track_columns = 1; 188 this->_begcol = 0; 189 this->_endcol = 0; 190 }; 191 virtual ANTLRParser *setParser(ANTLRParser *p); // MR1 192 virtual ANTLRParser *getParser(); // MR1 193 virtual int debugLexer(int value); // MR1 194 int lexErrCount; // MR12 195 }; 196 197 #endif 198