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

编译器/解释器

开发平台:

Others

  1. /* DLGLexerBase.c
  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. #include "pcctscfg.h"
  30. #include PCCTS_STDIO_H
  31. #include PCCTS_STDLIB_H
  32. PCCTS_NAMESPACE_STD
  33. /* I have to put this here due to C++ limitation
  34.  * that you can't have a 'forward' decl for enums.
  35.  * I hate C++!!!!!!!!!!!!!!!
  36.  */
  37. // MR1
  38. // MR1  10-Apr-97  133MR1  Prevent use of varying sizes for the
  39. // MR1   ANTLRTokenType enum
  40. // MR1
  41. enum ANTLRTokenType { TER_HATES_CPP=0, ITS_UTTER_GARBAGE, // MR1
  42.  WITH_SOME_GOOD_IDEAS=9999}; // MR1
  43. #define ANTLR_SUPPORT_CODE
  44. #include "pcctscfg.h"
  45. #include DLEXERBASE_H
  46. DLGLexerBase::
  47. DLGLexerBase(DLGInputStream *in,
  48.      unsigned bufsize,
  49.      int _interactive,
  50.      int _track_columns)
  51. {
  52. this->_bufsize = bufsize;
  53. this->_lextext = new DLGChar[_bufsize];
  54. if ( this->_lextext==NULL ) {
  55.     panic("text buffer is NULL");
  56. }
  57. this->_begexpr = this->_endexpr = NULL;
  58. this->ch = this->bufovf = 0;
  59. this->nextpos = NULL;
  60. this->cl = 0;
  61. this->add_erase = 0;
  62. this->input = in;
  63. this->_begcol = 0;
  64. this->_endcol = 0;
  65. this->_line = 1;
  66. this->charfull = 0;
  67. this->automaton = 0;
  68. this->token_to_fill = NULL;
  69. this->interactive = _interactive;
  70. this->track_columns = _track_columns;
  71. this->debugLexerFlag = 0; // MR1
  72. this->parser = NULL; // MR1
  73.     this->lexErrCount=0;                        // MR11
  74. }
  75. void DLGLexerBase::
  76. setInputStream( DLGInputStream *in )
  77. {
  78. this->input = in;
  79. _line = 1;
  80. charfull = 0;
  81. }
  82. /* saves dlg state, but not what feeds dlg (such as file position) */
  83. void DLGLexerBase::
  84. saveState(DLGState *state)
  85. {
  86. state->input = input;
  87. state->interactive = interactive;
  88. state->track_columns = track_columns;
  89. state->auto_num = automaton;
  90. state->add_erase = add_erase;
  91. state->lookc = ch;
  92. state->char_full = charfull;
  93. state->begcol = _begcol;
  94. state->endcol = _endcol;
  95. state->line = _line;
  96. state->lextext = _lextext;
  97. state->begexpr = _begexpr;
  98. state->endexpr = _endexpr;
  99. state->bufsize = _bufsize;
  100. state->bufovf = bufovf;
  101. state->nextpos = nextpos;
  102. state->class_num = cl;
  103. state->debugLexerFlag = debugLexerFlag; // MR1
  104. state->parser = parser; // MR1
  105. }
  106. void DLGLexerBase::
  107. restoreState(DLGState *state)
  108. {
  109. input = state->input;
  110. interactive = state->interactive;
  111. track_columns = state->track_columns;
  112. automaton = state->auto_num;
  113. add_erase = state->add_erase;
  114. ch = state->lookc;
  115. charfull = state->char_full;
  116. _begcol = state->begcol;
  117. _endcol = state->endcol;
  118. _line = state->line;
  119. _lextext = state->lextext;
  120. _begexpr = state->begexpr;
  121. _endexpr = state->endexpr;
  122. _bufsize = state->bufsize;
  123. bufovf = state->bufovf;
  124. nextpos = state->nextpos;
  125. cl = state->class_num;
  126. debugLexerFlag = state->debugLexerFlag; // MR1
  127. parser = state->parser; // MR1
  128. }
  129. /* erase what is currently in the buffer, and get a new reg. expr */
  130. void DLGLexerBase::
  131. skip()
  132. {
  133. add_erase = 1;
  134. }
  135. /* don't erase what is in the lextext buffer, add on to it */
  136. void DLGLexerBase::
  137. more()
  138. {
  139. add_erase = 2;
  140. }
  141. /* substitute c for the reg. expr last matched and is in the buffer */
  142. void DLGLexerBase::
  143. replchar(DLGChar c)
  144. {
  145. /* can't allow overwriting null at end of string */
  146. if (_begexpr < &_lextext[_bufsize-1]){
  147. *_begexpr = c;
  148. *(_begexpr+1) = '';
  149. }
  150. _endexpr = _begexpr;
  151. nextpos = _begexpr + 1;
  152. }
  153. /* replace the string s for the reg. expr last matched and in the buffer */
  154. void DLGLexerBase::
  155. replstr(register DLGChar *s)
  156. {
  157. register DLGChar *l= &_lextext[_bufsize -1];
  158. nextpos = _begexpr;
  159. if (s){
  160.   while ((nextpos <= l) && (*(nextpos++) = *(s++))){
  161. /* empty */
  162. }
  163. /* correct for NULL at end of string */
  164. nextpos--;
  165. }
  166. if ((nextpos <= l) && (*(--s) == 0)){
  167. bufovf = 0;
  168. }else{
  169. bufovf = 1;
  170. }
  171. *(nextpos) = '';
  172. _endexpr = nextpos - 1;
  173. }
  174. void DLGLexerBase::
  175. errstd(char *s)
  176. {
  177.         lexErrCount++;                              /* MR11 */
  178.         fprintf(stderr,
  179.                 "%s near line %d (text was '%s')n",
  180.                 ((s == NULL) ? "Lexical error" : s),
  181.                 _line,_lextext);
  182. }
  183. int DLGLexerBase::
  184. err_in()
  185. {
  186. fprintf(stderr,"No input stream, function, or stringn");
  187. /* return eof to get out gracefully */
  188. return EOF;
  189. }
  190. ANTLRTokenType DLGLexerBase::
  191. erraction()
  192. {
  193. errstd("invalid token");
  194. advance();
  195. skip();
  196. return (ANTLRTokenType) 0; // bogus, but satisfies compiler
  197. }
  198. _ANTLRTokenPtr DLGLexerBase::
  199. getToken()
  200. {
  201. if ( token_to_fill==NULL ) panic("NULL token_to_fill");
  202. ANTLRTokenType tt = nextTokenType();
  203. _ANTLRTokenPtr tk = token_to_fill->makeToken(tt, _lextext,_line);
  204. return tk;
  205. }
  206. void DLGLexerBase::
  207. panic(char *msg)
  208. {
  209. fprintf(stderr, "DLG panic: %sn", msg);
  210. //
  211. //  7-Apr-97 133MR1
  212. //
  213. exit(PCCTS_EXIT_FAILURE); // MR1
  214. }
  215. ANTLRParser * DLGLexerBase:: // MR1
  216. setParser(ANTLRParser *p) { // MR1
  217.   ANTLRParser *oldValue=parser; // MR1
  218.   parser=p; // MR1
  219.   return oldValue; // MR1
  220. } // MR1
  221. // MR1
  222. ANTLRParser * DLGLexerBase:: // MR1
  223. getParser() { // MR1
  224.   return parser; // MR1
  225. } // MR1
  226. // MR1
  227. int DLGLexerBase:: // MR1
  228. debugLexer(int newValue) { // MR1
  229.   int oldValue=debugLexerFlag; // MR1
  230.   debugLexerFlag=newValue; // MR1
  231.   return oldValue; // MR1
  232. } // MR1