gram.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. #line 1 "/sys/src/ape/cmd/make/gram.y"
  2. #include "defs.h"
  3. #line 5 "/sys/src/ape/cmd/make/gram.y"
  4. typedef union
  5. {
  6. struct shblock *yshblock;
  7. depblkp ydepblock;
  8. nameblkp ynameblock;
  9. } YYSTYPE;
  10. extern int yyerrflag;
  11. #ifndef YYMAXDEPTH
  12. #define YYMAXDEPTH 150
  13. #endif
  14. YYSTYPE yylval;
  15. YYSTYPE yyval;
  16. #line 20 "/sys/src/ape/cmd/make/gram.y"
  17. struct depblock *pp;
  18. static struct shblock *prevshp;
  19. static struct nameblock *lefts[NLEFTS];
  20. struct nameblock *leftp;
  21. static int nlefts;
  22. struct lineblock *lp, *lpp;
  23. static struct depblock *prevdep;
  24. static int sepc;
  25. static int allnowait;
  26. static struct fstack
  27. {
  28. FILE *fin;
  29. char *fname;
  30. int lineno;
  31. } filestack[MAXINCLUDE];
  32. static int ninclude = 0;
  33. #define NAME 57346
  34. #define SHELLINE 57347
  35. #define START 57348
  36. #define MACRODEF 57349
  37. #define COLON 57350
  38. #define DOUBLECOLON 57351
  39. #define GREATER 57352
  40. #define AMPER 57353
  41. #define AMPERAMPER 57354
  42. #define YYEOFCODE 1
  43. #define YYERRCODE 2
  44. #line 149 "/sys/src/ape/cmd/make/gram.y"
  45. static char *zznextc; /* null if need another line;
  46. otherwise points to next char */
  47. static int yylineno;
  48. static FILE * fin;
  49. static int retsh(char *);
  50. static int nextlin(void);
  51. static int isinclude(char *);
  52. int yyparse(void);
  53. int
  54. parse(char *name)
  55. {
  56. FILE *stream;
  57. if(name == CHNULL)
  58. {
  59. stream = NULL;
  60. name = "(builtin-rules)";
  61. }
  62. else if(equal(name, "-"))
  63. {
  64. stream = stdin;
  65. name = "(stdin)";
  66. }
  67. else if( (stream = fopen(name, "r")) == NULL)
  68. return NO;
  69. filestack[0].fname = copys(name);
  70. ninclude = 1;
  71. fin = stream;
  72. yylineno = 0;
  73. zznextc = 0;
  74. if( yyparse() )
  75. fatal("Description file error");
  76. if(fin)
  77. fclose(fin);
  78. return YES;
  79. }
  80. int
  81. yylex(void)
  82. {
  83. char *p;
  84. char *q;
  85. char word[INMAX];
  86. if(! zznextc )
  87. return nextlin() ;
  88. while( isspace(*zznextc) )
  89. ++zznextc;
  90. switch(*zznextc)
  91. {
  92. case '\0':
  93. return nextlin() ;
  94. case '|':
  95. if(zznextc[1]==':')
  96. {
  97. zznextc += 2;
  98. return DOUBLECOLON;
  99. }
  100. break;
  101. case ':':
  102. if(*++zznextc == ':')
  103. {
  104. ++zznextc;
  105. return DOUBLECOLON;
  106. }
  107. return COLON;
  108. case '>':
  109. ++zznextc;
  110. return GREATER;
  111. case '&':
  112. if(*++zznextc == '&')
  113. {
  114. ++zznextc;
  115. return AMPERAMPER;
  116. }
  117. return AMPER;
  118. case ';':
  119. return retsh(zznextc) ;
  120. }
  121. p = zznextc;
  122. q = word;
  123. while( ! ( funny[*p] & TERMINAL) )
  124. *q++ = *p++;
  125. if(p != zznextc)
  126. {
  127. *q = '\0';
  128. if((yylval.ynameblock=srchname(word))==0)
  129. yylval.ynameblock = makename(word);
  130. zznextc = p;
  131. return NAME;
  132. }
  133. else {
  134. char junk[100];
  135. sprintf(junk, "Bad character %c (octal %o), line %d of file %s",
  136. *zznextc, *zznextc, yylineno, filestack[ninclude-1].fname);
  137. fatal(junk);
  138. }
  139. return 0; /* never executed */
  140. }
  141. static int
  142. retsh(char *q)
  143. {
  144. register char *p;
  145. struct shblock *sp;
  146. for(p=q+1 ; *p==' '||*p=='\t' ; ++p) ;
  147. sp = ALLOC(shblock);
  148. sp->nxtshblock = NULL;
  149. sp->shbp = (fin ? copys(p) : p );
  150. yylval.yshblock = sp;
  151. zznextc = 0;
  152. return SHELLINE;
  153. }
  154. static int
  155. nextlin(void)
  156. {
  157. static char yytext[INMAX];
  158. static char *yytextl = yytext+INMAX;
  159. char *text, templin[INMAX];
  160. char c;
  161. char *p, *t;
  162. char lastch, *lastchp;
  163. extern char **linesptr;
  164. int incom;
  165. int kc;
  166. again:
  167. incom = NO;
  168. zznextc = 0;
  169. if(fin == NULL)
  170. {
  171. if( (text = *linesptr++) == 0)
  172. return 0;
  173. ++yylineno;
  174. }
  175. else {
  176. for(p = text = yytext ; p<yytextl ; *p++ = kc)
  177. switch(kc = getc(fin))
  178. {
  179. case '\t':
  180. if(p == yytext)
  181. incom = YES;
  182. break;
  183. case ';':
  184. incom = YES;
  185. break;
  186. case '#':
  187. if(! incom)
  188. kc = '\0';
  189. break;
  190. case '\n':
  191. ++yylineno;
  192. if(p==yytext || p[-1]!='\\')
  193. {
  194. *p = '\0';
  195. goto endloop;
  196. }
  197. p[-1] = ' ';
  198. while( (kc=getc(fin))=='\t' || kc==' ' || kc=='\n')
  199. if(kc == '\n')
  200. ++yylineno;
  201. if(kc != EOF)
  202. break;
  203. case EOF:
  204. *p = '\0';
  205. if(ninclude > 1)
  206. {
  207. register struct fstack *stp;
  208. fclose(fin);
  209. --ninclude;
  210. stp = filestack + ninclude;
  211. fin = stp->fin;
  212. yylineno = stp->lineno;
  213. free(stp->fname);
  214. goto again;
  215. }
  216. return 0;
  217. }
  218. fatal("line too long");
  219. }
  220. endloop:
  221. if((c = text[0]) == '\t')
  222. return retsh(text) ;
  223. if(isalpha(c) || isdigit(c) || c==' ' || c=='.'|| c=='_')
  224. for(p=text+1; *p!='\0'; )
  225. if(*p == ':')
  226. break;
  227. else if(*p++ == '=')
  228. {
  229. eqsign(text);
  230. return MACRODEF;
  231. }
  232. /* substitute for macros on dependency line up to the semicolon if any */
  233. for(t = yytext ; *t!='\0' && *t!=';' ; ++t)
  234. ;
  235. lastchp = t;
  236. lastch = *t;
  237. *t = '\0'; /* replace the semi with a null so subst will stop */
  238. subst(yytext, templin); /* Substitute for macros on dependency lines */
  239. if(lastch) /* copy the stuff after the semicolon */
  240. {
  241. *lastchp = lastch;
  242. strcat(templin, lastchp);
  243. }
  244. strcpy(yytext, templin);
  245. /* process include files after macro substitution */
  246. if(strncmp(text, "include", 7) == 0) {
  247. if (isinclude(text+7))
  248. goto again;
  249. }
  250. for(p = zznextc = text ; *p ; ++p )
  251. if(*p!=' ' && *p!='\t')
  252. return START;
  253. goto again;
  254. }
  255. static int
  256. isinclude(char *s)
  257. {
  258. char *t;
  259. struct fstack *p;
  260. for(t=s; *t==' ' || *t=='\t' ; ++t)
  261. ;
  262. if(t == s)
  263. return NO;
  264. for(s = t; *s!='\n' && *s!='#' && *s!='\0' ; ++s)
  265. if(*s == ':')
  266. return NO;
  267. *s = '\0';
  268. if(ninclude >= MAXINCLUDE)
  269. fatal("include depth exceeded");
  270. p = filestack + ninclude;
  271. p->fin = fin;
  272. p->lineno = yylineno;
  273. p->fname = copys(t);
  274. if( (fin = fopen(t, "r")) == NULL)
  275. fatal1("Cannot open include file %s", t);
  276. yylineno = 0;
  277. ++ninclude;
  278. return YES;
  279. }
  280. int
  281. yyerror(char *s, ...)
  282. {
  283. char buf[100];
  284. sprintf(buf, "line %d of file %s: %s",
  285. yylineno, filestack[ninclude-1].fname, s);
  286. fatal(buf);
  287. }
  288. short yyexca[] =
  289. {-1, 1,
  290. 1, -1,
  291. -2, 0,
  292. };
  293. #define YYNPROD 22
  294. #define YYPRIVATE 57344
  295. #define YYLAST 21
  296. short yyact[] =
  297. {
  298. 17, 20, 21, 16, 7, 9, 11, 18, 19, 12,
  299. 13, 5, 2, 1, 10, 3, 4, 8, 6, 14,
  300. 15
  301. };
  302. short yypact[] =
  303. {
  304. -1000, 9,-1000, 0,-1000,-1000, 1,-1000, -2,-1000,
  305. -4, -10,-1000,-1000,-1000, -3,-1000,-1000,-1000,-1000,
  306. -1000,-1000
  307. };
  308. short yypgo[] =
  309. {
  310. 0, 20, 19, 18, 17, 14, 13, 12, 6
  311. };
  312. short yyr1[] =
  313. {
  314. 0, 6, 6, 7, 7, 7, 7, 3, 3, 4,
  315. 4, 5, 5, 5, 5, 5, 8, 8, 2, 2,
  316. 1, 1
  317. };
  318. short yyr2[] =
  319. {
  320. 0, 0, 2, 1, 1, 4, 1, 1, 2, 0,
  321. 1, 1, 2, 2, 2, 2, 1, 1, 0, 1,
  322. 1, 2
  323. };
  324. short yychk[] =
  325. {
  326. -1000, -6, -7, 6, 7, 2, -3, 4, -4, 4,
  327. -5, -8, 8, 9, -2, -1, 5, 4, 11, 12,
  328. 11, 5
  329. };
  330. short yydef[] =
  331. {
  332. 1, -2, 2, 3, 4, 6, 9, 7, 18, 8,
  333. 10, 11, 16, 17, 5, 19, 20, 13, 14, 15,
  334. 12, 21
  335. };
  336. short yytok1[] =
  337. {
  338. 1
  339. };
  340. short yytok2[] =
  341. {
  342. 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  343. 12
  344. };
  345. long yytok3[] =
  346. {
  347. 0
  348. };
  349. #define YYFLAG -1000
  350. #define YYERROR goto yyerrlab
  351. #define YYACCEPT return(0)
  352. #define YYABORT return(1)
  353. #define yyclearin yychar = -1
  354. #define yyerrok yyerrflag = 0
  355. #ifdef yydebug
  356. #include "y.debug"
  357. #else
  358. #define yydebug 0
  359. char* yytoknames[1]; /* for debugging */
  360. char* yystates[1]; /* for debugging */
  361. #endif
  362. /* parser for yacc output */
  363. int yynerrs = 0; /* number of errors */
  364. int yyerrflag = 0; /* error recovery flag */
  365. extern int fprint(int, char*, ...);
  366. extern int sprint(char*, char*, ...);
  367. char*
  368. yytokname(int yyc)
  369. {
  370. static char x[10];
  371. if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0]))
  372. if(yytoknames[yyc-1])
  373. return yytoknames[yyc-1];
  374. sprintf(x, "<%d>", yyc);
  375. return x;
  376. }
  377. char*
  378. yystatname(int yys)
  379. {
  380. static char x[10];
  381. if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0]))
  382. if(yystates[yys])
  383. return yystates[yys];
  384. sprintf(x, "<%d>\n", yys);
  385. return x;
  386. }
  387. long
  388. yylex1(void)
  389. {
  390. long yychar;
  391. long *t3p;
  392. int c;
  393. yychar = yylex();
  394. if(yychar <= 0) {
  395. c = yytok1[0];
  396. goto out;
  397. }
  398. if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) {
  399. c = yytok1[yychar];
  400. goto out;
  401. }
  402. if(yychar >= YYPRIVATE)
  403. if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) {
  404. c = yytok2[yychar-YYPRIVATE];
  405. goto out;
  406. }
  407. for(t3p=yytok3;; t3p+=2) {
  408. c = t3p[0];
  409. if(c == yychar) {
  410. c = t3p[1];
  411. goto out;
  412. }
  413. if(c == 0)
  414. break;
  415. }
  416. c = 0;
  417. out:
  418. if(c == 0)
  419. c = yytok2[1]; /* unknown char */
  420. if(yydebug >= 3)
  421. printf("lex %.4X %s\n", yychar, yytokname(c));
  422. return c;
  423. }
  424. int
  425. yyparse(void)
  426. {
  427. struct
  428. {
  429. YYSTYPE yyv;
  430. int yys;
  431. } yys[YYMAXDEPTH], *yyp, *yypt;
  432. short *yyxi;
  433. int yyj, yym, yystate, yyn, yyg;
  434. YYSTYPE save1, save2;
  435. int save3, save4;
  436. long yychar;
  437. save1 = yylval;
  438. save2 = yyval;
  439. save3 = yynerrs;
  440. save4 = yyerrflag;
  441. yystate = 0;
  442. yychar = -1;
  443. yynerrs = 0;
  444. yyerrflag = 0;
  445. yyp = &yys[-1];
  446. goto yystack;
  447. ret0:
  448. yyn = 0;
  449. goto ret;
  450. ret1:
  451. yyn = 1;
  452. goto ret;
  453. ret:
  454. yylval = save1;
  455. yyval = save2;
  456. yynerrs = save3;
  457. yyerrflag = save4;
  458. return yyn;
  459. yystack:
  460. /* put a state and value onto the stack */
  461. if(yydebug >= 4)
  462. printf("char %s in %s", yytokname(yychar), yystatname(yystate));
  463. yyp++;
  464. if(yyp >= &yys[YYMAXDEPTH]) {
  465. yyerror("yacc stack overflow");
  466. goto ret1;
  467. }
  468. yyp->yys = yystate;
  469. yyp->yyv = yyval;
  470. yynewstate:
  471. yyn = yypact[yystate];
  472. if(yyn <= YYFLAG)
  473. goto yydefault; /* simple state */
  474. if(yychar < 0)
  475. yychar = yylex1();
  476. yyn += yychar;
  477. if(yyn < 0 || yyn >= YYLAST)
  478. goto yydefault;
  479. yyn = yyact[yyn];
  480. if(yychk[yyn] == yychar) { /* valid shift */
  481. yychar = -1;
  482. yyval = yylval;
  483. yystate = yyn;
  484. if(yyerrflag > 0)
  485. yyerrflag--;
  486. goto yystack;
  487. }
  488. yydefault:
  489. /* default state action */
  490. yyn = yydef[yystate];
  491. if(yyn == -2) {
  492. if(yychar < 0)
  493. yychar = yylex1();
  494. /* look through exception table */
  495. for(yyxi=yyexca;; yyxi+=2)
  496. if(yyxi[0] == -1 && yyxi[1] == yystate)
  497. break;
  498. for(yyxi += 2;; yyxi += 2) {
  499. yyn = yyxi[0];
  500. if(yyn < 0 || yyn == yychar)
  501. break;
  502. }
  503. yyn = yyxi[1];
  504. if(yyn < 0)
  505. goto ret0;
  506. }
  507. if(yyn == 0) {
  508. /* error ... attempt to resume parsing */
  509. switch(yyerrflag) {
  510. case 0: /* brand new error */
  511. yyerror("syntax error");
  512. if(yydebug >= 1) {
  513. printf("%s", yystatname(yystate));
  514. printf("saw %s\n", yytokname(yychar));
  515. }
  516. yyerrlab:
  517. yynerrs++;
  518. case 1:
  519. case 2: /* incompletely recovered error ... try again */
  520. yyerrflag = 3;
  521. /* find a state where "error" is a legal shift action */
  522. while(yyp >= yys) {
  523. yyn = yypact[yyp->yys] + YYERRCODE;
  524. if(yyn >= 0 && yyn < YYLAST) {
  525. yystate = yyact[yyn]; /* simulate a shift of "error" */
  526. if(yychk[yystate] == YYERRCODE)
  527. goto yystack;
  528. }
  529. /* the current yyp has no shift onn "error", pop stack */
  530. if(yydebug >= 2)
  531. printf("error recovery pops state %d, uncovers %d\n",
  532. yyp->yys, (yyp-1)->yys );
  533. yyp--;
  534. }
  535. /* there is no state on the stack with an error shift ... abort */
  536. goto ret1;
  537. case 3: /* no shift yet; clobber input char */
  538. if(yydebug >= YYEOFCODE)
  539. printf("error recovery discards %s\n", yytokname(yychar));
  540. if(yychar == YYEOFCODE)
  541. goto ret1;
  542. yychar = -1;
  543. goto yynewstate; /* try again in the same state */
  544. }
  545. }
  546. /* reduction by production yyn */
  547. if(yydebug >= 2)
  548. printf("reduce %d in:\n\t%s", yyn, yystatname(yystate));
  549. yypt = yyp;
  550. yyp -= yyr2[yyn];
  551. yyval = (yyp+1)->yyv;
  552. yym = yyn;
  553. /* consult goto table to find next state */
  554. yyn = yyr1[yyn];
  555. yyg = yypgo[yyn];
  556. yyj = yyg + yyp->yys + 1;
  557. if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
  558. yystate = yyact[yyg];
  559. switch(yym) {
  560. case 5:
  561. #line 48 "/sys/src/ape/cmd/make/gram.y"
  562. {
  563. while( --nlefts >= 0)
  564. {
  565. wildp wp;
  566. leftp = lefts[nlefts];
  567. if(wp = iswild(leftp->namep))
  568. {
  569. leftp->septype = SOMEDEPS;
  570. if(lastwild)
  571. lastwild->next = wp;
  572. else
  573. firstwild = wp;
  574. lastwild = wp;
  575. }
  576. if(leftp->septype == 0)
  577. leftp->septype = sepc;
  578. else if(leftp->septype != sepc)
  579. {
  580. if(! wp)
  581. fprintf(stderr,
  582. "Inconsistent rules lines for `%s'\n",
  583. leftp->namep);
  584. }
  585. else if(sepc==ALLDEPS && leftp->namep[0]!='.' && yypt[-0].yyv.yshblock!=0)
  586. {
  587. for(lp=leftp->linep; lp->nxtlineblock; lp=lp->nxtlineblock)
  588. if(lp->shp)
  589. fprintf(stderr,
  590. "Multiple rules lines for `%s'\n",
  591. leftp->namep);
  592. }
  593. lp = ALLOC(lineblock);
  594. lp->nxtlineblock = NULL;
  595. lp->depp = yypt[-1].yyv.ydepblock;
  596. lp->shp = yypt[-0].yyv.yshblock;
  597. if(wp)
  598. wp->linep = lp;
  599. if(equal(leftp->namep, ".SUFFIXES") && yypt[-1].yyv.ydepblock==0)
  600. leftp->linep = 0;
  601. else if(leftp->linep == 0)
  602. leftp->linep = lp;
  603. else {
  604. for(lpp = leftp->linep; lpp->nxtlineblock;
  605. lpp = lpp->nxtlineblock) ;
  606. if(sepc==ALLDEPS && leftp->namep[0]=='.')
  607. lpp->shp = 0;
  608. lpp->nxtlineblock = lp;
  609. }
  610. }
  611. } break;
  612. case 7:
  613. #line 105 "/sys/src/ape/cmd/make/gram.y"
  614. { lefts[0] = yypt[-0].yyv.ynameblock; nlefts = 1; } break;
  615. case 8:
  616. #line 106 "/sys/src/ape/cmd/make/gram.y"
  617. { lefts[nlefts++] = yypt[-0].yyv.ynameblock;
  618. if(nlefts>=NLEFTS) fatal("Too many lefts"); } break;
  619. case 9:
  620. #line 111 "/sys/src/ape/cmd/make/gram.y"
  621. {
  622. char junk[100];
  623. sprintf(junk, "%s:%d", filestack[ninclude-1].fname, yylineno);
  624. fatal1("Must be a separator on rules line %s", junk);
  625. } break;
  626. case 11:
  627. #line 119 "/sys/src/ape/cmd/make/gram.y"
  628. { prevdep = 0; yyval.ydepblock = 0; allnowait = NO; } break;
  629. case 12:
  630. #line 120 "/sys/src/ape/cmd/make/gram.y"
  631. { prevdep = 0; yyval.ydepblock = 0; allnowait = YES; } break;
  632. case 13:
  633. #line 121 "/sys/src/ape/cmd/make/gram.y"
  634. {
  635. pp = ALLOC(depblock);
  636. pp->nxtdepblock = NULL;
  637. pp->depname = yypt[-0].yyv.ynameblock;
  638. pp->nowait = allnowait;
  639. if(prevdep == 0) yyval.ydepblock = pp;
  640. else prevdep->nxtdepblock = pp;
  641. prevdep = pp;
  642. } break;
  643. case 14:
  644. #line 130 "/sys/src/ape/cmd/make/gram.y"
  645. { if(prevdep) prevdep->nowait = YES; } break;
  646. case 16:
  647. #line 134 "/sys/src/ape/cmd/make/gram.y"
  648. { sepc = ALLDEPS; } break;
  649. case 17:
  650. #line 135 "/sys/src/ape/cmd/make/gram.y"
  651. { sepc = SOMEDEPS; } break;
  652. case 18:
  653. #line 138 "/sys/src/ape/cmd/make/gram.y"
  654. {yyval.yshblock = 0; } break;
  655. case 19:
  656. #line 139 "/sys/src/ape/cmd/make/gram.y"
  657. { yyval.yshblock = yypt[-0].yyv.yshblock; } break;
  658. case 20:
  659. #line 142 "/sys/src/ape/cmd/make/gram.y"
  660. { yyval.yshblock = yypt[-0].yyv.yshblock; prevshp = yypt[-0].yyv.yshblock; } break;
  661. case 21:
  662. #line 143 "/sys/src/ape/cmd/make/gram.y"
  663. { yyval.yshblock = yypt[-1].yyv.yshblock;
  664. prevshp->nxtshblock = yypt[-0].yyv.yshblock;
  665. prevshp = yypt[-0].yyv.yshblock;
  666. } break;
  667. }
  668. goto yystack; /* stack new state and value */
  669. }