lex.ncform 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #pragma lib "libl.a"
  2. int yylineno =1;
  3. # define YYU(x) x
  4. char yytext[YYLMAX];
  5. struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
  6. Uchar yysbuf[YYLMAX];
  7. Uchar *yysptr = yysbuf;
  8. int *yyfnd;
  9. extern struct yysvf *yyestate;
  10. int yyprevious = YYNEWLINE;
  11. # ifdef LEXDEBUG
  12. extern void allprint(char);
  13. # endif
  14. int
  15. yylook(void){
  16. struct yysvf *yystate, **lsp;
  17. struct yywork *yyt;
  18. struct yysvf *yyz;
  19. int yych;
  20. struct yywork *yyr;
  21. # ifdef LEXDEBUG
  22. int debug;
  23. # endif
  24. Uchar *yylastch;
  25. /* start off machines */
  26. # ifdef LEXDEBUG
  27. debug = 0;
  28. # endif
  29. if (!yymorfg)
  30. yylastch = (Uchar*)yytext;
  31. else {
  32. yymorfg=0;
  33. yylastch = (Uchar*)yytext+yyleng;
  34. }
  35. for(;;){
  36. lsp = yylstate;
  37. yyestate = yystate = yybgin;
  38. if (yyprevious==YYNEWLINE) yystate++;
  39. for (;;){
  40. # ifdef LEXDEBUG
  41. if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
  42. # endif
  43. yyt = yystate->yystoff;
  44. if(yyt == yycrank){ /* may not be any transitions */
  45. yyz = yystate->yyother;
  46. if(yyz == 0)break;
  47. if(yyz->yystoff == yycrank)break;
  48. }
  49. *yylastch++ = yych = input();
  50. tryagain:
  51. # ifdef LEXDEBUG
  52. if(debug){
  53. fprintf(yyout,"char ");
  54. allprint(yych);
  55. putchar('\n');
  56. }
  57. # endif
  58. yyr = yyt;
  59. if ( (int)yyt > (int)yycrank){
  60. yyt = yyr + yych;
  61. if (yyt <= yytop && yyt->verify+yysvec == yystate){
  62. if(yyt->advance+yysvec == YYLERR) /* error transitions */
  63. {unput(*--yylastch);break;}
  64. *lsp++ = yystate = yyt->advance+yysvec;
  65. goto contin;
  66. }
  67. }
  68. # ifdef YYOPTIM
  69. else if((int)yyt < (int)yycrank) { /* r < yycrank */
  70. yyt = yyr = yycrank+(yycrank-yyt);
  71. # ifdef LEXDEBUG
  72. if(debug)fprintf(yyout,"compressed state\n");
  73. # endif
  74. yyt = yyt + yych;
  75. if(yyt <= yytop && yyt->verify+yysvec == yystate){
  76. if(yyt->advance+yysvec == YYLERR) /* error transitions */
  77. {unput(*--yylastch);break;}
  78. *lsp++ = yystate = yyt->advance+yysvec;
  79. goto contin;
  80. }
  81. yyt = yyr + YYU(yymatch[yych]);
  82. # ifdef LEXDEBUG
  83. if(debug){
  84. fprintf(yyout,"try fall back character ");
  85. allprint(YYU(yymatch[yych]));
  86. putchar('\n');
  87. }
  88. # endif
  89. if(yyt <= yytop && yyt->verify+yysvec == yystate){
  90. if(yyt->advance+yysvec == YYLERR) /* error transition */
  91. {unput(*--yylastch);break;}
  92. *lsp++ = yystate = yyt->advance+yysvec;
  93. goto contin;
  94. }
  95. }
  96. if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
  97. # ifdef LEXDEBUG
  98. if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
  99. # endif
  100. goto tryagain;
  101. }
  102. # endif
  103. else
  104. {unput(*--yylastch);break;}
  105. contin:
  106. # ifdef LEXDEBUG
  107. if(debug){
  108. fprintf(yyout,"state %d char ",yystate-yysvec-1);
  109. allprint(yych);
  110. putchar('\n');
  111. }
  112. # endif
  113. ;
  114. }
  115. # ifdef LEXDEBUG
  116. if(debug){
  117. fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
  118. allprint(yych);
  119. putchar('\n');
  120. }
  121. # endif
  122. while (lsp-- > yylstate){
  123. *yylastch-- = 0;
  124. if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
  125. yyolsp = lsp;
  126. if(yyextra[*yyfnd]){ /* must backup */
  127. while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
  128. lsp--;
  129. unput(*yylastch--);
  130. }
  131. }
  132. yyprevious = YYU(*yylastch);
  133. yylsp = lsp;
  134. yyleng = yylastch-(Uchar*)yytext+1;
  135. yytext[yyleng] = 0;
  136. # ifdef LEXDEBUG
  137. if(debug){
  138. fprintf(yyout,"\nmatch '%s'", yytext);
  139. fprintf(yyout," action %d\n",*yyfnd);
  140. }
  141. # endif
  142. return(*yyfnd++);
  143. }
  144. unput(*yylastch);
  145. }
  146. if (yytext[0] == 0 /* && feof(yyin) */)
  147. {
  148. yysptr=yysbuf;
  149. return(0);
  150. }
  151. yyprevious = input();
  152. yytext[0] = yyprevious;
  153. if (yyprevious>0)
  154. output(yyprevious);
  155. yylastch = (Uchar*)yytext;
  156. # ifdef LEXDEBUG
  157. if(debug)putchar('\n');
  158. # endif
  159. }
  160. /* not reached */
  161. }
  162. int
  163. yyback(int *p, int m)
  164. {
  165. if (p==0) return(0);
  166. while (*p)
  167. {
  168. if (*p++ == m)
  169. return(1);
  170. }
  171. return(0);
  172. }
  173. /* the following are only used in the lex library */
  174. int
  175. yyinput(void){
  176. if(yyin == ((void*)0))
  177. yyin = stdin;
  178. return(input());
  179. }
  180. void
  181. yyoutput(int c)
  182. {
  183. if(yyout == ((void*)0))
  184. yyout = stdin;
  185. output(c);
  186. }
  187. void
  188. yyunput(int c)
  189. {
  190. unput(c);
  191. }