DLexerBase.h
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:6k
源码类别:

编译器/解释器

开发平台:

Others

  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. #ifndef DLGX_H
  30. #define DLGX_H
  31. #include "pcctscfg.h"
  32. #include PCCTS_STDIO_H
  33. PCCTS_NAMESPACE_STD
  34. #include ATOKEN_H
  35. #include ATOKENSTREAM_H
  36. class ANTLRParser; // MR1
  37. /* must define what a char looks like; can make this a class too */
  38. typedef char DLGChar;
  39. /*  Can have it as a class too: (ack this looks weird; is it right?)
  40. class DllExportPCCTS DLGChar {
  41. private:
  42. int c;
  43. public:
  44. DLGChar(int ch) { c = ch; }
  45. int atom() { return c; }
  46. };
  47. */
  48. /* user must subclass this */
  49. class DllExportPCCTS DLGInputStream {
  50. public:
  51. virtual int nextChar() = 0;
  52. };
  53. /* Predefined char stream: Input from FILE */
  54. class DllExportPCCTS DLGFileInput : public DLGInputStream {
  55. private:
  56. int found_eof;
  57. FILE *input;
  58. public:
  59. DLGFileInput(FILE *f) { input = f; found_eof = 0; }
  60. int nextChar() {
  61. int c;
  62. if ( found_eof ) return EOF;
  63. else {
  64. c=getc(input);
  65. if ( c==EOF ) found_eof = 1;
  66. return c;
  67. }
  68. }
  69.     void DLGFileReset(FILE *f) {input=f; found_eof = 0; };              // MR11
  70. };
  71. // MR9  Suggested by Bruce Guenter (bruceg@qcc.sk.ca)
  72. // MR9  Make DLGStringInput const correct
  73. /* Predefined char stream: Input from string */
  74. class DllExportPCCTS DLGStringInput : public DLGInputStream {
  75. private:
  76. const DLGChar *input;                                           // MR9
  77. const DLGChar *p;                                               // MR9
  78. public:
  79. DLGStringInput(const DLGChar *s) { input = s; p = &input[0];}   // MR9
  80. int nextChar()
  81. {
  82. if (*p) return (int) (unsigned char) *p++;              // MR14
  83. else return EOF;
  84. }
  85.     void DLGStringReset(DLGChar *s) {input=s; p= &input[0]; };      // MR11
  86. };
  87. class DllExportPCCTS DLGState {
  88. public:
  89. DLGInputStream *input;
  90. int interactive;
  91. int track_columns;
  92. int auto_num;
  93. int add_erase;
  94. int lookc;
  95. int char_full;
  96. int begcol, endcol;
  97. int line;
  98. DLGChar *lextext, *begexpr, *endexpr;
  99. int bufsize;
  100. int bufovf;
  101. DLGChar *nextpos;
  102. int class_num;
  103. int debugLexerFlag; // MR1
  104. ANTLRParser *parser; // MR1
  105. };
  106. /* user must subclass this */
  107. class DllExportPCCTS DLGLexerBase : public ANTLRTokenStream {
  108. public:
  109. virtual ANTLRTokenType erraction();
  110. protected:
  111. DLGInputStream *input;
  112. int interactive;
  113. int track_columns;
  114. DLGChar *_lextext; /* text of most recently matched token */
  115. DLGChar *_begexpr; /* beginning of last reg expr recogn. */
  116. DLGChar *_endexpr; /* beginning of last reg expr recogn. */
  117. int _bufsize; /* number of characters in lextext */
  118. int _begcol; /* column that first character of token is in*/
  119. int _endcol; /* column that last character of token is in */
  120. int _line; /* line current token is on */
  121. int ch; /* character to determine next state */
  122. int bufovf; /* indicates that buffer too small for text */
  123. int charfull;
  124. DLGChar *nextpos; /* points to next available position in lextext*/
  125. int cl;
  126. int automaton;
  127. int add_erase;
  128. DLGChar ebuf[70];
  129. _ANTLRTokenPtr token_to_fill;
  130. int debugLexerFlag; // MR1
  131. ANTLRParser *parser; // MR1
  132. public:
  133. virtual _ANTLRTokenPtr getToken();      // MR12 public
  134. virtual void advance(void) = 0;
  135. void skip(void); /* erase lextext, look for antoher token */
  136. void more(void); /* keep lextext, look for another token */
  137. void mode(int k); /* switch to automaton 'k' */
  138. void saveState(DLGState *);
  139. void restoreState(DLGState *);
  140. virtual ANTLRTokenType nextTokenType(void)=0;/* get next token */
  141. void replchar(DLGChar c); /* replace last recognized reg. expr. with
  142.  a character */
  143. void replstr(DLGChar *s); /* replace last recognized reg. expr. with
  144.  a string */
  145.         virtual int err_in(); // MR1
  146. virtual void errstd(char *); // MR1
  147. int line() { return _line; }
  148. void set_line(int newValue) { _line=newValue; }; // MR1
  149. virtual void newline() { _line++; }
  150. DLGChar *lextext() { return _lextext; }
  151. int begcol() { return _begcol; }
  152. int endcol() { return _endcol; }
  153. void set_begcol(int a) { _begcol=a; }
  154. void set_endcol(int a) { _endcol=a; }
  155. DLGChar *begexpr() { return _begexpr; }
  156. DLGChar *endexpr() { return _endexpr; }
  157. int bufsize() { return _bufsize; }
  158. void setToken(ANTLRAbstractToken *t) { token_to_fill = t; }
  159. void setInputStream(DLGInputStream *);
  160. DLGLexerBase(DLGInputStream *in,
  161.  unsigned bufsize=2000,
  162.  int interactive=0,
  163.  int track_columns=0);
  164. virtual ~DLGLexerBase() { delete [] _lextext; }
  165. virtual void panic(char *msg); // MR1
  166. void trackColumns() {
  167. track_columns = 1;
  168. this->_begcol = 0;
  169. this->_endcol = 0;
  170. };
  171. virtual ANTLRParser *setParser(ANTLRParser *p); // MR1
  172. virtual ANTLRParser *getParser(); // MR1
  173. virtual int debugLexer(int value); // MR1
  174.     int     lexErrCount;                            // MR12
  175. };
  176. #endif