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

编译器/解释器

开发平台:

Others

  1. /* bits.c -- manage creation and output of bit sets used by the parser.
  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 <stdio.h>
  30. #include <ctype.h>
  31. #ifdef __cplusplus
  32. #ifndef __STDC__
  33. #define __STDC__
  34. #endif
  35. #endif
  36. #include "set.h"
  37. #include "syn.h"
  38. #include "hash.h"
  39. #include "generic.h"
  40. #include "dlgdef.h"
  41. /* char is only thing that is pretty much always known == 8 bits
  42.  * This allows output of antlr (set stuff, anyway) to be androgynous (portable)
  43.  */
  44. typedef unsigned char SetWordType;
  45. #define BitsPerByte 8
  46. #define BitsPerWord BitsPerByte*sizeof(SetWordType)
  47. static SetWordType *setwd = NULL;
  48. int setnum = -1;
  49. int wordnum = 0;
  50. int esetnum = 0;
  51. /* Used to convert native wordsize, which ANTLR uses (via set.c) to manipulate sets,
  52.    to bytes that are most portable size-wise.
  53.    */
  54. void
  55. #ifdef __STDC__
  56. DumpIntAsChars( FILE *f, char *format, unsigned wd )
  57. #else
  58. DumpIntAsChars( f, format, wd )
  59. FILE *f;
  60. char *format;
  61. unsigned wd;
  62. #endif
  63. {
  64. int i;
  65. /* uses max of 32 bit unsigned integer for the moment */
  66. static unsigned long byte_mask[sizeof(unsigned long)] =
  67. { 0xFF, 0xFF00, 0xFF0000, 0xFF000000 };
  68. /*   0xFF00000000, 0xFF0000000000, 0xFF000000000000, 0xFF00000000000000 };*/
  69. /* for each byte in the word */
  70. for (i=0; i<sizeof(unsigned); i++)
  71. {
  72. /* mask out the ith byte and shift down to the first 8 bits */
  73. fprintf(f, format, (wd&byte_mask[i])>>(i*BitsPerByte));
  74. if ( i<sizeof(unsigned)-1) fprintf(f, ",");
  75. }
  76. }
  77. /* Create a new setwd (ignoring [Ep] token on end) */
  78. void
  79. #ifdef __STDC__
  80. NewSetWd( void )
  81. #else
  82. NewSetWd( )
  83. #endif
  84. {
  85. SetWordType *p;
  86. if ( setwd == NULL )
  87. {
  88. setwd = (SetWordType *) calloc(TokenNum, sizeof(SetWordType));
  89. require(setwd!=NULL, "NewSetWd: cannot alloc set wdn");
  90. }
  91. for (p = setwd; p<&(setwd[TokenNum]); p++)  {*p=0;}
  92. wordnum++;
  93. }
  94. void
  95. #ifdef __STDC__
  96. DumpSetWd( void )
  97. #else
  98. DumpSetWd( )
  99. #endif
  100. {
  101. if ( GenCC ) DumpSetWdForCC();
  102. else DumpSetWdForC();
  103. }
  104. /* Dump the current setwd to ErrFile. 0..MaxTokenVal */
  105. void
  106. #ifdef __STDC__
  107. DumpSetWdForC( void )
  108. #else
  109. DumpSetWdForC( )
  110. #endif
  111. {
  112. int i,c=1;
  113. if ( setwd==NULL ) return;
  114. if ( !GenCC ) fprintf(DefFile, "extern SetWordType setwd%d[];n", wordnum);
  115. fprintf(ErrFile,
  116. "SetWordType setwd%d[%d] = {", wordnum, TokenNum-1);
  117. for (i=0; i<TokenNum-1; i++)
  118. {
  119. DAWDLE;
  120. if ( i!=0 ) fprintf(ErrFile, ",");
  121. if ( c == 8 ) {fprintf(ErrFile, "nt"); c=1;} else c++;
  122. fprintf(ErrFile, "0x%x", setwd[i]);
  123. }
  124. fprintf(ErrFile, "};n");
  125. }
  126. /* Dump the current setwd to Parser.C file. 0..MaxTokenVal;
  127.  * Only used if -CC on.
  128.  */
  129. void
  130. #ifdef __STDC__
  131. DumpSetWdForCC( void )
  132. #else
  133. DumpSetWdForCC( )
  134. #endif
  135. {
  136. int i,c=1;
  137. if ( setwd==NULL ) return;
  138. fprintf(Parser_h, "tstatic SetWordType setwd%d[%d];n", wordnum, TokenNum-1);
  139. fprintf(Parser_c,
  140. "SetWordType %s::setwd%d[%d] = {", CurrentClassName, wordnum,
  141. TokenNum-1);
  142. for (i=0; i<TokenNum-1; i++)
  143. {
  144. DAWDLE;
  145. if ( i!=0 ) fprintf(Parser_c, ",");
  146. if ( c == 8 ) {fprintf(Parser_c, "nt"); c=1;} else c++;
  147. fprintf(Parser_c, "0x%x", setwd[i]);
  148. }
  149. fprintf(Parser_c, "};n");
  150. }
  151. /* Make a new set.  Dump old setwd and create new setwd if current setwd is full */
  152. void
  153. #ifdef __STDC__
  154. NewSet( void )
  155. #else
  156. NewSet( )
  157. #endif
  158. {
  159. setnum++;
  160. if ( setnum==BitsPerWord ) /* is current setwd full? */
  161. {
  162. DumpSetWd(); NewSetWd(); setnum = 0;
  163. }
  164. }
  165. /* s is a set of tokens.  Turn on bit at each token position in set 'setnum' */
  166. void
  167. #ifdef __STDC__
  168. FillSet( set s )
  169. #else
  170. FillSet( s )
  171. set s;
  172. #endif
  173. {
  174. SetWordType mask=(((unsigned)1)<<setnum);
  175. unsigned int e;
  176. while ( !set_nil(s) )
  177. {
  178. e = set_int(s);
  179. set_rm(e, s);
  180. setwd[e] |= mask;
  181. }
  182. }
  183. /* E r r o r  C l a s s  S t u f f */
  184. /* compute the FIRST of a rule for the error class stuff */
  185. static set
  186. #ifdef __STDC__
  187. Efirst( char *rule, ECnode *eclass )
  188. #else
  189. Efirst( rule, eclass )
  190. char *rule;
  191. ECnode *eclass;
  192. #endif
  193. {
  194. set rk, a;
  195. Junction *r;
  196. RuleEntry *q = (RuleEntry *) hash_get(Rname, rule);
  197. if ( q == NULL )
  198. {
  199. warnNoFL(eMsg2("undefined rule '%s' referenced in errclass '%s'; ignored",
  200. rule, TokenString(eclass->tok)));
  201. return empty;
  202. }
  203. r = RulePtr[q->rulenum];
  204. r->end->halt = TRUE; /* don't let reach fall off end of rule here */
  205. rk = empty;
  206. REACH(r, 1, &rk, a);
  207. r->end->halt = FALSE;
  208. return a;
  209. }
  210. /*
  211.  * scan the list of tokens/eclasses/nonterminals filling the new eclass
  212.  * with the set described by the list.  Note that an eclass can be
  213.  * quoted to allow spaces etc... However, an eclass must not conflict
  214.  * with a reg expr found elsewhere.  The reg expr will be taken over
  215.  * the eclass name.
  216.  */
  217. static void
  218. #ifdef __STDC__
  219. doEclass( char *eclass )
  220. #else
  221. doEclass( eclass )
  222. char *eclass;
  223. #endif
  224. {
  225. TermEntry *q;
  226. ECnode *p;
  227. ListNode *e;
  228. unsigned int t;
  229. unsigned deg=0;
  230. set a;
  231. require(eclass!=NULL, "doEclass: NULL eset");
  232. p = (ECnode *) eclass;
  233. lexmode(p->lexclass); /* switch to lexclass where errclass is defined */
  234. p->eset = empty;
  235. for (e = (p->elist)->next; e!=NULL; e=e->next)
  236. {
  237. if ( islower( *((char *)e->elem) ) ) /* is it a rule ref? (alias FIRST request) */
  238. {
  239. a = Efirst((char *)e->elem, p);
  240. set_orin(&p->eset, a);
  241. deg += set_deg(a);
  242. set_free( a );
  243. continue;
  244. }
  245. else if ( *((char *)e->elem)=='"' )
  246. {
  247. t = 0;
  248. q = (TermEntry *) hash_get(Texpr, (char *) e->elem);
  249. if ( q == NULL )
  250. {
  251. /* if quoted and not an expr look for eclass name */
  252. q = (TermEntry *) hash_get(Tname, *((char **)&(e->elem))=StripQuotes((char *)e->elem));
  253. if ( q != NULL ) t = q->token;
  254. }
  255. else t = q->token;
  256. }
  257. else /* labelled token/eclass/tokclass */
  258. {
  259. q = (TermEntry *) hash_get(Tname, (char *)e->elem);
  260. if ( q != NULL )
  261. {
  262. if ( strcmp((char *)e->elem, TokenString(p->tok))==0 )
  263. {
  264. warnNoFL(eMsg1("self-referential error class '%s'; ignored",
  265.    (char *)e->elem));
  266. continue;
  267. }
  268. else
  269. t = q->token;
  270. }
  271. else t=0;
  272. }
  273. if ( t!=0 )
  274. {
  275. set_orel(t, &p->eset);
  276. deg++;
  277. }
  278. else warnNoFL(eMsg2("undefined token '%s' referenced in errclass '%s'; ignored",
  279. (char *)e->elem, TokenString(p->tok)));
  280. }
  281. p->setdeg = deg;
  282. }
  283. void
  284. #ifdef __STDC__
  285. ComputeErrorSets( void )
  286. #else
  287. ComputeErrorSets( )
  288. #endif
  289. {
  290. #ifdef __cplusplus
  291.     list_apply(eclasses, (void (*)(void *)) doEclass);
  292. #else
  293. #ifdef __STDC__
  294.     list_apply(eclasses, (void (*)(void *)) doEclass);
  295. #else
  296.     list_apply(eclasses, doEclass);
  297. #endif
  298. #endif
  299. }
  300. void
  301. #ifdef __STDC__
  302. ComputeTokSets( void )
  303. #else
  304. ComputeTokSets( )
  305. #endif
  306. {
  307. ListNode *t, *e = NULL, *e1, *e2;
  308. int something_changed;
  309.     int i;
  310. TCnode *p;
  311. TermEntry *q, *q1, *q2;
  312. if ( tclasses == NULL ) return;
  313. /* turn lists of token/tokclass references into sets */
  314. for (t = tclasses->next; t!=NULL; t=t->next)
  315. {
  316. p = (TCnode *) t->elem;
  317. /* if wild card, then won't have entries in tclass, assume all_tokens */
  318. if ( p->tok == WildCardToken )
  319. {
  320. p->tset = set_dup(all_tokens);
  321. continue;
  322. }
  323. lexmode(p->lexclass); /* switch to lexclass where tokclass is defined */
  324. p->tset = empty;
  325. /* instantiate all tokens/token_classes into the tset */
  326. for (e = (p->tlist)->next; e!=NULL; e=e->next)
  327. {
  328. char *tokstr;
  329. tokstr = (char *)e->elem;
  330. if ( *tokstr == '"' ) {
  331.                 q = (TermEntry *) hash_get(Texpr, tokstr);
  332.      require(q!=NULL, "ComputeTokSets: no token def");
  333.      set_orel(q->token, &p->tset);
  334. } else if (tokstr[0] == '.') {
  335.                 e1=e->next;
  336.                 e2=e1->next;
  337.                 e=e2;
  338.                 q1= (TermEntry *) hash_get(Tname, (char *)e1->elem);
  339.      require(q1!=NULL, "ComputeTokSets: no token def");
  340.                 q2= (TermEntry *) hash_get(Tname, (char *)e2->elem);
  341.      require(q2!=NULL, "ComputeTokSets: no token def");
  342.                 if (set_el(q1->token,imag_tokens)) {
  343. errNoFL(eMsg2("can't define #tokclass %s using #tokclass or #errclass %s",
  344.                         TokenString(p->tok),(char *)e1->elem) );
  345.                 }
  346.                 if (set_el(q2->token,imag_tokens)) {
  347. errNoFL(eMsg2("can't define #tokclass %s using #tokclass or #errclass %s",
  348.                         TokenString(p->tok),(char *)e2->elem) );
  349.                 }
  350.                 if (q1->token > q2->token) {
  351. errNoFL(eMsg3("for #tokclass %s %s..%s - first token number > second token number",
  352.                         TokenString(p->tok),(char *)e1->elem,(char *)e2->elem) );
  353.                   for (i=q2->token; i<=q1->token; i++) { set_orel(i, &p->tset); }
  354.                 } else {
  355.                   for (i=q1->token; i<=q2->token; i++) { set_orel(i, &p->tset); }
  356.                 }
  357.             } else {
  358.                 q = (TermEntry *) hash_get(Tname, tokstr);
  359.      require(q!=NULL, "ComputeTokSets: no token def");
  360.      set_orel(q->token, &p->tset);
  361.             }
  362. }
  363. }
  364. /* Go thru list of tokclasses again looking for tokclasses in sets */
  365. again:
  366. something_changed = 0;
  367. for (t = tclasses->next; t!=NULL; t=t->next)
  368. {
  369. set tcl;
  370. p = (TCnode *) t->elem;
  371. tcl = set_and(p->tset, tokclasses);
  372. if ( !set_nil(tcl) )
  373. {
  374. int tk;
  375. /* replace refs to tokclasses with the associated set of tokens */
  376. something_changed = 1;
  377. while ( !set_nil(tcl) )
  378. {
  379. tk = set_int(tcl); /* grab one of the tok class refs */
  380. set_rm(tk, tcl);
  381. if ( p->tok != tk ) /* tokclass ref to yourself? */
  382. {
  383. q = (TermEntry *) hash_get(Tname, TokenString(tk));
  384. require(q!=NULL, "#tokclass not in hash table");
  385. set_orin(&p->tset, q->tclass->tset);
  386. }
  387. set_rm(tk, p->tset); /* remove ref that we replaced */
  388. }
  389. }
  390. set_free(tcl);
  391. }
  392. if ( something_changed ) goto again;
  393. }
  394. void
  395. DumpRemainingTokSets()
  396. {
  397. TCnode *p;
  398. ListNode *t;
  399. /* Go thru tclasses (for the last time) and dump the sets not dumped
  400.  * during code gen; yes, this is a bogus way to do this, but ComputeTokSets()
  401.  * can't dump the defs as the error file and tok file has not been created
  402.  * yet etc...
  403.  */
  404. if ( tclasses==NULL ) return;
  405. for (t = tclasses->next; t!=NULL; t=t->next)
  406. {
  407. unsigned e;
  408. p = (TCnode *) t->elem;
  409. if ( p->dumped ) continue;
  410. e = DefErrSet(&(p->tset), 0, TokenString(p->tok));
  411. p->dumped = 1;
  412. p->setnum = e;
  413. }
  414. }
  415. /* replace a subset of an error set with an error class name if a subset is found
  416.  * repeat process until no replacements made
  417.  */
  418. void
  419. #ifdef __STDC__
  420. SubstErrorClass( set *f )
  421. #else
  422. SubstErrorClass( f )
  423. set *f;
  424. #endif
  425. {
  426. int max, done = 0;
  427. ListNode *p;
  428. ECnode *ec, *maxclass = NULL;
  429. set a;
  430. require(f!=NULL, "SubstErrorClass: NULL eset");
  431. if ( eclasses == NULL ) return;
  432. while ( !done )
  433. {
  434. max = 0;
  435. maxclass = NULL;
  436. for (p=eclasses->next; p!=NULL; p=p->next) /* chk all error classes */
  437. {
  438. ec = (ECnode *) p->elem;
  439. if ( ec->setdeg > max )
  440. {
  441. if ( set_sub(ec->eset, *f) || set_equ(ec->eset, *f) )
  442. {maxclass = ec; max=ec->setdeg;}
  443. }
  444. }
  445. if ( maxclass != NULL ) /* if subset found, replace with token */
  446. {
  447. a = set_dif(*f, maxclass->eset);
  448. set_orel((unsigned)maxclass->tok, &a);
  449. set_free(*f);
  450. *f = a;
  451. }
  452. else done = 1;
  453. }
  454. }
  455. int
  456. #ifdef __STDC__
  457. DefErrSet1(int nilOK, set *f, int subst, char *name )
  458. #else
  459. DefErrSet1(nilOK, f, subst, name )
  460. int nilOK;
  461. set *f;
  462. int subst; /* should be substitute error classes? */
  463. char *name;
  464. #endif
  465. {
  466. if ( GenCC ) return DefErrSetForCC1(nilOK, f, subst, name );
  467. else return DefErrSetForC1(nilOK, f, subst, name );
  468. }
  469. int
  470. #ifdef __STDC__
  471. DefErrSet( set *f, int subst, char *name )
  472. #else
  473. DefErrSet( f, subst, name )
  474. set *f;
  475. int subst; /* should be substitute error classes? */
  476. char *name;
  477. #endif
  478. {
  479.     return DefErrSet1(0,f,subst,name);
  480. }
  481. /* Define a new error set.  WARNING...set-implementation dependent.
  482.  */
  483. int
  484. #ifdef __STDC__
  485. DefErrSetForC1(int nilOK, set *f, int subst, char *name )
  486. #else
  487. DefErrSetForC1(nilOK, f, subst, name )
  488. int nilOK;          /* MR13 */
  489. set *f;
  490. int subst; /* should be substitute error classes? */
  491. char *name;
  492. #endif
  493. {
  494. unsigned *p, *endp;
  495. int e=1;
  496.     if (!nilOK) require(!set_nil(*f), "DefErrSet: nil set to dump?");
  497. if ( subst ) SubstErrorClass(f);
  498. p = f->setword;
  499. endp = &(f->setword[f->n]);
  500. esetnum++;
  501. if ( name!=NULL )
  502. fprintf(DefFile, "extern SetWordType %s_set[];n", name);
  503. else
  504. fprintf(DefFile, "extern SetWordType zzerr%d[];n", esetnum);
  505. if ( name!=NULL ) {
  506. fprintf(ErrFile, "SetWordType %s_set[%d] = {",
  507. name,
  508. NumWords(TokenNum-1)*sizeof(unsigned));
  509. }
  510. else {
  511. fprintf(ErrFile, "SetWordType zzerr%d[%d] = {",
  512. esetnum,
  513. NumWords(TokenNum-1)*sizeof(unsigned));
  514. }
  515. while ( p < endp )
  516. {
  517. if ( e > 1 ) fprintf(ErrFile, ", ");
  518. DumpIntAsChars(ErrFile, "0x%x", *p++);
  519. if ( e == 3 )
  520. {
  521. DAWDLE;
  522. if ( p < endp ) fprintf(ErrFile, ",");
  523. fprintf(ErrFile, "nt");
  524. e=1;
  525. }
  526. else e++;
  527. }
  528. fprintf(ErrFile, "};n");
  529. return esetnum;
  530. }
  531. int
  532. #ifdef __STDC__
  533. DefErrSetForC( set *f, int subst, char *name )
  534. #else
  535. DefErrSetForC( f, subst, name )
  536. set *f;
  537. int subst; /* should be substitute error classes? */
  538. char *name;
  539. #endif
  540. {
  541.   return DefErrSetForC1(0,f,subst,name);
  542. }
  543. /* Define a new error set.  WARNING...set-implementation dependent;
  544.  * Only used when -CC on.
  545.  */
  546. int
  547. #ifdef __STDC__
  548. DefErrSetForCC1(int nilOK, set *f, int subst, char *name )
  549. #else
  550. DefErrSetForCC1(nilOK, f, subst, name )
  551. int nilOK;          /* MR13 */
  552. set *f;
  553. int subst; /* should be substitute error classes? */
  554. char *name;
  555. #endif
  556. {
  557. unsigned *p, *endp;
  558. int e=1;
  559.     if (!nilOK) require(!set_nil(*f), "DefErrSet: nil set to dump?");
  560. if ( subst ) SubstErrorClass(f);
  561. p = f->setword;
  562. endp = &(f->setword[f->n]);
  563. esetnum++;
  564. if ( name!=NULL ) {
  565. fprintf(Parser_h, "tstatic SetWordType %s_set[%d];n", name,
  566. NumWords(TokenNum-1)*sizeof(unsigned));
  567. fprintf(Parser_c, "SetWordType %s::%s_set[%d] = {",
  568. CurrentClassName,
  569. name,
  570. NumWords(TokenNum-1)*sizeof(unsigned));
  571. }
  572. else {
  573. fprintf(Parser_c, "SetWordType %s::err%d[%d] = {",
  574. CurrentClassName,
  575. esetnum,
  576. NumWords(TokenNum-1)*sizeof(unsigned));
  577. fprintf(Parser_h, "tstatic SetWordType err%d[%d];n", esetnum,
  578. NumWords(TokenNum-1)*sizeof(unsigned));
  579. }
  580. while ( p < endp )
  581. {
  582. if ( e > 1 ) fprintf(Parser_c, ", ");
  583. DumpIntAsChars(Parser_c, "0x%x", *p++);
  584. if ( e == 3 )
  585. {
  586. if ( p < endp ) fprintf(Parser_c, ",");
  587. fprintf(Parser_c, "nt");
  588. e=1;
  589. }
  590. else e++;
  591. }
  592. fprintf(Parser_c, "};n");
  593. return esetnum;
  594. }
  595. int
  596. #ifdef __STDC__
  597. DefErrSetForCC( set *f, int subst, char *name )
  598. #else
  599. DefErrSetForCC( f, subst, name )
  600. set *f;
  601. int subst; /* should be substitute error classes? */
  602. char *name;
  603. #endif
  604. {
  605.   return DefErrSetForCC1(0,f,subst,name);
  606. }
  607. void
  608. #ifdef __STDC__
  609. GenParser_c_Hdr(void)
  610. #else
  611. GenParser_c_Hdr()
  612. #endif
  613. {
  614. int i,j;
  615.     TermEntry   *te;
  616. fprintf(Parser_c, "/*n");
  617. fprintf(Parser_c, " * %s: P a r s e r  S u p p o r tn", CurrentClassName);
  618. fprintf(Parser_c, " *n");
  619. fprintf(Parser_c, " * Generated from:");
  620. for (i=0; i<NumFiles; i++) fprintf(Parser_c, " %s", FileStr[i]);
  621. fprintf(Parser_c, "n");
  622. fprintf(Parser_c, " *n");
  623. fprintf(Parser_c, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-1998n");
  624. fprintf(Parser_c, " * Parr Research Corporationn");
  625. fprintf(Parser_c, " * with Purdue University Electrical Engineeringn");
  626. fprintf(Parser_c, " * with AHPCRC, University of Minnesotan");
  627. fprintf(Parser_c, " * ANTLR Version %sn", Version);
  628. fprintf(Parser_c, " */nn");
  629. fprintf(Parser_c, "#define ANTLR_VERSION %sn", VersionDef);
  630. if ( FirstAction != NULL ) dumpAction(FirstAction,Parser_c, 0, -1, 0, 1);    /* MR11 */
  631. fprintf(Parser_c, "#include "pcctscfg.h"n");
  632. fprintf(Parser_c, "#include PCCTS_STDIO_Hn");
  633. fprintf(Parser_c, "#define ANTLR_SUPPORT_CODEn");
  634. if ( UserTokenDefsFile != NULL )
  635.    fprintf(Parser_c, "#include %sn", UserTokenDefsFile);
  636. else
  637.    fprintf(Parser_c, "#include "%s"n", DefFileName);
  638. fprintf(Parser_c, "#include "%s.h"nn", CurrentClassName);
  639. fprintf(Parser_c, "const ANTLRChar *%s::tokenName(int tok) ",   /* MR1 */
  640. CurrentClassName);                           /* MR1 */
  641. fprintf(Parser_c, "  { return _token_tbl[tok]; }n");         /* MR1 */ /* MR10 */
  642. /* Dump a Parser::tokens for each automaton */
  643. fprintf(Parser_c, "nANTLRChar *%s::_token_tbl[]={n", CurrentClassName);
  644. fprintf(Parser_c, "t/* 00 */t"Invalid"");
  645. for (i=1; i<TokenNum-1; i++)
  646. {
  647. DAWDLE;
  648. if ( i == EpToken ) continue;
  649. /* remapped to invalid token? */
  650. if ( TokenInd!=NULL && TokenInd[i]>=LastTokenCounted )
  651. {
  652. fprintf(Parser_c, ",nt/* %02d */t"invalid"", i);
  653. continue;
  654. }
  655. if ( TokenString(i) != NULL ) {
  656.            te=(TermEntry *) hash_get(Tname,TokenString(i));                     /* MR11 */
  657.             if (te == NULL || te->akaString == NULL) {                          /* MR11 */
  658.              fprintf(Parser_c, ",nt/* %02d */t"%s"", i, TokenString(i));
  659.             } else {
  660.              fprintf(Parser_c, ",nt/* %02d */t"%s"", i, te->akaString);   /* MR11 */
  661.             }
  662.         }
  663. else
  664. {
  665. /* look in all lexclasses for the reg expr */
  666. for (j=0; j<NumLexClasses; j++)
  667. {
  668. lexmode(j);
  669. if ( ExprString(i) != NULL )
  670. {
  671. fprintf(Parser_c, ",nt/* %02d */t", i);
  672. dumpExpr(Parser_c, ExprString(i));
  673. break;
  674. }
  675. }
  676. if ( j>=NumLexClasses )
  677. {
  678. if ( UserDefdTokens )
  679. {
  680. fprintf(Parser_c, ",nt/* %02d */t""", i);
  681. }
  682. else
  683. fatal_internal(eMsgd("No label or expr for token %d",i));
  684. }
  685. }
  686. }
  687. fprintf(Parser_c, "n};n");
  688. /* Build constructors */
  689. fprintf(Parser_c, "n%s::", CurrentClassName);
  690. fprintf(Parser_c, "%s(ANTLRTokenBuffer *input) : ANTLRParser(input,%d,%d,%d,%d)n",
  691. CurrentClassName,
  692. OutputLL_k,
  693. FoundGuessBlk,
  694. DemandLookahead,
  695. NumWords(TokenNum-1)*sizeof(unsigned));
  696. fprintf(Parser_c, "{n");
  697. fprintf(Parser_c, "ttoken_tbl = _token_tbl;n");
  698.     if (TraceGen) {
  699.       fprintf(Parser_c, "ttraceOptionValueDefault=1;tt// MR10 turn trace ONn");
  700.     } else {
  701.       fprintf(Parser_c, "ttraceOptionValueDefault=0;tt// MR10 turn trace OFFn");
  702.     };
  703. fprintf(Parser_c, "}nn");
  704. }
  705. void
  706. #ifdef __STDC__
  707. GenParser_h_Hdr(void)
  708. #else
  709. GenParser_h_Hdr()
  710. #endif
  711. {
  712. int i;
  713. fprintf(Parser_h, "/*n");
  714. fprintf(Parser_h, " * %s: P a r s e r  H e a d e r n", CurrentClassName);
  715. fprintf(Parser_h, " *n");
  716. fprintf(Parser_h, " * Generated from:");
  717. for (i=0; i<NumFiles; i++) fprintf(Parser_h, " %s", FileStr[i]);
  718. fprintf(Parser_h, "n");
  719. fprintf(Parser_h, " *n");
  720. fprintf(Parser_h, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-1998n");
  721. fprintf(Parser_h, " * Parr Research Corporationn");
  722. fprintf(Parser_h, " * with Purdue University Electrical Engineeringn");
  723. fprintf(Parser_h, " * with AHPCRC, University of Minnesotan");
  724. fprintf(Parser_h, " * ANTLR Version %sn", Version);
  725. fprintf(Parser_h, " */nn");
  726. fprintf(Parser_h, "#ifndef %s_hn", CurrentClassName);
  727. fprintf(Parser_h, "#define %s_hnn", CurrentClassName);
  728.     fprintf(Parser_h, "#ifndef ANTLR_VERSIONn");
  729.     fprintf(Parser_h, "#define ANTLR_VERSION %sn",VersionDef);
  730.     fprintf(Parser_h, "#endifnn");
  731. if ( FirstAction != NULL ) dumpAction( FirstAction, Parser_h, 0, -1, 0, 1);         /* MR11 */
  732. if ( GenAST ) fprintf(Parser_h, "class ASTBase;n");
  733. fprintf(Parser_h, "#include "%s"nn", APARSER_H);
  734. if ( HdrAction != NULL ) dumpAction( HdrAction, Parser_h, 0, -1, 0, 1);
  735. /* MR10 */    if (ClassDeclStuff == NULL) {
  736. /* MR10 */   fprintf(Parser_h, "class %s : public ANTLRParser {n", CurrentClassName);
  737. /* MR10 */    } else {
  738. /* MR10 */      fprintf(Parser_h, "class %s %s {n",CurrentClassName,ClassDeclStuff);
  739. /* MR10 */    };
  740. fprintf(Parser_h, "public:n");           /* MR1 */
  741. fprintf(Parser_h, "tstatic  const ANTLRChar *tokenName(int tk);n"); /* MR1 */
  742. fprintf(Parser_h, "protected:n");
  743. fprintf(Parser_h, "tstatic  ANTLRChar *_token_tbl[];n");
  744. fprintf(Parser_h, "private:n");
  745. }
  746. /* Currently, this is only used in !GenCC mode */
  747. void
  748. #ifdef __STDC__
  749. GenErrHdr( void )
  750. #else
  751. GenErrHdr( )
  752. #endif
  753. {
  754. int i, j;
  755.     TermEntry   *te;
  756. fprintf(ErrFile, "/*n");
  757. fprintf(ErrFile, " * A n t l r  S e t s / E r r o r  F i l e  H e a d e rn");
  758. fprintf(ErrFile, " *n");
  759. fprintf(ErrFile, " * Generated from:");
  760. for (i=0; i<NumFiles; i++) fprintf(ErrFile, " %s", FileStr[i]);
  761. fprintf(ErrFile, "n");
  762. fprintf(ErrFile, " *n");
  763. fprintf(ErrFile, " * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-1998n");
  764. fprintf(ErrFile, " * Parr Research Corporationn");
  765. fprintf(ErrFile, " * with Purdue University Electrical Engineeringn");
  766. fprintf(ErrFile, " * With AHPCRC, University of Minnesotan");
  767. fprintf(ErrFile, " * ANTLR Version %sn", Version);
  768. fprintf(ErrFile, " */nn");
  769. fprintf(ErrFile, "#define ANTLR_VERSION %sn", VersionDef);
  770. if ( FirstAction != NULL ) dumpAction( FirstAction, ErrFile, 0, -1, 0, 1);         /* MR11 */
  771. fprintf(ErrFile, "#include "pcctscfg.h"n");
  772. fprintf(ErrFile, "#include PCCTS_STDIO_Hn");
  773. if ( strcmp(ParserName, DefaultParserName)!=0 )
  774. fprintf(ErrFile, "#define %s %sn", DefaultParserName, ParserName);
  775. if ( strcmp(ParserName, DefaultParserName)!=0 )
  776. fprintf(ErrFile, "#include "%s"n", RemapFileName);
  777. if ( HdrAction != NULL ) dumpAction( HdrAction, ErrFile, 0, -1, 0, 1 );
  778. if ( FoundGuessBlk )
  779. {
  780. fprintf(ErrFile, "#define ZZCAN_GUESSn");
  781. fprintf(ErrFile, "#include PCCTS_SETJMP_Hn");
  782. }
  783.     if (TraceGen) {
  784.       fprintf(ErrFile,"#define zzTRACE_RULESn");  /* MR10 */
  785.     };
  786. if ( OutputLL_k > 1 ) fprintf(ErrFile, "#define LL_K %dn", OutputLL_k);
  787. #ifdef DUM
  788. if ( LexGen ) fprintf(ErrFile, "#define zzEOF_TOKEN %dn", (TokenInd!=NULL?TokenInd[EofToken]:EofToken));
  789. #endif
  790. fprintf(ErrFile, "#define zzSET_SIZE %dn", NumWords(TokenNum-1)*sizeof(unsigned));
  791. if ( DemandLookahead ) fprintf(ErrFile, "#define DEMAND_LOOKn");
  792. fprintf(ErrFile, "#include "antlr.h"n");
  793. if ( GenAST ) fprintf(ErrFile, "#include "ast.h"n");
  794.     if ( UserDefdTokens ) fprintf(ErrFile, "#include %sn", UserTokenDefsFile);
  795. /* still need this one as it has the func prototypes */
  796. fprintf(ErrFile, "#include "%s"n", DefFileName);
  797. fprintf(ErrFile, "#include "dlgdef.h"n");
  798. fprintf(ErrFile, "#include "err.h"nn");
  799. /* Dump a zztokens for each automaton */
  800. if ( strcmp(ParserName, DefaultParserName)!=0 )
  801. {
  802. fprintf(ErrFile, "ANTLRChar *%s_zztokens[%d]={n", ParserName, TokenNum-1);
  803. }
  804. else
  805. {
  806. fprintf(ErrFile, "ANTLRChar *zztokens[%d]={n", TokenNum-1);
  807. }
  808. fprintf(ErrFile, "t/* 00 */t"Invalid"");
  809. for (i=1; i<TokenNum-1; i++)
  810. {
  811. DAWDLE;
  812. if ( i == EpToken ) continue;
  813. /* remapped to invalid token? */
  814. if ( TokenInd!=NULL && TokenInd[i]>=LastTokenCounted )
  815. {
  816. fprintf(ErrFile, ",nt/* %02d */t"invalid"", i);
  817. continue;
  818. }
  819. if ( TokenString(i) != NULL ) {
  820.             te=(TermEntry *) hash_get(Tname,TokenString(i));                     /* MR11 */
  821.             if (te == NULL || te->akaString == NULL) {                          /* MR11 */
  822.      fprintf(ErrFile, ",nt/* %02d */t"%s"", i, TokenString(i));
  823.             } else {
  824.      fprintf(ErrFile, ",nt/* %02d */t"%s"", i, te->akaString);    /* MR11 */
  825.             }
  826.         }
  827. else
  828. {
  829. /* look in all lexclasses for the reg expr */
  830. for (j=0; j<NumLexClasses; j++)
  831. {
  832. lexmode(j);
  833. if ( ExprString(i) != NULL )
  834. {
  835. fprintf(ErrFile, ",nt/* %02d */t", i);
  836. dumpExpr(ErrFile, ExprString(i));
  837. break;
  838. }
  839. }
  840. if ( j>=NumLexClasses )
  841. {
  842. if ( UserDefdTokens )
  843. {
  844. fprintf(ErrFile, ",nt/* %02d */t""", i);
  845. }
  846. else
  847. fatal_internal(eMsgd("No label or expr for token %d",i));
  848. }
  849. }
  850. }
  851. fprintf(ErrFile, "n};n");
  852. }
  853. void
  854. #ifdef __STDC__
  855. dumpExpr( FILE *f, char *e )
  856. #else
  857. dumpExpr( f, e )
  858. FILE *f;
  859. char *e;
  860. #endif
  861. {
  862. while ( *e!='' )
  863. {
  864. if ( *e=='\' && *(e+1)=='\' )
  865. {putc('\', f); putc('\', f); e+=2;}
  866. else if ( *e=='\' && *(e+1)=='"' )
  867. {putc('\', f); putc('"', f); e+=2;}
  868. else if ( *e=='\' ) {putc('\', f); putc('\', f); e++;}
  869. else {putc(*e, f); e++;}
  870. }
  871. }