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

编译器/解释器

开发平台:

Others

  1. /* dlgauto.h automaton
  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.  * Will Cohen and Terence Parr
  25.  * Parr Research Corporation
  26.  * with Purdue University and AHPCRC, University of Minnesota
  27.  * 1989-1998
  28.  */
  29. #ifndef ZZDEFAUTO_H
  30. #define ZZDEFAUTO_H
  31. /*  10-Apr-97 133MR1 Uses __USE_PROTOS show should #include pcctscfg.h */
  32. #include "pcctscfg.h"
  33. zzchar_t *zzlextext; /* text of most recently matched token */
  34. zzchar_t *zzbegexpr; /* beginning of last reg expr recogn. */
  35. zzchar_t *zzendexpr; /* beginning of last reg expr recogn. */
  36. int zzbufsize = 0; /* number of characters in zzlextext */          /* MR7 */
  37. int zzbegcol = 0; /* column that first character of token is in*/
  38. int zzendcol = 0; /* column that last character of token is in */
  39. int zzline = 1; /* line current token is on */
  40. int zzreal_line=1; /* line of 1st portion of token that is not skipped */
  41. int zzchar; /* character to determine next state */
  42. int zzbufovf; /* indicates that buffer too small for text */
  43. int zzcharfull = 0;
  44. static zzchar_t *zznextpos;/* points to next available position in zzlextext*/
  45. static int  zzclass;
  46. #ifdef __USE_PROTOS
  47. void zzerrstd(const char *);
  48. void (*zzerr)(const char *)=zzerrstd;/* pointer to error reporting function */
  49. extern int zzerr_in(void);
  50. #else
  51. void zzerrstd();
  52. void (*zzerr)()=zzerrstd; /* pointer to error reporting function */
  53. extern int zzerr_in();
  54. #endif
  55. static FILE *zzstream_in=0;
  56. static int (*zzfunc_in)() = zzerr_in;
  57. static zzchar_t *zzstr_in=0;
  58. #ifdef USER_ZZMODE_STACK
  59. int            zzauto = 0;
  60. #else
  61. static int     zzauto = 0;
  62. #endif
  63. static int zzadd_erase;
  64. static char  zzebuf[70];
  65. #ifdef ZZCOL
  66. #define ZZINC (++zzendcol)
  67. #else
  68. #define ZZINC
  69. #endif
  70. #define ZZGETC_STREAM {zzchar = getc(zzstream_in); zzclass = ZZSHIFT(zzchar);}
  71. #define ZZGETC_FUNC {zzchar = (*zzfunc_in)(); zzclass = ZZSHIFT(zzchar);}
  72. #define ZZGETC_STR { 
  73. if (*zzstr_in){
  74. zzchar = *zzstr_in;
  75. ++zzstr_in;
  76. }else{
  77. zzchar = EOF;
  78. }
  79. zzclass = ZZSHIFT(zzchar);
  80. }
  81. #define ZZNEWSTATE (newstate = dfa[state][zzclass])
  82. #ifndef ZZCOPY
  83. #define ZZCOPY
  84. /* Truncate matching buffer to size (not an error) */
  85. if (zznextpos < lastpos){
  86. *(zznextpos++) = zzchar;
  87. }else{
  88. zzbufovf = 1;
  89. }
  90. #endif
  91. void
  92. #ifdef __USE_PROTOS
  93. zzrdstream( FILE *f )
  94. #else
  95. zzrdstream( f )
  96. FILE *f;
  97. #endif
  98. {
  99. /* make sure that it is really set to something, otherwise just
  100.    leave it be.
  101. */
  102. if (f){
  103. /* make sure that there is always someplace to get input
  104.    before closing zzstream_in
  105. */
  106. #if 0
  107. if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
  108. #endif
  109. zzline = 1;
  110. zzstream_in = f;
  111. zzfunc_in = NULL;
  112. zzstr_in = 0;
  113. zzcharfull = 0;
  114. }
  115. }
  116. void
  117. #ifdef __USE_PROTOS
  118. zzrdfunc( int (*f)() )
  119. #else
  120. zzrdfunc( f )
  121. int (*f)();
  122. #endif
  123. {
  124. /* make sure that it is really set to something, otherwise just
  125.    leave it be.
  126. */
  127. if (f){
  128. /* make sure that there is always someplace to get input
  129.    before closing zzstream_in
  130. */
  131. #if 0
  132. if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
  133. #endif
  134. zzline = 1;
  135. zzstream_in = NULL;
  136. zzfunc_in = f;
  137. zzstr_in = 0;
  138. zzcharfull = 0;
  139. }
  140. }
  141. void
  142. #ifdef __USE_PROTOS
  143. zzrdstr( zzchar_t *s )
  144. #else
  145. zzrdstr( s )
  146. zzchar_t *s;
  147. #endif
  148. {
  149. /* make sure that it is really set to something, otherwise just
  150.    leave it be.
  151. */
  152. if (s){
  153. /* make sure that there is always someplace to get input
  154.    before closing zzstream_in
  155. */
  156. #if 0
  157. if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
  158. #endif
  159. zzline = 1;
  160. zzstream_in = NULL;
  161. zzfunc_in = 0;
  162. zzstr_in = s;
  163. zzcharfull = 0;
  164. }
  165. }
  166. void
  167. zzclose_stream()
  168. {
  169. #if 0
  170. fclose( zzstream_in );
  171. zzstream_in = NULL;
  172. zzfunc_in = NULL;
  173. #endif
  174. }
  175. /* saves dlg state, but not what feeds dlg (such as file position) */
  176. void
  177. #ifdef __USE_PROTOS
  178. zzsave_dlg_state(struct zzdlg_state *state)
  179. #else
  180. zzsave_dlg_state(state)
  181. struct zzdlg_state *state;
  182. #endif
  183. {
  184. state->stream = zzstream_in;
  185. state->func_ptr = zzfunc_in;
  186. state->str = zzstr_in;
  187. state->auto_num = zzauto;
  188. state->add_erase = zzadd_erase;
  189. state->lookc = zzchar;
  190. state->char_full = zzcharfull;
  191. state->begcol = zzbegcol;
  192. state->endcol = zzendcol;
  193. state->line = zzline;
  194. state->lextext = zzlextext;
  195. state->begexpr = zzbegexpr;
  196. state->endexpr = zzendexpr;
  197. state->bufsize = zzbufsize;
  198. state->bufovf = zzbufovf;
  199. state->nextpos = zznextpos;
  200. state->class_num = zzclass;
  201. }
  202. void
  203. #ifdef __USE_PROTOS
  204. zzrestore_dlg_state(struct zzdlg_state *state)
  205. #else
  206. zzrestore_dlg_state(state)
  207. struct zzdlg_state *state;
  208. #endif
  209. {
  210. zzstream_in = state->stream;
  211. zzfunc_in = state->func_ptr;
  212. zzstr_in = state->str;
  213. zzauto = state->auto_num;
  214. zzadd_erase = state->add_erase;
  215. zzchar = state->lookc;
  216. zzcharfull = state->char_full;
  217. zzbegcol = state->begcol;
  218. zzendcol = state->endcol;
  219. zzline = state->line;
  220. zzlextext = state->lextext;
  221. zzbegexpr = state->begexpr;
  222. zzendexpr = state->endexpr;
  223. zzbufsize = state->bufsize;
  224. zzbufovf = state->bufovf;
  225. zznextpos = state->nextpos;
  226. zzclass = state->class_num;
  227. }
  228. void
  229. #ifdef __USE_PROTOS
  230. zzmode( int m )
  231. #else
  232. zzmode( m )
  233. int m;
  234. #endif
  235. {
  236. /* points to base of dfa table */
  237. if (m<MAX_MODE){
  238. zzauto = m;
  239. /* have to redo class since using different compression */
  240. zzclass = ZZSHIFT(zzchar);
  241. }else{
  242. sprintf(zzebuf,"Invalid automaton mode = %d ",m);
  243. zzerr(zzebuf);
  244. }
  245. }
  246. /* erase what is currently in the buffer, and get a new reg. expr */
  247. void
  248. zzskip()
  249. {
  250. zzadd_erase = 1;
  251. }
  252. /* don't erase what is in the zzlextext buffer, add on to it */
  253. void
  254. zzmore()
  255. {
  256. zzadd_erase = 2;
  257. }
  258. /* substitute c for the reg. expr last matched and is in the buffer */
  259. #ifdef __USE_PROTOS
  260. void
  261. zzreplchar(zzchar_t c)
  262. #else
  263. void
  264. zzreplchar(c)
  265. zzchar_t c;
  266. #endif
  267. {
  268. /* can't allow overwriting null at end of string */
  269. if (zzbegexpr < &zzlextext[zzbufsize-1]){
  270. *zzbegexpr = c;
  271. *(zzbegexpr+1) = '';
  272. }
  273. zzendexpr = zzbegexpr;
  274. zznextpos = zzbegexpr + 1;
  275. }
  276. /* replace the string s for the reg. expr last matched and in the buffer */
  277. void
  278. #ifdef __USE_PROTOS
  279. zzreplstr(register zzchar_t *s)
  280. #else
  281. zzreplstr(s)
  282. register zzchar_t *s;
  283. #endif
  284. {
  285. register zzchar_t *l= &zzlextext[zzbufsize -1];
  286. zznextpos = zzbegexpr;
  287. if (s){
  288.   while ((zznextpos <= l) && (*(zznextpos++) = *(s++))!=0){
  289. /* empty */
  290. }
  291. /* correct for NULL at end of string */
  292. zznextpos--;
  293. }
  294. if ((zznextpos <= l) && (*(--s) == 0)){
  295. zzbufovf = 0;
  296. }else{
  297. zzbufovf = 1;
  298. }
  299. *(zznextpos) = '';
  300. zzendexpr = zznextpos - 1;
  301. }
  302. void
  303. zzgettok()
  304. {
  305. register int state, newstate;
  306. /* last space reserved for the null char */
  307. register zzchar_t *lastpos;
  308. skip:
  309. zzreal_line = zzline;
  310. zzbufovf = 0;
  311. lastpos = &zzlextext[zzbufsize-1];
  312. zznextpos = zzlextext;
  313. zzbegcol = zzendcol+1;
  314. more:
  315. zzbegexpr = zznextpos;
  316. #ifdef ZZINTERACTIVE
  317. /* interactive version of automaton */
  318. /* if there is something in zzchar, process it */
  319. state = newstate = dfa_base[zzauto];
  320. if (zzcharfull){
  321. ZZINC;
  322. ZZCOPY;
  323. ZZNEWSTATE;
  324. }
  325. if (zzstr_in)
  326. while (zzalternatives[newstate]){
  327. state = newstate;
  328. ZZGETC_STR;
  329. ZZINC;
  330. ZZCOPY;
  331. ZZNEWSTATE;
  332. }
  333. else if (zzstream_in)
  334. while (zzalternatives[newstate]){
  335. state = newstate;
  336. ZZGETC_STREAM;
  337. ZZINC;
  338. ZZCOPY;
  339. ZZNEWSTATE;
  340. }
  341. else if (zzfunc_in)
  342. while (zzalternatives[newstate]){
  343. state = newstate;
  344. ZZGETC_FUNC;
  345. ZZINC;
  346. ZZCOPY;
  347. ZZNEWSTATE;
  348. }
  349. /* figure out if last character really part of token */
  350. if ((state != dfa_base[zzauto]) && (newstate == DfaStates)){
  351. zzcharfull = 1;
  352. --zznextpos;
  353. }else{
  354. zzcharfull = 0;
  355. state = newstate;
  356. }
  357. *(zznextpos) = '';
  358. /* Able to transition out of start state to some non err state?*/
  359. if ( state == dfa_base[zzauto] ){
  360. /* make sure doesn't get stuck */
  361. zzadvance();
  362. }
  363. #else
  364. /* non-interactive version of automaton */
  365. if (!zzcharfull)
  366. zzadvance();
  367. else
  368. ZZINC;
  369. state = dfa_base[zzauto];
  370. if (zzstr_in)
  371. while (ZZNEWSTATE != DfaStates){
  372. state = newstate;
  373. ZZCOPY;
  374. ZZGETC_STR;
  375. ZZINC;
  376. }
  377. else if (zzstream_in)
  378. while (ZZNEWSTATE != DfaStates){
  379. state = newstate;
  380. ZZCOPY;
  381. ZZGETC_STREAM;
  382. ZZINC;
  383. }
  384. else if (zzfunc_in)
  385. while (ZZNEWSTATE != DfaStates){
  386. state = newstate;
  387. ZZCOPY;
  388. ZZGETC_FUNC;
  389. ZZINC;
  390. }
  391. zzcharfull = 1;
  392. if ( state == dfa_base[zzauto] ){
  393. if (zznextpos < lastpos){
  394. *(zznextpos++) = zzchar;
  395. }else{
  396. zzbufovf = 1;
  397. }
  398. *zznextpos = '';
  399. /* make sure doesn't get stuck */
  400. zzadvance();
  401. }else{
  402. *zznextpos = '';
  403. }
  404. #endif
  405. #ifdef ZZCOL
  406. zzendcol -= zzcharfull;
  407. #endif
  408. zzendexpr = zznextpos -1;
  409. zzadd_erase = 0;
  410. (*actions[accepts[state]])();
  411. switch (zzadd_erase) {
  412. case 1: goto skip;
  413. case 2: goto more;
  414. }
  415. }
  416. void
  417. zzadvance()
  418. {
  419. if (zzstream_in) { ZZGETC_STREAM; zzcharfull = 1; ZZINC;}
  420. if (zzfunc_in) { ZZGETC_FUNC; zzcharfull = 1; ZZINC;}
  421. if (zzstr_in) { ZZGETC_STR; zzcharfull = 1; ZZINC;}
  422. if (!(zzstream_in || zzfunc_in || zzstr_in)){
  423. zzerr_in();
  424. }
  425. }
  426. void
  427. #ifdef __USE_PROTOS
  428. zzerrstd(const char *s)
  429. #else
  430. zzerrstd(s)
  431. char *s;
  432. #endif
  433. {
  434.         zzLexErrCount++;                /* MR11 */
  435.         fprintf(stderr,
  436.                 "%s near line %d (text was '%s')n",
  437.                 ((s == NULL) ? "Lexical error" : s),
  438.                 zzline,zzlextext);
  439. }
  440. int
  441. zzerr_in()
  442. {
  443. fprintf(stderr,"No input stream, function, or stringn");
  444. /* return eof to get out gracefully */
  445. return EOF;
  446. }
  447. #endif