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

编译器/解释器

开发平台:

Others

  1. /*
  2.  * err.h
  3.  *
  4.  * Standard error handling mechanism
  5.  *
  6.  * SOFTWARE RIGHTS
  7.  *
  8.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  9.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  10.  * company may do whatever they wish with source code distributed with
  11.  * PCCTS or the code generated by PCCTS, including the incorporation of
  12.  * PCCTS, or its output, into commerical software.
  13.  *
  14.  * We encourage users to develop software with PCCTS.  However, we do ask
  15.  * that credit is given to us for developing PCCTS.  By "credit",
  16.  * we mean that if you incorporate our source code into one of your
  17.  * programs (commercial product, research project, or otherwise) that you
  18.  * acknowledge this fact somewhere in the documentation, research report,
  19.  * etc...  If you like PCCTS and have developed a nice tool with the
  20.  * output, please mention that you developed it using PCCTS.  In
  21.  * addition, we ask that this header remain intact in our source code.
  22.  * As long as these guidelines are kept, we expect to continue enhancing
  23.  * this system and expect to make other tools available as they are
  24.  * completed.
  25.  *
  26.  * Has grown to hold all kinds of stuff (err.h is increasingly misnamed)
  27.  *
  28.  * ANTLR 1.33
  29.  * Terence Parr
  30.  * Parr Research Corporation
  31.  * with Purdue University and AHPCRC, University of Minnesota
  32.  * 1989-1998
  33.  */
  34. #ifndef ERR_H
  35. #define ERR_H
  36. #include "pcctscfg.h"
  37. /*       */
  38. /*  7-Apr-97  133MR1       */
  39. /* Proper choice of STDC and cplusplus pre-processor symbols (?) */
  40. /*       */
  41. #include PCCTS_STRING_H
  42. #ifdef __STDC__
  43. #include <stdarg.h>
  44. #endif
  45. #ifdef __cplusplus
  46. #include PCCTS_STDARG_H
  47. #endif
  48. #ifndef __STDC__
  49. #ifndef __cplusplus
  50. #include <varargs.h>
  51. #endif
  52. #endif
  53. #ifdef DUM
  54. /* Define usable bits per unsigned int word (used for set stuff) */
  55. #ifdef PC
  56. #define BSETWORDSIZE 16
  57. #define BSETLOGWORDSIZE 4
  58. #else
  59. #define BSETWORDSIZE 32
  60. #define BSETLOGWORDSIZE 5
  61. #endif
  62. #endif
  63. #define BSETWORDSIZE 8
  64. #define BSETLOGWORDSIZE 3 /* SetWordType is 8bits */
  65. #define BSETMODWORD(x) ((x) & (BSETWORDSIZE-1)) /* x % BSETWORDSIZE */
  66. #define BSETDIVWORD(x) ((x) >> BSETLOGWORDSIZE) /* x / BSETWORDSIZE */
  67. /* This is not put into the global pccts_parser structure because it is
  68.  * hidden and does not need to be saved during a "save state" operation
  69.  */
  70. /* maximum of 32 bits/unsigned int and must be 8 bits/byte */
  71. static SetWordType bitmask[] = {
  72. 0x00000001, 0x00000002, 0x00000004, 0x00000008,
  73. 0x00000010, 0x00000020, 0x00000040, 0x00000080
  74. };
  75. #ifdef zzTRACE_RULES
  76. int  zzTraceOptionValueDefault=1;
  77. int  zzTraceOptionValue=1;
  78. int  zzTraceGuessOptionValue=1;
  79. char *zzTraceCurrentRuleName=NULL;
  80. int  zzTraceDepth=0;
  81. #endif
  82. int  zzGuessSeq=0;          /* MR10 */
  83. int  zzSyntaxErrCount=0;    /* MR11 */
  84. int  zzLexErrCount=0;       /* MR11 */
  85. void
  86. #ifdef __USE_PROTOS
  87. zzresynch(SetWordType *wd,SetWordType mask)
  88. #else
  89. zzresynch(wd,mask)
  90. SetWordType *wd, mask;
  91. #endif
  92. {
  93. static int consumed = 1;
  94. /* if you enter here without having consumed a token from last resynch
  95.  * force a token consumption.
  96.  */
  97. if ( !consumed ) {zzCONSUME; consumed=1; return;}   /* MR10 */
  98. /* if current token is in resynch set, we've got what we wanted */
  99. if ( wd[LA(1)]&mask || LA(1) == zzEOF_TOKEN ) {consumed=0; return;}
  100. /* scan until we find something in the resynch set */
  101. while ( !(wd[LA(1)]&mask) && LA(1) != zzEOF_TOKEN ) {zzCONSUME;}
  102. consumed=1;
  103. }
  104. /*                                                                          */
  105. /*  7-Apr-97 133MR1 for C++ and MR7 for C                                   */
  106. /*         Change suggested by Eli Sternheim (eli@interhdl.com)           */
  107. /*                                                                          */
  108. void
  109. #ifdef __USE_PROTOS
  110. zzconsumeUntil(SetWordType *st)
  111. #else
  112. zzconsumeUntil(st)
  113. SetWordType *st;
  114. #endif
  115. {
  116.     int     tmp;                                                     /* MR7 */
  117. while ( !zzset_el( (tmp=LA(1)), st) && tmp!=1 /* Eof */) {       /* MR7 */
  118.                                                       zzCONSUME; }   /* MR7 */
  119. }
  120. /*                                                                          */
  121. /*  7-Apr-97 133MR1 for C++ and MR7 for C                                   */
  122. /*         Change suggested by Eli Sternheim (eli@interhdl.com)           */
  123. /*                                                                          */
  124. void
  125. #ifdef __USE_PROTOS
  126. zzconsumeUntilToken(int t)
  127. #else
  128. zzconsumeUntilToken(t)
  129. int t;
  130. #endif
  131. {
  132.     int     tmp;                                                     /* MR7 */
  133. while ( (tmp=LA(1)) !=t && tmp!=1 /* Eof */) { zzCONSUME; }      /* MR7 */
  134. }
  135. /* input looks like:
  136.  * zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText)
  137.  * where the zzMiss stuff is set here to the token that did not match
  138.  * (and which set wasn't it a member of).
  139.  */
  140. void
  141. #ifdef __USE_PROTOS
  142. zzFAIL(int k, ...)
  143. #else
  144. zzFAIL(va_alist)
  145. va_dcl
  146. #endif
  147. {
  148. #ifdef LL_K
  149. static char text[LL_K*ZZLEXBUFSIZE+1];
  150. SetWordType *f[LL_K];
  151. #else
  152. static char text[ZZLEXBUFSIZE+1];
  153. SetWordType *f[1];
  154. #endif
  155. SetWordType **miss_set;
  156. char **miss_text;
  157. int *bad_tok;
  158. char **bad_text;
  159. int *err_k;
  160. int i;
  161. va_list ap;
  162. #ifndef __USE_PROTOS
  163. int k;
  164. #endif
  165. #ifdef __USE_PROTOS
  166. va_start(ap, k);
  167. #else
  168. va_start(ap);
  169. k = va_arg(ap, int); /* how many lookahead sets? */
  170. #endif
  171. text[0] = '';
  172. for (i=1; i<=k; i++) /* collect all lookahead sets */
  173. {
  174. f[i-1] = va_arg(ap, SetWordType *);
  175. }
  176. for (i=1; i<=k; i++) /* look for offending token */
  177. {
  178. if ( i>1 ) strcat(text, " ");
  179. strcat(text, LATEXT(i));
  180. if ( !zzset_el((unsigned)LA(i), f[i-1]) ) break;
  181. }
  182. miss_set = va_arg(ap, SetWordType **);
  183. miss_text = va_arg(ap, char **);
  184. bad_tok = va_arg(ap, int *);
  185. bad_text = va_arg(ap, char **);
  186. err_k = va_arg(ap, int *);
  187. if ( i>k )
  188. {
  189. /* bad; lookahead is permutation that cannot be matched,
  190.  * but, the ith token of lookahead is valid at the ith position
  191.  * (The old LL sub 1 (k) versus LL(k) parsing technique)
  192.  */
  193. *miss_set = NULL;
  194. *miss_text = zzlextext;
  195. *bad_tok = LA(1);
  196. *bad_text = LATEXT(1);
  197. *err_k = k;
  198. return;
  199. }
  200. /* fprintf(stderr, "%s not in %dth setn", zztokens[LA(i)], i);*/
  201. *miss_set = f[i-1];
  202. *miss_text = text;
  203. *bad_tok = LA(i);
  204. *bad_text = LATEXT(i);
  205. if ( i==1 ) *err_k = 1;
  206. else *err_k = k;
  207. }
  208. #ifdef __USE_PROTOS
  209. void zzTraceGuessDone(zzantlr_state *state)
  210. #else
  211. void zzTraceGuessDone(state)
  212.   zzantlr_state     *state;
  213. #endif
  214. {
  215. #ifdef zzTRACE_RULES
  216. #ifdef ZZCAN_GUESS
  217.   int   doIt=0;
  218.   if (zzTraceCurrentRuleName == NULL) return;
  219.   if (zzTraceOptionValue <= 0) {
  220.     doIt=0;
  221.   } else if (zzTraceGuessOptionValue <= 0) {
  222.     doIt=0;
  223.   } else {
  224.     doIt=1;
  225.   };
  226.   if (doIt) {
  227.     fprintf(stderr,"guess done - returning to rule %s {"%s"} at depth %d",
  228.         state->traceCurrentRuleName,
  229.         LATEXT(1),
  230.         state->traceDepth);
  231.     if (state->guessing != 0) {
  232.       fprintf(stderr," (guess mode continues - an enclosing guess is still active)");
  233.     } else {
  234.       fprintf(stderr," (guess mode ends)");
  235.     };
  236.     fprintf(stderr,"n");
  237.   };
  238. #endif
  239. #endif
  240. }
  241. void
  242. #ifdef __USE_PROTOS
  243. zzsave_antlr_state(zzantlr_state *buf)
  244. #else
  245. zzsave_antlr_state(buf)
  246. zzantlr_state *buf;
  247. #endif
  248. {
  249. #ifdef LL_K
  250. int     i;
  251. #endif
  252. #ifdef ZZCAN_GUESS
  253. buf->guess_start = zzguess_start;
  254. buf->guessing = zzguessing;
  255. #endif
  256. buf->asp = zzasp;
  257. #ifdef GENAST
  258. buf->ast_sp = zzast_sp;
  259. #endif
  260. #ifdef ZZINF_LOOK
  261. buf->inf_labase = zzinf_labase;
  262. buf->inf_last = zzinf_last;
  263. /* MR6  Gunnar Rxnning (gunnar@candleweb.no)                                */
  264. /* MR6   Additional state needs to be saved/restored                       */
  265.    buf->inf_tokens = zzinf_tokens;                                  /* MR6 */
  266. buf->inf_text = zzinf_text;                                      /* MR6 */
  267. buf->inf_text_buffer = zzinf_text_buffer;                        /* MR6 */
  268. buf->inf_line = zzinf_line;                              /* MR6 */
  269. #endif
  270. #ifdef DEMAND_LOOK
  271. buf->dirty = zzdirty;
  272. #endif
  273. #ifdef LL_K
  274. for (i=0; i<LL_K; i++) buf->tokenLA[i] = zztokenLA[i];
  275. for (i=0; i<LL_K; i++) strcpy(buf->textLA[i], zztextLA[i]);
  276. buf->lap = zzlap;
  277. buf->labase = zzlabase;
  278. #else
  279. buf->token = zztoken;
  280. strcpy(buf->text, zzlextext);
  281. #endif
  282. #ifdef zzTRACE_RULES
  283.     /* MR10 */
  284.     buf->traceOptionValue=zzTraceOptionValue;
  285.     buf->traceGuessOptionValue=zzTraceGuessOptionValue;
  286.     buf->traceCurrentRuleName=zzTraceCurrentRuleName;
  287.     buf->traceDepth=zzTraceDepth;
  288. #endif
  289. }
  290. void
  291. #ifdef __USE_PROTOS
  292. zzrestore_antlr_state(zzantlr_state *buf)
  293. #else
  294. zzrestore_antlr_state(buf)
  295. zzantlr_state *buf;
  296. #endif
  297. {
  298. #ifdef zzTRACE_RULES
  299.     int     prevTraceOptionValue;
  300. #endif
  301. #ifdef LL_K
  302. int     i;
  303. #endif
  304. #ifdef ZZCAN_GUESS
  305. zzguess_start = buf->guess_start;
  306. zzguessing = buf->guessing;
  307. #endif
  308. zzasp = buf->asp;
  309. #ifdef GENAST
  310. zzast_sp = buf->ast_sp;
  311. #endif
  312. #ifdef ZZINF_LOOK
  313. zzinf_labase = buf->inf_labase;
  314. zzinf_last = buf->inf_last;
  315. /* MR6  Gunnar Rxnning (gunnar@candleweb.no)                                */
  316. /* MR6   Additional state needs to be saved/restored                       */
  317. zzinf_tokens = buf->inf_tokens;                                  /* MR6 */
  318. zzinf_text = buf->inf_text;                                      /* MR6 */
  319. zzinf_text_buffer = buf->inf_text_buffer;                        /* MR6 */
  320. zzinf_line = buf->inf_line;                              /* MR6 */
  321. #endif
  322. #ifdef DEMAND_LOOK
  323. zzdirty = buf->dirty;
  324. #endif
  325. #ifdef LL_K
  326. for (i=0; i<LL_K; i++) zztokenLA[i] = buf->tokenLA[i];
  327. for (i=0; i<LL_K; i++) strcpy(zztextLA[i], buf->textLA[i]);
  328. zzlap = buf->lap;
  329. zzlabase = buf->labase;
  330. #else
  331. zztoken = buf->token;
  332. strcpy(zzlextext, buf->text);
  333. #endif
  334. #ifdef zzTRACE_RULES
  335.     prevTraceOptionValue=zzTraceOptionValue;
  336.     zzTraceOptionValue=buf->traceOptionValue;
  337.     if ( (prevTraceOptionValue > 0) !=
  338.              (zzTraceOptionValue > 0)) {
  339.       if (zzTraceOptionValue > 0) {
  340.         fprintf(stderr,"trace enable restored in rule %s depth %dn",
  341.                         zzTraceCurrentRuleName,zzTraceDepth);
  342.       };
  343.       if (zzTraceOptionValue <= 0) {
  344.         fprintf(stderr,"trace disable restored in rule %s depth %dn",
  345.                         zzTraceCurrentRuleName,zzTraceDepth);
  346.       };
  347.     };
  348.     zzTraceOptionValue=buf->traceOptionValue;            /* MR10 */
  349.     zzTraceGuessOptionValue=buf->traceGuessOptionValue;  /* MR10 */
  350.     zzTraceCurrentRuleName=buf->traceCurrentRuleName;    /* MR10 */
  351.     zzTraceDepth=buf->traceDepth;                        /* MR10 */
  352.     zzTraceGuessDone(buf);                               /* MR10 */
  353. #endif
  354. }
  355. void
  356. #ifdef __USE_PROTOS
  357. zzedecode(SetWordType *a)
  358. #else
  359. zzedecode(a)
  360. SetWordType *a;
  361. #endif
  362. {
  363. register SetWordType *p = a;
  364. register SetWordType *endp = &(p[zzSET_SIZE]);
  365. register unsigned e = 0;
  366. if ( zzset_deg(a)>1 ) fprintf(stderr, " {");
  367. do {
  368. register SetWordType t = *p;
  369. register SetWordType *b = &(bitmask[0]);
  370. do {
  371. if ( t & *b ) fprintf(stderr, " %s", zztokens[e]);
  372. e++;
  373. } while (++b < &(bitmask[sizeof(SetWordType)*8]));
  374. } while (++p < endp);
  375. if ( zzset_deg(a)>1 ) fprintf(stderr, " }");
  376. }
  377. #ifndef USER_ZZSYN
  378. /* standard error reporting function */
  379. void
  380. #ifdef __USE_PROTOS
  381. zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text)
  382. #else
  383. zzsyn(text, tok, egroup, eset, etok, k, bad_text)
  384. char *text, *egroup, *bad_text;
  385. int tok;
  386. int etok;
  387. int k;
  388. SetWordType *eset;
  389. #endif
  390. {
  391.     zzSyntaxErrCount++;                             /* MR11 */
  392. fprintf(stderr, "line %d: syntax error at "%s"", zzline, (tok==zzEOF_TOKEN)?"EOF":bad_text);
  393. if ( !etok && !eset ) {fprintf(stderr, "n"); return;}
  394. if ( k==1 ) fprintf(stderr, " missing");
  395. else
  396. {
  397. fprintf(stderr, "; "%s" not", bad_text);
  398. if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");
  399. }
  400. if ( zzset_deg(eset)>0 ) zzedecode(eset);
  401. else fprintf(stderr, " %s", zztokens[etok]);
  402. if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);
  403. fprintf(stderr, "n");
  404. }
  405. #endif
  406. /* is b an element of set p? */
  407. int
  408. #ifdef __USE_PROTOS
  409. zzset_el(unsigned b, SetWordType *p)
  410. #else
  411. zzset_el(b,p)
  412. unsigned b;
  413. SetWordType *p;
  414. #endif
  415. {
  416. return( p[BSETDIVWORD(b)] & bitmask[BSETMODWORD(b)] );
  417. }
  418. int
  419. #ifdef __USE_PROTOS
  420. zzset_deg(SetWordType *a)
  421. #else
  422. zzset_deg(a)
  423. SetWordType *a;
  424. #endif
  425. {
  426. /* Fast compute degree of a set... the number
  427.    of elements present in the set.  Assumes
  428.    that all word bits are used in the set
  429. */
  430. register SetWordType *p = a;
  431. register SetWordType *endp = &(a[zzSET_SIZE]);
  432. register int degree = 0;
  433. if ( a == NULL ) return 0;
  434. while ( p < endp )
  435. {
  436. register SetWordType t = *p;
  437. register SetWordType *b = &(bitmask[0]);
  438. do {
  439. if (t & *b) ++degree;
  440. } while (++b < &(bitmask[sizeof(SetWordType)*8]));
  441. p++;
  442. }
  443. return(degree);
  444. }
  445. #ifdef DEMAND_LOOK
  446. #ifdef LL_K
  447. int
  448. #ifdef __USE_PROTOS
  449. _zzmatch(int _t, char **zzBadText, char **zzMissText,
  450. int *zzMissTok, int *zzBadTok,
  451. SetWordType **zzMissSet)
  452. #else
  453. _zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
  454. int _t;
  455. char **zzBadText;
  456. char **zzMissText;
  457. int *zzMissTok, *zzBadTok;
  458. SetWordType **zzMissSet;
  459. #endif
  460. {
  461. if ( zzdirty==LL_K ) {
  462. zzCONSUME;
  463. }
  464. if ( LA(1)!=_t ) {
  465. *zzBadText = *zzMissText=LATEXT(1);
  466. *zzMissTok= _t; *zzBadTok=LA(1);
  467. *zzMissSet=NULL;
  468. return 0;
  469. }
  470. zzMakeAttr
  471. zzdirty++;
  472. zzlabase++;
  473. return 1;
  474. }
  475. int
  476. #ifdef __USE_PROTOS
  477. _zzmatch_wsig(int _t)
  478. #else
  479. _zzmatch_wsig(_t)
  480. int _t;
  481. #endif
  482. {
  483. if ( zzdirty==LL_K ) {
  484. zzCONSUME;
  485. }
  486. if ( LA(1)!=_t ) {
  487. return 0;
  488. }
  489. zzMakeAttr
  490. zzdirty++;
  491. zzlabase++;
  492. return 1;
  493. }
  494. #else
  495. int
  496. #ifdef __USE_PROTOS
  497. _zzmatch(int _t, char **zzBadText, char **zzMissText,
  498.  int *zzMissTok, int *zzBadTok, SetWordType **zzMissSet)
  499. #else
  500. _zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
  501. int _t;
  502. char **zzBadText;
  503. char **zzMissText;
  504. int *zzMissTok, *zzBadTok;
  505. SetWordType **zzMissSet;
  506. #endif
  507. {
  508. if ( zzdirty ) {zzCONSUME;}
  509. if ( LA(1)!=_t ) {
  510. *zzBadText = *zzMissText=LATEXT(1);
  511. *zzMissTok= _t; *zzBadTok=LA(1);
  512. *zzMissSet=NULL;
  513. return 0;
  514. }
  515. zzdirty = 1;
  516. zzMakeAttr
  517. return 1;
  518. }
  519. int
  520. #ifdef __USE_PROTOS
  521. _zzmatch_wsig(int _t)
  522. #else
  523. _zzmatch_wsig(_t)
  524. int _t;
  525. #endif
  526. {
  527. if ( zzdirty ) {zzCONSUME;}
  528. if ( LA(1)!=_t ) {
  529. return 0;
  530. }
  531. zzdirty = 1;
  532. zzMakeAttr
  533. return 1;
  534. }
  535. #endif /*LL_K*/
  536. #else
  537. int
  538. #ifdef __USE_PROTOS
  539. _zzmatch(int _t, char **zzBadText, char **zzMissText,
  540. int *zzMissTok, int *zzBadTok,
  541. SetWordType **zzMissSet)
  542. #else
  543. _zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
  544. int _t;
  545. char **zzBadText;
  546. char **zzMissText;
  547. int *zzMissTok, *zzBadTok;
  548. SetWordType **zzMissSet;
  549. #endif
  550. {
  551. if ( LA(1)!=_t ) {
  552. *zzBadText = *zzMissText=LATEXT(1);
  553. *zzMissTok= _t; *zzBadTok=LA(1);
  554. *zzMissSet=NULL;
  555. return 0;
  556. }
  557. zzMakeAttr
  558. return 1;
  559. }
  560. int
  561. #ifdef __USE_PROTOS
  562. _zzmatch_wsig(int _t)
  563. #else
  564. _zzmatch_wsig(_t)
  565. int _t;
  566. #endif
  567. {
  568. if ( LA(1)!=_t ) return 0;
  569. zzMakeAttr
  570. return 1;
  571. }
  572. #endif /*DEMAND_LOOK*/
  573. #ifdef ZZINF_LOOK
  574. void
  575. #ifdef __USE_PROTOS
  576. _inf_zzgettok(void)
  577. #else
  578. _inf_zzgettok()
  579. #endif
  580. {
  581. if ( zzinf_labase >= zzinf_last )
  582. {NLA = zzEOF_TOKEN; strcpy(NLATEXT, "");}
  583. else {
  584. NLA = zzinf_tokens[zzinf_labase];
  585. zzline = zzinf_line[zzinf_labase]; /* wrong in 1.21 */
  586. strcpy(NLATEXT, zzinf_text[zzinf_labase]);
  587. zzinf_labase++; 
  588. }
  589. }
  590. #endif
  591. #ifdef ZZINF_LOOK
  592. /* allocate default size text,token and line arrays;
  593.  * then, read all of the input reallocing the arrays as needed.
  594.  * Once the number of total tokens is known, the LATEXT(i) array (zzinf_text)
  595.  * is allocated and it's pointers are set to the tokens in zzinf_text_buffer.
  596.  */
  597. void
  598. #ifdef __USE_PROTOS
  599. zzfill_inf_look(void)
  600. #else
  601. zzfill_inf_look()
  602. #endif
  603. {
  604. int tok, line;
  605. int zzinf_token_buffer_size = ZZINF_DEF_TOKEN_BUFFER_SIZE;
  606. int zzinf_text_buffer_size = ZZINF_DEF_TEXT_BUFFER_SIZE;
  607. int zzinf_text_buffer_index = 0;
  608. int zzinf_lap = 0;
  609. /* allocate text/token buffers */
  610. zzinf_text_buffer = (char *) malloc(zzinf_text_buffer_size);
  611. if ( zzinf_text_buffer == NULL )
  612. {
  613. fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)n",
  614. zzinf_text_buffer_size);
  615. exit(PCCTS_EXIT_FAILURE);
  616. }
  617. zzinf_tokens = (int *) calloc(zzinf_token_buffer_size,sizeof(int));
  618. if ( zzinf_tokens == NULL )
  619. {
  620. fprintf(stderr, "cannot allocate token buffer (%d tokens)n",
  621. zzinf_token_buffer_size);
  622. exit(PCCTS_EXIT_FAILURE);
  623. }
  624.     zzinf_line = (int *) calloc(zzinf_token_buffer_size,sizeof(int));
  625.     if ( zzinf_line == NULL )
  626.     {
  627.         fprintf(stderr, "cannot allocate line buffer (%d ints)n",
  628.                 zzinf_token_buffer_size);
  629.         exit(PCCTS_EXIT_FAILURE);
  630. }
  631. /* get tokens, copying text to text buffer */
  632. zzinf_text_buffer_index = 0;
  633. do {
  634. zzgettok();
  635. line = zzreal_line;
  636. while ( zzinf_lap>=zzinf_token_buffer_size )
  637. {
  638. zzinf_token_buffer_size += ZZINF_BUFFER_TOKEN_CHUNK_SIZE;
  639. zzinf_tokens = (int *) realloc(zzinf_tokens,
  640.  zzinf_token_buffer_size*sizeof(int));
  641. if ( zzinf_tokens == NULL )
  642. {
  643. fprintf(stderr, "cannot allocate lookahead token buffer (%d tokens)n",
  644. zzinf_token_buffer_size);
  645. exit(PCCTS_EXIT_FAILURE);
  646. }
  647.             zzinf_line = (int *) realloc(zzinf_line,
  648.                                          zzinf_token_buffer_size*sizeof(int));
  649.             if ( zzinf_line == NULL )
  650.             {
  651.                 fprintf(stderr, "cannot allocate lookahead line buffer (%d ints)n",
  652.                         zzinf_token_buffer_size);
  653.                 exit(PCCTS_EXIT_FAILURE);
  654. }
  655. }
  656. while ( (zzinf_text_buffer_index+strlen(NLATEXT)+1) >= zzinf_text_buffer_size )
  657. {
  658. zzinf_text_buffer_size += ZZINF_BUFFER_TEXT_CHUNK_SIZE;
  659. zzinf_text_buffer = (char *) realloc(zzinf_text_buffer,
  660.  zzinf_text_buffer_size);
  661. if ( zzinf_text_buffer == NULL )
  662. {
  663. fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)n",
  664. zzinf_text_buffer_size);
  665. exit(PCCTS_EXIT_FAILURE);
  666. }
  667. }
  668. /* record token and text and line of input symbol */
  669. tok = zzinf_tokens[zzinf_lap] = NLA;
  670. strcpy(&zzinf_text_buffer[zzinf_text_buffer_index], NLATEXT);
  671. zzinf_text_buffer_index += strlen(NLATEXT)+1;
  672.         zzinf_line[zzinf_lap] = line;
  673. zzinf_lap++;
  674. } while (tok!=zzEOF_TOKEN);
  675. zzinf_labase = 0;
  676. zzinf_last = zzinf_lap-1;
  677. /* allocate ptrs to text of ith token */
  678. zzinf_text = (char **) calloc(zzinf_last+1,sizeof(char *));
  679. if ( zzinf_text == NULL )
  680. {
  681. fprintf(stderr, "cannot allocate lookahead text buffer (%d)n",
  682. zzinf_text_buffer_size);
  683. exit(PCCTS_EXIT_FAILURE);
  684. }
  685. zzinf_text_buffer_index = 0;
  686. zzinf_lap = 0;
  687. /* set ptrs so that zzinf_text[i] is the text of the ith token found on input */
  688. while (zzinf_lap<=zzinf_last)
  689. {
  690.     zzinf_text[zzinf_lap++] = &zzinf_text_buffer[zzinf_text_buffer_index];
  691. zzinf_text_buffer_index += strlen(&zzinf_text_buffer[zzinf_text_buffer_index])+1;
  692. }
  693. }
  694. #endif
  695. int
  696. #ifdef __USE_PROTOS
  697. _zzsetmatch(SetWordType *e, char **zzBadText, char **zzMissText,
  698. int *zzMissTok, int *zzBadTok,
  699. SetWordType **zzMissSet)
  700. #else
  701. _zzsetmatch(e, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
  702. SetWordType *e;
  703. char **zzBadText;
  704. char **zzMissText;
  705. int *zzMissTok, *zzBadTok;
  706. SetWordType **zzMissSet;
  707. #endif
  708. {
  709. #ifdef DEMAND_LOOK
  710. #ifdef LL_K
  711. if ( zzdirty==LL_K ) {zzCONSUME;}
  712. #else
  713. if ( zzdirty ) {zzCONSUME;}
  714. #endif
  715. #endif
  716. if ( !zzset_el((unsigned)LA(1), e) ) {
  717. *zzBadText = LATEXT(1); *zzMissText=NULL;
  718. *zzMissTok= 0; *zzBadTok=LA(1);
  719. *zzMissSet=e;
  720. return 0;
  721. }
  722. zzMakeAttr           /* MR14 Ger Hobbelt (hobbelt@axa.nl) */
  723. #ifdef DEMAND_LOOK
  724. #ifdef LL_K
  725. zzdirty++;
  726.     zzlabase++;          /* MR14 Ger Hobbelt (hobbelt@axa.nl) */
  727. #else
  728. zzdirty = 1;
  729. #endif
  730. #endif
  731. return 1;
  732. }
  733. int
  734. #ifdef __USE_PROTOS
  735. _zzmatch_wdfltsig(int tokenWanted, SetWordType *whatFollows)
  736. #else
  737. _zzmatch_wdfltsig(tokenWanted, whatFollows)
  738. int tokenWanted;
  739. SetWordType *whatFollows;
  740. #endif
  741. {
  742. #ifdef DEMAND_LOOK
  743. #ifdef LL_K
  744. if ( zzdirty==LL_K ) {
  745. zzCONSUME;
  746. }
  747. #else
  748. if ( zzdirty ) {zzCONSUME;}
  749. #endif
  750. #endif
  751. if ( LA(1)!=tokenWanted )
  752. {
  753.         zzSyntaxErrCount++;     /* MR11 */
  754. fprintf(stderr,
  755. "line %d: syntax error at "%s" missing %sn",
  756. zzline,
  757. (LA(1)==zzEOF_TOKEN)?"<eof>":LATEXT(1),
  758. zztokens[tokenWanted]);
  759. zzconsumeUntil( whatFollows );
  760. return 0;
  761. }
  762. else {
  763. zzMakeAttr
  764. #ifdef DEMAND_LOOK
  765. #ifdef LL_K
  766. zzdirty++;
  767. zzlabase++;
  768. #else
  769. zzdirty = 1;
  770. #endif
  771. #else
  772. /* zzCONSUME;  consume if not demand lookahead */
  773. #endif
  774. return 1;
  775. }
  776. }
  777. int
  778. #ifdef __USE_PROTOS
  779. _zzsetmatch_wdfltsig(SetWordType *tokensWanted,
  780.  int tokenTypeOfSet,
  781.  SetWordType *whatFollows)
  782. #else
  783. _zzsetmatch_wdfltsig(tokensWanted, tokenTypeOfSet, whatFollows)
  784. SetWordType *tokensWanted;
  785. int tokenTypeOfSet;
  786. SetWordType *whatFollows;
  787. #endif
  788. {
  789. #ifdef DEMAND_LOOK
  790. #ifdef LL_K
  791. if ( zzdirty==LL_K ) {zzCONSUME;}
  792. #else
  793. if ( zzdirty ) {zzCONSUME;}
  794. #endif
  795. #endif
  796. if ( !zzset_el((unsigned)LA(1), tokensWanted) )
  797. {
  798.         zzSyntaxErrCount++;     /* MR11 */
  799. fprintf(stderr,
  800. "line %d: syntax error at "%s" missing %sn",
  801. zzline,
  802. (LA(1)==zzEOF_TOKEN)?"<eof>":LATEXT(1),
  803. zztokens[tokenTypeOfSet]);
  804. zzconsumeUntil( whatFollows );
  805. return 0;
  806. }
  807. else {
  808. zzMakeAttr
  809. #ifdef DEMAND_LOOK
  810. #ifdef LL_K
  811. zzdirty++;
  812. zzlabase++;
  813. #else
  814. zzdirty = 1;
  815. #endif
  816. #else
  817. /* zzCONSUME; consume if not demand lookahead */
  818. #endif
  819. return 1;
  820. }
  821. }
  822. int
  823. #ifdef __USE_PROTOS
  824. _zzsetmatch_wsig(SetWordType *e)
  825. #else
  826. _zzsetmatch_wsig(e)
  827. SetWordType *e;
  828. #endif
  829. {
  830. #ifdef DEMAND_LOOK
  831. #ifdef LL_K
  832. if ( zzdirty==LL_K ) {zzCONSUME;}
  833. #else
  834. if ( zzdirty ) {zzCONSUME;}
  835. #endif
  836. #endif
  837. if ( !zzset_el((unsigned)LA(1), e) ) return 0;
  838. zzMakeAttr           /* MR14 Ger Hobbelt (hobbelt@axa.nl) */
  839. #ifdef DEMAND_LOOK
  840. #ifdef LL_K
  841. zzdirty++;
  842.     zzlabase++;          /* MR14 Ger Hobbelt (hobbelt@axa.nl) */
  843. #else
  844. zzdirty = 1;
  845. #endif
  846. #endif
  847. return 1;
  848. }
  849. #ifdef USER_ZZMODE_STACK
  850. static int  zzmstk[ZZMAXSTK] = { -1 };
  851. static int  zzmdep = 0;
  852. static char zzmbuf[70];
  853. void
  854. #ifdef __USE_PROTOS
  855. zzmpush( int m )
  856. #else
  857. zzmpush( m )
  858. int m;
  859. #endif
  860. {
  861.    if(zzmdep == ZZMAXSTK - 1) {
  862.      sprintf(zzmbuf, "Mode stack overflow ");
  863.      zzerr(zzmbuf);
  864.    } else {
  865.      zzmstk[zzmdep++] = zzauto;
  866.      zzmode(m);
  867.    }
  868. }
  869. void
  870. #ifdef __USE_PROTOS
  871. zzmpop( void )
  872. #else
  873. zzmpop( )
  874. #endif
  875. {
  876.    if(zzmdep == 0)
  877.    {  sprintf(zzmbuf, "Mode stack underflow ");
  878.       zzerr(zzmbuf);
  879.    }
  880.    else
  881.    {  zzmdep--;
  882.       zzmode(zzmstk[zzmdep]);
  883.    }
  884. }
  885. void
  886. #ifdef __USE_PROTOS
  887. zzsave_mode_stack( int modeStack[], int *modeLevel )
  888. #else
  889. zzsave_mode_stack( modeStack, modeLevel )
  890. int modeStack[];
  891. int *modeLevel;
  892. #endif
  893. {
  894.   int i;
  895.   memcpy(modeStack, zzmstk, sizeof(zzmstk));
  896.   *modeLevel = zzmdep;
  897.   zzmdep = 0;
  898.   return;
  899. }
  900. void
  901. #ifdef __USE_PROTOS
  902. zzrestore_mode_stack( int modeStack[], int *modeLevel )
  903. #else
  904. zzrestore_mode_stack( modeStack, modeLevel )
  905. int modeStack[];
  906. int *modeLevel;
  907. #endif
  908. {
  909.   int i;
  910.   memcpy(zzmstk, modeStack, sizeof(zzmstk));
  911.   zzmdep = *modeLevel;
  912.   return;
  913. }
  914. #endif /* USER_ZZMODE_STACK */
  915. void zzTraceReset() {
  916. #ifdef zzTRACE_RULES
  917.   zzTraceOptionValue=zzTraceOptionValueDefault;
  918.   zzTraceGuessOptionValue=1;
  919.   zzTraceCurrentRuleName=NULL;
  920.   zzTraceDepth=0;
  921. #endif
  922. }
  923. void zzTraceGuessFail() {
  924. #ifdef zzTRACE_RULES
  925. #ifdef ZZCAN_GUESS
  926.   int   doIt=0;
  927.   if (zzTraceOptionValue <= 0) {
  928.     doIt=0;
  929.   } else if (zzguessing && zzTraceGuessOptionValue <= 0) {
  930.     doIt=0;
  931.   } else {
  932.     doIt=1;
  933.   };
  934.   if (doIt) {
  935.     fprintf(stderr,"guess failedn");
  936.   };
  937. #endif
  938. #endif
  939. }
  940. /* zzTraceOption:
  941.      zero value turns off trace
  942. */
  943. #ifdef __USE_PROTOS
  944. void zzTraceIn(char * rule)
  945. #else
  946. void zzTraceIn(rule)
  947.   char  *rule;
  948. #endif
  949. {
  950. #ifdef zzTRACE_RULES
  951.   int           doIt=0;
  952.   zzTraceDepth++;
  953.   zzTraceCurrentRuleName=rule;
  954.   if (zzTraceOptionValue <= 0) {
  955.     doIt=0;
  956. #ifdef ZZCAN_GUESS
  957.   } else if (zzguessing && zzTraceGuessOptionValue <= 0) {
  958.     doIt=0;
  959. #endif
  960.   } else {
  961.     doIt=1;
  962.   };
  963.   if (doIt) {
  964.     fprintf(stderr,"enter rule %s {"%s"} depth %d",
  965.             rule,
  966.             LA(1)==1 ? "@" : LATEXT(1),
  967.             zzTraceDepth);
  968. #ifdef ZZCAN_GUESS
  969.     if (zzguessing) fprintf(stderr," guessing");
  970. #endif
  971.     fprintf(stderr,"n");
  972.   };
  973. #endif
  974.   return;
  975. }
  976. #ifdef __USE_PROTOS
  977. void zzTraceOut(char * rule)
  978. #else
  979. void zzTraceOut(rule)
  980.   char  *rule;
  981. #endif
  982. {
  983. #ifdef zzTRACE_RULES
  984.   int       doIt=0;
  985.   zzTraceDepth--;
  986.   if (zzTraceOptionValue <= 0) {
  987.     doIt=0;
  988. #ifdef ZZCAN_GUESS
  989.   } else if (zzguessing && zzTraceGuessOptionValue <= 0) {
  990.     doIt=0;
  991. #endif
  992.   } else {
  993.     doIt=1;
  994.   };
  995.   if (doIt) {
  996.     fprintf(stderr,"exit rule %s {"%s"} depth %d",
  997.             rule,
  998.             LA(1)==1 ? "@" : LATEXT(1),
  999.             zzTraceDepth+1);
  1000. #ifdef ZZCAN_GUESS
  1001.     if (zzguessing) fprintf(stderr," guessing");
  1002. #endif
  1003.     fprintf(stderr,"n");
  1004.   };
  1005. #endif
  1006. }
  1007. #ifdef __USE_PROTOS
  1008. int zzTraceOption(int delta)
  1009. #else
  1010. int zzTraceOption(delta)
  1011.   int   delta;
  1012. #endif
  1013. {
  1014. #ifdef zzTRACE_RULES
  1015.     int     prevValue=zzTraceOptionValue;
  1016.     zzTraceOptionValue=zzTraceOptionValue+delta;
  1017.     if (zzTraceCurrentRuleName != NULL) {
  1018.       if (prevValue <= 0 && zzTraceOptionValue > 0) {
  1019.         fprintf(stderr,"trace enabled in rule %s depth %dn",
  1020.                                             zzTraceCurrentRuleName,zzTraceDepth);
  1021.       };
  1022.       if (prevValue > 0 && zzTraceOptionValue <= 0) {
  1023.         fprintf(stderr,"trace disabled in rule %s depth %dn",
  1024.                                             zzTraceCurrentRuleName,zzTraceDepth);
  1025.       };
  1026.     };
  1027.     return  prevValue;
  1028. #else
  1029.     return 0;
  1030. #endif
  1031. }
  1032. #ifdef __USE_PROTOS
  1033. int zzTraceGuessOption(int delta)
  1034. #else
  1035. int zzTraceGuessOption(delta)
  1036.   int   delta;
  1037. #endif
  1038. {
  1039. #ifdef zzTRACE_RULES
  1040. #ifdef ZZCAN_GUESS
  1041.     int     prevValue=zzTraceGuessOptionValue;
  1042.     zzTraceGuessOptionValue=zzTraceGuessOptionValue+delta;
  1043.     if (zzTraceCurrentRuleName != NULL) {
  1044.       if (prevValue <= 0 && zzTraceGuessOptionValue > 0) {
  1045.         fprintf(stderr,"guess trace enabled in rule %s depth %dn",
  1046.                                                 zzTraceCurrentRuleName,zzTraceDepth);
  1047.       };
  1048.       if (prevValue > 0 && zzTraceGuessOptionValue <= 0) {
  1049.         fprintf(stderr,"guess trace disabled in rule %s depth %dn",
  1050.                                                 zzTraceCurrentRuleName,zzTraceDepth);
  1051.       };
  1052.     };
  1053.     return prevValue;
  1054. #else
  1055.     return 0;
  1056. #endif
  1057. #else
  1058.     return 0;
  1059. #endif
  1060. }
  1061. #endif /* ERR_H */