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

编译器/解释器

开发平台:

Others

  1. /* DLexer.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. #define ZZINC {if ( track_columns ) (++_endcol);}
  30. #define ZZGETC {ch = input->nextChar(); cl = ZZSHIFT(ch);}
  31. #define ZZNEWSTATE (newstate = dfa[state][cl])
  32. #ifndef ZZCOPY
  33. #define ZZCOPY
  34. /* Truncate matching buffer to size (not an error) */
  35. if (nextpos < lastpos){
  36. *(nextpos++) = ch;
  37. }else{
  38. bufovf = 1;
  39. }
  40. #endif
  41. void DLGLexer::
  42. mode( int m )
  43. {
  44. /* points to base of dfa table */
  45. if (m<MAX_MODE){
  46. automaton = m;
  47. /* have to redo class since using different compression */
  48. cl = ZZSHIFT(ch);
  49. }else{
  50. sprintf((char *)ebuf,"Invalid automaton mode = %d ",m);
  51. errstd(ebuf);
  52. }
  53. }
  54. ANTLRTokenType DLGLexer::
  55. nextTokenType(void)
  56. {
  57. register int state, newstate;
  58. /* last space reserved for the null char */
  59. register DLGChar *lastpos;
  60. ANTLRTokenType tk;
  61. skip:
  62. bufovf = 0;
  63. lastpos = &_lextext[_bufsize-1];
  64. nextpos = _lextext;
  65. _begcol = _endcol+1;
  66. more:
  67. _begexpr = nextpos;
  68. if ( interactive ) {
  69. /* interactive version of automaton */
  70. /* if there is something in ch, process it */
  71. state = newstate = dfa_base[automaton];
  72. if (charfull){
  73. ZZINC;
  74. ZZCOPY;
  75. ZZNEWSTATE;
  76. }
  77. while (alternatives[newstate]){
  78. state = newstate;
  79. ZZGETC;
  80. ZZINC;
  81. ZZCOPY;
  82. ZZNEWSTATE;
  83. }
  84. /* figure out if last character really part of token */
  85. if ((state != dfa_base[automaton]) && (newstate == DfaStates)){
  86. charfull = 1;
  87. --nextpos;
  88. }else{
  89. charfull = 0;
  90. state = newstate;
  91. }
  92. *(nextpos) = '';
  93. /* Able to transition out of start state to some non err state?*/
  94. if ( state == dfa_base[automaton] ){
  95. /* make sure doesn't get stuck */
  96. advance();
  97. }
  98. }
  99. else { /* non-interactive version of automaton */
  100. if (!charfull)
  101. advance();
  102. else
  103. ZZINC;
  104. state = dfa_base[automaton];
  105. while (ZZNEWSTATE != DfaStates) {
  106. state = newstate;
  107. ZZCOPY;
  108. ZZGETC;
  109. ZZINC;
  110. }
  111. charfull = 1;
  112. if ( state == dfa_base[automaton] ){
  113. if (nextpos < lastpos){
  114. *(nextpos++) = ch;
  115. }else{
  116. bufovf = 1;
  117. }
  118. *nextpos = '';
  119. /* make sure doesn't get stuck */
  120. advance();
  121. }else{
  122. *nextpos = '';
  123. }
  124. }
  125. if ( track_columns ) _endcol -= charfull;
  126. _endexpr = nextpos -1;
  127. add_erase = 0;
  128. #ifdef OLD
  129. tk = (ANTLRTokenType)
  130.  (*actions[accepts[state]])(this); // must pass this manually
  131. // actions is not a [] of pointers
  132. // to member functions.
  133. #endif
  134. tk = (this->*actions[accepts[state]])();
  135. // MR1
  136. // MR1 11-Apr-97  Help for tracking DLG results
  137. // MR1
  138. #ifdef DEBUG_LEXER
  139. /* MR1 */        if (debugLexerFlag) {
  140. /* MR1 */    if (parser != NULL) {
  141. /* MR1 */      printf("ntoken name=%s",parser->parserTokenName(tk));
  142. /* MR1 */    } else {
  143. /* MR1 */      printf("ntoken nnumber=%d",tk);
  144. /* MR1 */    };
  145. /* MR1 */    printf(" lextext=(%s) mode=%d",
  146. /* MR1 */  (_lextext[0]=='n' && _lextext[1]==0) ?
  147. /* MR1 */ "newline" : _lextext,
  148. /* MR1 */ automaton);
  149. /* MR1 */          if (interactive && !charfull) {
  150. /* MR1 */      printf(" char=empty");
  151. /* MR1 */          } else {
  152. /* MR1 */      if (ch=='n') {
  153. /* MR1 */        printf(" char=newline");
  154. /* MR1 */      } else {
  155. /* MR1 */        printf(" char=(%c)",ch);
  156. /* MR1 */      };
  157. /* MR1 */    };
  158. /* MR1 */    printf(" %sn",
  159. /* MR1 */  (add_erase==1 ? "skip()" :
  160. /* MR1 */   add_erase==2 ? "more()" :
  161. /* MR1 */   ""));
  162. /* MR1 */        };
  163. #endif
  164. switch (add_erase) {
  165. case 1: goto skip;
  166. case 2: goto more;
  167. }
  168. return tk;
  169. }
  170. void DLGLexer::
  171. advance()
  172. {
  173. if ( input==NULL ) err_in();
  174. ZZGETC; charfull = 1; ZZINC;
  175. }