home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / unix / volume26 / byacc19 / part01 < prev    next >
Encoding:
Text File  |  1993-07-04  |  98.3 KB  |  4,730 lines

  1. Newsgroups: comp.sources.unix
  2. From: robert.corbett@eng.Sun.COM (Roger Corbett)
  3. Subject: v26i289: byacc-1.9 - Berkeley YACC, Part01/03
  4. Sender: unix-sources-moderator@gw.home.vix.com
  5. Approved: vixie@gw.home.vix.com
  6.  
  7. Submitted-By: robert.corbett@eng.Sun.COM (Roger Corbett)
  8. Posting-Number: Volume 26, Issue 289
  9. Archive-Name: byacc-1.9/part01
  10.  
  11. [ byacc is "Berkeley YACC", written by the same person who originally did
  12.   "bison".  byacc is smaller, simpler, and faster than bison; it also
  13.   generates smaller and faster parsers than bison.  It is the standard
  14.   "yacc" distributed with BSD/386 and other Net-2 descendents as well as
  15.   4.4BSD.  Needless to say, it contains no AT&T/USL code.  It is completely
  16.   compatible with AT&T Yacc's documentation, though it does not neccessarily
  17.   implement any UNdocumented features of AT&T Yacc.
  18.  
  19.   I made a small patch, with permission from the author; see CSU.diffs.  
  20.   This patch is already applied; I included it only for reference.  It fixes
  21.   a small bit of lint that ANSI/Posix cares about that older systems didn't.
  22.  
  23.   This is another piece of the 4.4BSD release which is being released here
  24.   since it isn't covered by the U C Regents license (it wasn't done at or
  25.   funded through CSRG, but is rather a contribution to BSD from outside UCB).
  26.   If you must know, I happened to see it while grabbing "db-1.6" from UCB,
  27.   and Keith Bostic said "sure, go ahead and post them both."
  28.  
  29.   --vix ]
  30.   
  31. #! /bin/sh
  32. # This is a shell archive.  Remove anything before this line, then unpack
  33. # it by saving it into a file and typing "sh file".  To overwrite existing
  34. # files, type "sh file -c".  You can also feed this as standard input via
  35. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  36. # will see the following message at the end:
  37. #        "End of archive 1 (of 3)."
  38. # Contents:  ACKNOWLEDGEMENTS CSU.diffs MANIFEST Makefile NEW_FEATURES
  39. #   NOTES NO_WARRANTY README closure.c defs.h error.c lalr.c lr0.c
  40. #   main.c mkpar.c skeleton.c symtab.c test test/error.output
  41. #   test/error.tab.c test/error.tab.h test/error.y test/ftp.tab.h
  42. #   verbose.c warshall.c yacc.1
  43. # Wrapped by vixie@gw.home.vix.com on Mon Jul  5 19:23:02 1993
  44. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  45. if test -f 'ACKNOWLEDGEMENTS' -a "${1}" != "-c" ; then 
  46.   echo shar: Will not clobber existing file \"'ACKNOWLEDGEMENTS'\"
  47. else
  48. echo shar: Extracting \"'ACKNOWLEDGEMENTS'\" \(771 characters\)
  49. sed "s/^X//" >'ACKNOWLEDGEMENTS' <<'END_OF_FILE'
  50. X     Berkeley Yacc owes much to the unflagging efforts of Keith Bostic.
  51. XHis badgering kept me working on it long after I was ready to quit.
  52. X
  53. X     Berkeley Yacc is based on the excellent algorithm for computing LALR(1)
  54. Xlookaheads developed by Tom Pennello and Frank DeRemer.  The algorithm is
  55. Xdescribed in their almost impenetrable article in TOPLAS 4,4.
  56. X
  57. X     Finally, much of the credit for the latest version must go to those
  58. Xwho pointed out deficiencies of my earlier releases.  Among the most
  59. Xprolific contributors were
  60. X
  61. X      Benson I. Margulies
  62. X      Dave Gentzel
  63. X      Antoine Verheijen
  64. X      Peter S. Housel
  65. X      Dale Smith
  66. X      Ozan Yigit
  67. X      John Campbell
  68. X      Bill Sommerfeld
  69. X      Paul Hilfinger
  70. X      Gary Bridgewater
  71. X      Dave Bakken
  72. X      Dan Lanciani
  73. X      Richard Sargent
  74. X      Parag Patel
  75. END_OF_FILE
  76. if test 771 -ne `wc -c <'ACKNOWLEDGEMENTS'`; then
  77.     echo shar: \"'ACKNOWLEDGEMENTS'\" unpacked with wrong size!
  78. fi
  79. # end of 'ACKNOWLEDGEMENTS'
  80. fi
  81. if test -f 'CSU.diffs' -a "${1}" != "-c" ; then 
  82.   echo shar: Will not clobber existing file \"'CSU.diffs'\"
  83. else
  84. echo shar: Extracting \"'CSU.diffs'\" \(224 characters\)
  85. sed "s/^X//" >'CSU.diffs' <<'END_OF_FILE'
  86. X*** main.c.orig    Mon Jul  5 18:47:51 1993
  87. X--- main.c    Mon Jul  5 19:18:46 1993
  88. X***************
  89. X*** 72,76 ****
  90. X  
  91. X  
  92. X! onintr()
  93. X  {
  94. X      done(1);
  95. X--- 72,78 ----
  96. X  
  97. X  
  98. X! void
  99. X! onintr(signo)
  100. X!     int signo;
  101. X  {
  102. X      done(1);
  103. END_OF_FILE
  104. if test 224 -ne `wc -c <'CSU.diffs'`; then
  105.     echo shar: \"'CSU.diffs'\" unpacked with wrong size!
  106. fi
  107. # end of 'CSU.diffs'
  108. fi
  109. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  110.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  111. else
  112. echo shar: Extracting \"'MANIFEST'\" \(1075 characters\)
  113. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  114. X   File Name        Archive #    Description
  115. X-----------------------------------------------------------
  116. X ACKNOWLEDGEMENTS           1    
  117. X CSU.diffs                  1    
  118. X MANIFEST                   1    This shipping list
  119. X Makefile                   1    
  120. X NEW_FEATURES               1    
  121. X NOTES                      1    
  122. X NO_WARRANTY                1    
  123. X README                     1    
  124. X closure.c                  1    
  125. X defs.h                     1    
  126. X error.c                    1    
  127. X lalr.c                     1    
  128. X lr0.c                      1    
  129. X main.c                     1    
  130. X mkpar.c                    1    
  131. X output.c                   2    
  132. X reader.c                   3    
  133. X skeleton.c                 1    
  134. X symtab.c                   1    
  135. X test                       1    
  136. X test/error.output          1    
  137. X test/error.tab.c           1    
  138. X test/error.tab.h           1    
  139. X test/error.y               1    
  140. X test/ftp.output            2    
  141. X test/ftp.tab.c             3    
  142. X test/ftp.tab.h             1    
  143. X test/ftp.y                 2    
  144. X verbose.c                  1    
  145. X warshall.c                 1    
  146. X yacc.1                     1    
  147. END_OF_FILE
  148. if test 1075 -ne `wc -c <'MANIFEST'`; then
  149.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  150. fi
  151. # end of 'MANIFEST'
  152. fi
  153. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  154.   echo shar: Will not clobber existing file \"'Makefile'\"
  155. else
  156. echo shar: Extracting \"'Makefile'\" \(1294 characters\)
  157. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  158. XDEST          = .
  159. X
  160. XHDRS          = defs.h
  161. X
  162. XCFLAGS          = -O -DNDEBUG
  163. X
  164. XLDFLAGS          =
  165. X
  166. XLIBS          =
  167. X
  168. XLINKER          = cc
  169. X
  170. XMAKEFILE      = Makefile
  171. X
  172. XOBJS          = closure.o \
  173. X        error.o \
  174. X        lalr.o \
  175. X        lr0.o \
  176. X        main.o \
  177. X        mkpar.o \
  178. X        output.o \
  179. X        reader.o \
  180. X        skeleton.o \
  181. X        symtab.o \
  182. X        verbose.o \
  183. X        warshall.o
  184. X
  185. XPRINT          = pr -f -l88
  186. X
  187. XPROGRAM          = yacc
  188. X
  189. XSRCS          = closure.c \
  190. X        error.c \
  191. X        lalr.c \
  192. X        lr0.c \
  193. X        main.c \
  194. X        mkpar.c \
  195. X        output.c \
  196. X        reader.c \
  197. X        skeleton.c \
  198. X        symtab.c \
  199. X        verbose.c \
  200. X        warshall.c
  201. X
  202. Xall:        $(PROGRAM)
  203. X
  204. X$(PROGRAM):     $(OBJS) $(LIBS)
  205. X        @echo -n "Loading $(PROGRAM) ... "
  206. X        @$(LINKER) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
  207. X        @echo "done"
  208. X
  209. Xclean:;        @rm -f $(OBJS)
  210. X
  211. Xclobber:;    @rm -f $(OBJS) $(PROGRAM)
  212. X
  213. Xdepend:;    @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST)
  214. X
  215. Xindex:;        @ctags -wx $(HDRS) $(SRCS)
  216. X
  217. Xinstall:    $(PROGRAM)
  218. X        @echo Installing $(PROGRAM) in $(DEST)
  219. X        @install -s $(PROGRAM) $(DEST)
  220. X
  221. Xlisting:;    @$(PRINT) Makefile $(HDRS) $(SRCS) | lpr
  222. X
  223. Xlint:;        @lint $(SRCS)
  224. X
  225. Xprogram:        $(PROGRAM)
  226. X
  227. Xtags:           $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS)
  228. X
  229. X###
  230. Xclosure.o: defs.h
  231. Xerror.o: defs.h
  232. Xlalr.o: defs.h
  233. Xlr0.o: defs.h
  234. Xmain.o: defs.h
  235. Xmkpar.o: defs.h
  236. Xoutput.o: defs.h
  237. Xreader.o: defs.h
  238. Xskeleton.o: defs.h
  239. Xsymtab.o: defs.h
  240. Xverbose.o: defs.h
  241. Xwarshall.o: defs.h
  242. END_OF_FILE
  243. if test 1294 -ne `wc -c <'Makefile'`; then
  244.     echo shar: \"'Makefile'\" unpacked with wrong size!
  245. fi
  246. # end of 'Makefile'
  247. fi
  248. if test -f 'NEW_FEATURES' -a "${1}" != "-c" ; then 
  249.   echo shar: Will not clobber existing file \"'NEW_FEATURES'\"
  250. else
  251. echo shar: Extracting \"'NEW_FEATURES'\" \(2050 characters\)
  252. sed "s/^X//" >'NEW_FEATURES' <<'END_OF_FILE'
  253. X     The -r option has been implemented.  The -r option tells Yacc to
  254. Xput the read-only tables in y.tab.c and the code and variables in
  255. Xy.code.c.  Keith Bostic asked for this option so that :yyfix could be
  256. Xeliminated.
  257. X
  258. X     The -l and -t options have been implemented.  The -l option tells
  259. XYacc not to include #line directives in the code it produces.  The -t
  260. Xoption causes debugging code to be included in the compiled parser.
  261. X
  262. X     The code for error recovery has been changed to implement the same
  263. Xalgorithm as AT&T Yacc.  There will still be differences in the way
  264. Xerror recovery works because AT&T Yacc uses more default reductions
  265. Xthan Berkeley Yacc.
  266. X
  267. X     The environment variable TMPDIR determines the directory where
  268. Xtemporary files will be created.  If TMPDIR is defined, temporary files
  269. Xwill be created in the directory whose pathname is the value of TMPDIR.
  270. XBy default, temporary files are created in /tmp.
  271. X
  272. X     The keywords are now case-insensitive.  For example, %nonassoc,
  273. X%NONASSOC, %NonAssoc, and %nOnAsSoC are all equivalent.
  274. X
  275. X     Commas and semicolons that are not part of C code are treated as
  276. Xcommentary.
  277. X
  278. X     Line-end comments, as in BCPL, are permitted.  Line-end comments
  279. Xbegin with // and end at the next end-of-line.  Line-end comments are
  280. Xpermitted in C code; they are converted to C comments on output.
  281. X
  282. X     The form of y.output files has been changed to look more like
  283. Xthose produced by AT&T Yacc.
  284. X
  285. X     A new kind of declaration has been added.  The form of the declaration
  286. Xis
  287. X
  288. X      %ident string
  289. X
  290. Xwhere string is a sequence of characters begining with a double quote
  291. Xand ending with either a double quote or the next end-of-line, whichever
  292. Xcomes first.  The declaration will cause a #ident directive to be written
  293. Xnear the start of the output file.
  294. X
  295. X     If a parser has been compiled with debugging code, that code can be
  296. Xenabled by setting an environment variable.  If the environment variable
  297. XYYDEBUG is set to 0, debugging output is suppressed.  If it is set to 1,
  298. Xdebugging output is written to standard output.
  299. END_OF_FILE
  300. if test 2050 -ne `wc -c <'NEW_FEATURES'`; then
  301.     echo shar: \"'NEW_FEATURES'\" unpacked with wrong size!
  302. fi
  303. # end of 'NEW_FEATURES'
  304. fi
  305. if test -f 'NOTES' -a "${1}" != "-c" ; then 
  306.   echo shar: Will not clobber existing file \"'NOTES'\"
  307. else
  308. echo shar: Extracting \"'NOTES'\" \(504 characters\)
  309. sed "s/^X//" >'NOTES' <<'END_OF_FILE'
  310. XBerkeley Yacc reflects its origins.  The reason so many routines
  311. Xuse exactly six register variables is that Berkeley Yacc was
  312. Xdeveloped on a VAX using PCC.  PCC placed at most six variables
  313. Xin registers.  I went to considerable effort to find which six
  314. Xvariables most belonged in registers.  Changes in machines and
  315. Xcompilers make that effort worthless, perhaps even harmful.
  316. X
  317. XThe code contains many instances where address calculations are
  318. Xperformed in particular ways to optimize the code for the VAX.
  319. END_OF_FILE
  320. if test 504 -ne `wc -c <'NOTES'`; then
  321.     echo shar: \"'NOTES'\" unpacked with wrong size!
  322. fi
  323. # end of 'NOTES'
  324. fi
  325. if test -f 'NO_WARRANTY' -a "${1}" != "-c" ; then 
  326.   echo shar: Will not clobber existing file \"'NO_WARRANTY'\"
  327. else
  328. echo shar: Extracting \"'NO_WARRANTY'\" \(156 characters\)
  329. sed "s/^X//" >'NO_WARRANTY' <<'END_OF_FILE'
  330. X     Berkeley Yacc is distributed with no warranty whatever.  The author
  331. Xand any other contributors take no responsibility for the consequences of
  332. Xits use.
  333. END_OF_FILE
  334. if test 156 -ne `wc -c <'NO_WARRANTY'`; then
  335.     echo shar: \"'NO_WARRANTY'\" unpacked with wrong size!
  336. fi
  337. # end of 'NO_WARRANTY'
  338. fi
  339. if test -f 'README' -a "${1}" != "-c" ; then 
  340.   echo shar: Will not clobber existing file \"'README'\"
  341. else
  342. echo shar: Extracting \"'README'\" \(1152 characters\)
  343. sed "s/^X//" >'README' <<'END_OF_FILE'
  344. X    Berkeley Yacc is an LALR(1) parser generator.  Berkeley Yacc has been made
  345. Xas compatible as possible with AT&T Yacc.  Berkeley Yacc can accept any input
  346. Xspecification that conforms to the AT&T Yacc documentation.  Specifications
  347. Xthat take advantage of undocumented features of AT&T Yacc will probably be
  348. Xrejected.
  349. X
  350. X    Berkeley Yacc is distributed with no warranty whatever.  The code is certain
  351. Xto contain errors.  Neither the author nor any contributor takes responsibility
  352. Xfor any consequences of its use.
  353. X
  354. X    Berkeley Yacc is in the public domain.  The data structures and algorithms
  355. Xused in Berkeley Yacc are all either taken from documents available to the
  356. Xgeneral public or are inventions of the author.  Anyone may freely distribute
  357. Xsource or binary forms of Berkeley Yacc whether unchanged or modified.
  358. XDistributers may charge whatever fees they can obtain for Berkeley Yacc.
  359. XPrograms generated by Berkeley Yacc may be distributed freely.
  360. X
  361. X    Please report bugs to
  362. X
  363. X            robert.corbett@eng.Sun.COM
  364. X
  365. XInclude a small example if possible.  Please include the banner string from
  366. Xskeleton.c with the bug report.  Do not expect rapid responses.
  367. END_OF_FILE
  368. if test 1152 -ne `wc -c <'README'`; then
  369.     echo shar: \"'README'\" unpacked with wrong size!
  370. fi
  371. # end of 'README'
  372. fi
  373. if test -f 'closure.c' -a "${1}" != "-c" ; then 
  374.   echo shar: Will not clobber existing file \"'closure.c'\"
  375. else
  376. echo shar: Extracting \"'closure.c'\" \(4275 characters\)
  377. sed "s/^X//" >'closure.c' <<'END_OF_FILE'
  378. X#include "defs.h"
  379. X
  380. Xshort *itemset;
  381. Xshort *itemsetend;
  382. Xunsigned *ruleset;
  383. X
  384. Xstatic unsigned *first_derives;
  385. Xstatic unsigned *EFF;
  386. X
  387. X
  388. Xset_EFF()
  389. X{
  390. X    register unsigned *row;
  391. X    register int symbol;
  392. X    register short *sp;
  393. X    register int rowsize;
  394. X    register int i;
  395. X    register int rule;
  396. X
  397. X    rowsize = WORDSIZE(nvars);
  398. X    EFF = NEW2(nvars * rowsize, unsigned);
  399. X
  400. X    row = EFF;
  401. X    for (i = start_symbol; i < nsyms; i++)
  402. X    {
  403. X    sp = derives[i];
  404. X    for (rule = *sp; rule > 0; rule = *++sp)
  405. X    {
  406. X        symbol = ritem[rrhs[rule]];
  407. X        if (ISVAR(symbol))
  408. X        {
  409. X        symbol -= start_symbol;
  410. X        SETBIT(row, symbol);
  411. X        }
  412. X    }
  413. X    row += rowsize;
  414. X    }
  415. X
  416. X    reflexive_transitive_closure(EFF, nvars);
  417. X
  418. X#ifdef    DEBUG
  419. X    print_EFF();
  420. X#endif
  421. X}
  422. X
  423. X
  424. Xset_first_derives()
  425. X{
  426. X    register unsigned *rrow;
  427. X    register unsigned *vrow;
  428. X    register int j;
  429. X    register unsigned k;
  430. X    register unsigned cword;
  431. X    register short *rp;
  432. X
  433. X    int rule;
  434. X    int i;
  435. X    int rulesetsize;
  436. X    int varsetsize;
  437. X
  438. X    rulesetsize = WORDSIZE(nrules);
  439. X    varsetsize = WORDSIZE(nvars);
  440. X    first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize;
  441. X
  442. X    set_EFF();
  443. X
  444. X    rrow = first_derives + ntokens * rulesetsize;
  445. X    for (i = start_symbol; i < nsyms; i++)
  446. X    {
  447. X    vrow = EFF + ((i - ntokens) * varsetsize);
  448. X    k = BITS_PER_WORD;
  449. X    for (j = start_symbol; j < nsyms; k++, j++)
  450. X    {
  451. X        if (k >= BITS_PER_WORD)
  452. X        {
  453. X        cword = *vrow++;
  454. X        k = 0;
  455. X        }
  456. X
  457. X        if (cword & (1 << k))
  458. X        {
  459. X        rp = derives[j];
  460. X        while ((rule = *rp++) >= 0)
  461. X        {
  462. X            SETBIT(rrow, rule);
  463. X        }
  464. X        }
  465. X    }
  466. X
  467. X    vrow += varsetsize;
  468. X    rrow += rulesetsize;
  469. X    }
  470. X
  471. X#ifdef    DEBUG
  472. X    print_first_derives();
  473. X#endif
  474. X
  475. X    FREE(EFF);
  476. X}
  477. X
  478. X
  479. Xclosure(nucleus, n)
  480. Xshort *nucleus;
  481. Xint n;
  482. X{
  483. X    register int ruleno;
  484. X    register unsigned word;
  485. X    register unsigned i;
  486. X    register short *csp;
  487. X    register unsigned *dsp;
  488. X    register unsigned *rsp;
  489. X    register int rulesetsize;
  490. X
  491. X    short *csend;
  492. X    unsigned *rsend;
  493. X    int symbol;
  494. X    int itemno;
  495. X
  496. X    rulesetsize = WORDSIZE(nrules);
  497. X    rsp = ruleset;
  498. X    rsend = ruleset + rulesetsize;
  499. X    for (rsp = ruleset; rsp < rsend; rsp++)
  500. X    *rsp = 0;
  501. X
  502. X    csend = nucleus + n;
  503. X    for (csp = nucleus; csp < csend; ++csp)
  504. X    {
  505. X    symbol = ritem[*csp];
  506. X    if (ISVAR(symbol))
  507. X    {
  508. X        dsp = first_derives + symbol * rulesetsize;
  509. X        rsp = ruleset;
  510. X        while (rsp < rsend)
  511. X        *rsp++ |= *dsp++;
  512. X    }
  513. X    }
  514. X
  515. X    ruleno = 0;
  516. X    itemsetend = itemset;
  517. X    csp = nucleus;
  518. X    for (rsp = ruleset; rsp < rsend; ++rsp)
  519. X    {
  520. X    word = *rsp;
  521. X    if (word)
  522. X    {
  523. X        for (i = 0; i < BITS_PER_WORD; ++i)
  524. X        {
  525. X        if (word & (1 << i))
  526. X        {
  527. X            itemno = rrhs[ruleno+i];
  528. X            while (csp < csend && *csp < itemno)
  529. X            *itemsetend++ = *csp++;
  530. X            *itemsetend++ = itemno;
  531. X            while (csp < csend && *csp == itemno)
  532. X            ++csp;
  533. X        }
  534. X        }
  535. X    }
  536. X    ruleno += BITS_PER_WORD;
  537. X    }
  538. X
  539. X    while (csp < csend)
  540. X    *itemsetend++ = *csp++;
  541. X
  542. X#ifdef    DEBUG
  543. X  print_closure(n);
  544. X#endif
  545. X}
  546. X
  547. X
  548. X
  549. Xfinalize_closure()
  550. X{
  551. X  FREE(itemset);
  552. X  FREE(ruleset);
  553. X  FREE(first_derives + ntokens * WORDSIZE(nrules));
  554. X}
  555. X
  556. X
  557. X#ifdef    DEBUG
  558. X
  559. Xprint_closure(n)
  560. Xint n;
  561. X{
  562. X  register short *isp;
  563. X
  564. X  printf("\n\nn = %d\n\n", n);
  565. X  for (isp = itemset; isp < itemsetend; isp++)
  566. X    printf("   %d\n", *isp);
  567. X}
  568. X
  569. X
  570. Xprint_EFF()
  571. X{
  572. X    register int i, j;
  573. X    register unsigned *rowp;
  574. X    register unsigned word;
  575. X    register unsigned k;
  576. X
  577. X    printf("\n\nEpsilon Free Firsts\n");
  578. X
  579. X    for (i = start_symbol; i < nsyms; i++)
  580. X    {
  581. X    printf("\n%s", symbol_name[i]);
  582. X    rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars));
  583. X    word = *rowp++;
  584. X
  585. X    k = BITS_PER_WORD;
  586. X    for (j = 0; j < nvars; k++, j++)
  587. X    {
  588. X        if (k >= BITS_PER_WORD)
  589. X        {
  590. X        word = *rowp++;
  591. X        k = 0;
  592. X        }
  593. X
  594. X        if (word & (1 << k))
  595. X        printf("  %s", symbol_name[start_symbol + j]);
  596. X    }
  597. X    }
  598. X}
  599. X
  600. X
  601. Xprint_first_derives()
  602. X{
  603. X    register int i;
  604. X    register int j;
  605. X    register unsigned *rp;
  606. X    register unsigned cword;
  607. X    register unsigned k;
  608. X
  609. X    printf("\n\n\nFirst Derives\n");
  610. X
  611. X    for (i = start_symbol; i < nsyms; i++)
  612. X    {
  613. X    printf("\n%s derives\n", symbol_name[i]);
  614. X    rp = first_derives + i * WORDSIZE(nrules);
  615. X    k = BITS_PER_WORD;
  616. X    for (j = 0; j <= nrules; k++, j++)
  617. X        {
  618. X      if (k >= BITS_PER_WORD)
  619. X      {
  620. X          cword = *rp++;
  621. X          k = 0;
  622. X      }
  623. X
  624. X      if (cword & (1 << k))
  625. X        printf("   %d\n", j);
  626. X    }
  627. X    }
  628. X
  629. X  fflush(stdout);
  630. X}
  631. X
  632. X#endif
  633. END_OF_FILE
  634. if test 4275 -ne `wc -c <'closure.c'`; then
  635.     echo shar: \"'closure.c'\" unpacked with wrong size!
  636. fi
  637. # end of 'closure.c'
  638. fi
  639. if test -f 'defs.h' -a "${1}" != "-c" ; then 
  640.   echo shar: Will not clobber existing file \"'defs.h'\"
  641. else
  642. echo shar: Extracting \"'defs.h'\" \(5937 characters\)
  643. sed "s/^X//" >'defs.h' <<'END_OF_FILE'
  644. X#include <assert.h>
  645. X#include <ctype.h>
  646. X#include <stdio.h>
  647. X
  648. X
  649. X/*  machine-dependent definitions            */
  650. X/*  the following definitions are for the Tahoe        */
  651. X/*  they might have to be changed for other machines    */
  652. X
  653. X/*  MAXCHAR is the largest unsigned character value    */
  654. X/*  MAXSHORT is the largest value of a C short        */
  655. X/*  MINSHORT is the most negative value of a C short    */
  656. X/*  MAXTABLE is the maximum table size            */
  657. X/*  BITS_PER_WORD is the number of bits in a C unsigned    */
  658. X/*  WORDSIZE computes the number of words needed to    */
  659. X/*    store n bits                    */
  660. X/*  BIT returns the value of the n-th bit starting    */
  661. X/*    from r (0-indexed)                */
  662. X/*  SETBIT sets the n-th bit starting from r        */
  663. X
  664. X#define    MAXCHAR        255
  665. X#define    MAXSHORT    32767
  666. X#define MINSHORT    -32768
  667. X#define MAXTABLE    32500
  668. X#define BITS_PER_WORD    32
  669. X#define    WORDSIZE(n)    (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD)
  670. X#define    BIT(r, n)    ((((r)[(n)>>5])>>((n)&31))&1)
  671. X#define    SETBIT(r, n)    ((r)[(n)>>5]|=((unsigned)1<<((n)&31)))
  672. X
  673. X
  674. X/*  character names  */
  675. X
  676. X#define    NUL        '\0'    /*  the null character  */
  677. X#define    NEWLINE        '\n'    /*  line feed  */
  678. X#define    SP        ' '     /*  space  */
  679. X#define    BS        '\b'    /*  backspace  */
  680. X#define    HT        '\t'    /*  horizontal tab  */
  681. X#define    VT        '\013'  /*  vertical tab  */
  682. X#define    CR        '\r'    /*  carriage return  */
  683. X#define    FF        '\f'    /*  form feed  */
  684. X#define    QUOTE        '\''    /*  single quote  */
  685. X#define    DOUBLE_QUOTE    '\"'    /*  double quote  */
  686. X#define    BACKSLASH    '\\'    /*  backslash  */
  687. X
  688. X
  689. X/* defines for constructing filenames */
  690. X
  691. X#define CODE_SUFFIX    ".code.c"
  692. X#define    DEFINES_SUFFIX    ".tab.h"
  693. X#define    OUTPUT_SUFFIX    ".tab.c"
  694. X#define    VERBOSE_SUFFIX    ".output"
  695. X
  696. X
  697. X/* keyword codes */
  698. X
  699. X#define TOKEN 0
  700. X#define LEFT 1
  701. X#define RIGHT 2
  702. X#define NONASSOC 3
  703. X#define MARK 4
  704. X#define TEXT 5
  705. X#define TYPE 6
  706. X#define START 7
  707. X#define UNION 8
  708. X#define IDENT 9
  709. X
  710. X
  711. X/*  symbol classes  */
  712. X
  713. X#define UNKNOWN 0
  714. X#define TERM 1
  715. X#define NONTERM 2
  716. X
  717. X
  718. X/*  the undefined value  */
  719. X
  720. X#define UNDEFINED (-1)
  721. X
  722. X
  723. X/*  action codes  */
  724. X
  725. X#define SHIFT 1
  726. X#define REDUCE 2
  727. X
  728. X
  729. X/*  character macros  */
  730. X
  731. X#define IS_IDENT(c)    (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$')
  732. X#define    IS_OCTAL(c)    ((c) >= '0' && (c) <= '7')
  733. X#define    NUMERIC_VALUE(c)    ((c) - '0')
  734. X
  735. X
  736. X/*  symbol macros  */
  737. X
  738. X#define ISTOKEN(s)    ((s) < start_symbol)
  739. X#define ISVAR(s)    ((s) >= start_symbol)
  740. X
  741. X
  742. X/*  storage allocation macros  */
  743. X
  744. X#define CALLOC(k,n)    (calloc((unsigned)(k),(unsigned)(n)))
  745. X#define    FREE(x)        (free((char*)(x)))
  746. X#define MALLOC(n)    (malloc((unsigned)(n)))
  747. X#define    NEW(t)        ((t*)allocate(sizeof(t)))
  748. X#define    NEW2(n,t)    ((t*)allocate((unsigned)((n)*sizeof(t))))
  749. X#define REALLOC(p,n)    (realloc((char*)(p),(unsigned)(n)))
  750. X
  751. X
  752. X/*  the structure of a symbol table entry  */
  753. X
  754. Xtypedef struct bucket bucket;
  755. Xstruct bucket
  756. X{
  757. X    struct bucket *link;
  758. X    struct bucket *next;
  759. X    char *name;
  760. X    char *tag;
  761. X    short value;
  762. X    short index;
  763. X    short prec;
  764. X    char class;
  765. X    char assoc;
  766. X};
  767. X
  768. X
  769. X/*  the structure of the LR(0) state machine  */
  770. X
  771. Xtypedef struct core core;
  772. Xstruct core
  773. X{
  774. X    struct core *next;
  775. X    struct core *link;
  776. X    short number;
  777. X    short accessing_symbol;
  778. X    short nitems;
  779. X    short items[1];
  780. X};
  781. X
  782. X
  783. X/*  the structure used to record shifts  */
  784. X
  785. Xtypedef struct shifts shifts;
  786. Xstruct shifts
  787. X{
  788. X    struct shifts *next;
  789. X    short number;
  790. X    short nshifts;
  791. X    short shift[1];
  792. X};
  793. X
  794. X
  795. X/*  the structure used to store reductions  */
  796. X
  797. Xtypedef struct reductions reductions;
  798. Xstruct reductions
  799. X{
  800. X    struct reductions *next;
  801. X    short number;
  802. X    short nreds;
  803. X    short rules[1];
  804. X};
  805. X
  806. X
  807. X/*  the structure used to represent parser actions  */
  808. X
  809. Xtypedef struct action action;
  810. Xstruct action
  811. X{
  812. X    struct action *next;
  813. X    short symbol;
  814. X    short number;
  815. X    short prec;
  816. X    char action_code;
  817. X    char assoc;
  818. X    char suppressed;
  819. X};
  820. X
  821. X
  822. X/* global variables */
  823. X
  824. Xextern char dflag;
  825. Xextern char lflag;
  826. Xextern char rflag;
  827. Xextern char tflag;
  828. Xextern char vflag;
  829. Xextern char *symbol_prefix;
  830. X
  831. Xextern char *myname;
  832. Xextern char *cptr;
  833. Xextern char *line;
  834. Xextern int lineno;
  835. Xextern int outline;
  836. X
  837. Xextern char *banner[];
  838. Xextern char *tables[];
  839. Xextern char *header[];
  840. Xextern char *body[];
  841. Xextern char *trailer[];
  842. X
  843. Xextern char *action_file_name;
  844. Xextern char *code_file_name;
  845. Xextern char *defines_file_name;
  846. Xextern char *input_file_name;
  847. Xextern char *output_file_name;
  848. Xextern char *text_file_name;
  849. Xextern char *union_file_name;
  850. Xextern char *verbose_file_name;
  851. X
  852. Xextern FILE *action_file;
  853. Xextern FILE *code_file;
  854. Xextern FILE *defines_file;
  855. Xextern FILE *input_file;
  856. Xextern FILE *output_file;
  857. Xextern FILE *text_file;
  858. Xextern FILE *union_file;
  859. Xextern FILE *verbose_file;
  860. X
  861. Xextern int nitems;
  862. Xextern int nrules;
  863. Xextern int nsyms;
  864. Xextern int ntokens;
  865. Xextern int nvars;
  866. Xextern int ntags;
  867. X
  868. Xextern char unionized;
  869. Xextern char line_format[];
  870. X
  871. Xextern int   start_symbol;
  872. Xextern char  **symbol_name;
  873. Xextern short *symbol_value;
  874. Xextern short *symbol_prec;
  875. Xextern char  *symbol_assoc;
  876. X
  877. Xextern short *ritem;
  878. Xextern short *rlhs;
  879. Xextern short *rrhs;
  880. Xextern short *rprec;
  881. Xextern char  *rassoc;
  882. X
  883. Xextern short **derives;
  884. Xextern char *nullable;
  885. X
  886. Xextern bucket *first_symbol;
  887. Xextern bucket *last_symbol;
  888. X
  889. Xextern int nstates;
  890. Xextern core *first_state;
  891. Xextern shifts *first_shift;
  892. Xextern reductions *first_reduction;
  893. Xextern short *accessing_symbol;
  894. Xextern core **state_table;
  895. Xextern shifts **shift_table;
  896. Xextern reductions **reduction_table;
  897. Xextern unsigned *LA;
  898. Xextern short *LAruleno;
  899. Xextern short *lookaheads;
  900. Xextern short *goto_map;
  901. Xextern short *from_state;
  902. Xextern short *to_state;
  903. X
  904. Xextern action **parser;
  905. Xextern int SRtotal;
  906. Xextern int RRtotal;
  907. Xextern short *SRconflicts;
  908. Xextern short *RRconflicts;
  909. Xextern short *defred;
  910. Xextern short *rules_used;
  911. Xextern short nunused;
  912. Xextern short final_state;
  913. X
  914. X/* global functions */
  915. X
  916. Xextern char *allocate();
  917. Xextern bucket *lookup();
  918. Xextern bucket *make_bucket();
  919. X
  920. X
  921. X/* system variables */
  922. X
  923. Xextern int errno;
  924. X
  925. X
  926. X/* system functions */
  927. X
  928. Xextern void free();
  929. Xextern char *calloc();
  930. Xextern char *malloc();
  931. Xextern char *realloc();
  932. Xextern char *strcpy();
  933. END_OF_FILE
  934. if test 5937 -ne `wc -c <'defs.h'`; then
  935.     echo shar: \"'defs.h'\" unpacked with wrong size!
  936. fi
  937. # end of 'defs.h'
  938. fi
  939. if test -f 'error.c' -a "${1}" != "-c" ; then 
  940.   echo shar: Will not clobber existing file \"'error.c'\"
  941. else
  942. echo shar: Extracting \"'error.c'\" \(6051 characters\)
  943. sed "s/^X//" >'error.c' <<'END_OF_FILE'
  944. X/* routines for printing error messages  */
  945. X
  946. X#include "defs.h"
  947. X
  948. X
  949. Xfatal(msg)
  950. Xchar *msg;
  951. X{
  952. X    fprintf(stderr, "%s: f - %s\n", myname, msg);
  953. X    done(2);
  954. X}
  955. X
  956. X
  957. Xno_space()
  958. X{
  959. X    fprintf(stderr, "%s: f - out of space\n", myname);
  960. X    done(2);
  961. X}
  962. X
  963. X
  964. Xopen_error(filename)
  965. Xchar *filename;
  966. X{
  967. X    fprintf(stderr, "%s: f - cannot open \"%s\"\n", myname, filename);
  968. X    done(2);
  969. X}
  970. X
  971. X
  972. Xunexpected_EOF()
  973. X{
  974. X    fprintf(stderr, "%s: e - line %d of \"%s\", unexpected end-of-file\n",
  975. X        myname, lineno, input_file_name);
  976. X    done(1);
  977. X}
  978. X
  979. X
  980. Xprint_pos(st_line, st_cptr)
  981. Xchar *st_line;
  982. Xchar *st_cptr;
  983. X{
  984. X    register char *s;
  985. X
  986. X    if (st_line == 0) return;
  987. X    for (s = st_line; *s != '\n'; ++s)
  988. X    {
  989. X    if (isprint(*s) || *s == '\t')
  990. X        putc(*s, stderr);
  991. X    else
  992. X        putc('?', stderr);
  993. X    }
  994. X    putc('\n', stderr);
  995. X    for (s = st_line; s < st_cptr; ++s)
  996. X    {
  997. X    if (*s == '\t')
  998. X        putc('\t', stderr);
  999. X    else
  1000. X        putc(' ', stderr);
  1001. X    }
  1002. X    putc('^', stderr);
  1003. X    putc('\n', stderr);
  1004. X}
  1005. X
  1006. X
  1007. Xsyntax_error(st_lineno, st_line, st_cptr)
  1008. Xint st_lineno;
  1009. Xchar *st_line;
  1010. Xchar *st_cptr;
  1011. X{
  1012. X    fprintf(stderr, "%s: e - line %d of \"%s\", syntax error\n",
  1013. X        myname, st_lineno, input_file_name);
  1014. X    print_pos(st_line, st_cptr);
  1015. X    done(1);
  1016. X}
  1017. X
  1018. X
  1019. Xunterminated_comment(c_lineno, c_line, c_cptr)
  1020. Xint c_lineno;
  1021. Xchar *c_line;
  1022. Xchar *c_cptr;
  1023. X{
  1024. X    fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n",
  1025. X        myname, c_lineno, input_file_name);
  1026. X    print_pos(c_line, c_cptr);
  1027. X    done(1);
  1028. X}
  1029. X
  1030. X
  1031. Xunterminated_string(s_lineno, s_line, s_cptr)
  1032. Xint s_lineno;
  1033. Xchar *s_line;
  1034. Xchar *s_cptr;
  1035. X{
  1036. X    fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n",
  1037. X        myname, s_lineno, input_file_name);
  1038. X    print_pos(s_line, s_cptr);
  1039. X    done(1);
  1040. X}
  1041. X
  1042. X
  1043. Xunterminated_text(t_lineno, t_line, t_cptr)
  1044. Xint t_lineno;
  1045. Xchar *t_line;
  1046. Xchar *t_cptr;
  1047. X{
  1048. X    fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n",
  1049. X        myname, t_lineno, input_file_name);
  1050. X    print_pos(t_line, t_cptr);
  1051. X    done(1);
  1052. X}
  1053. X
  1054. X
  1055. Xunterminated_union(u_lineno, u_line, u_cptr)
  1056. Xint u_lineno;
  1057. Xchar *u_line;
  1058. Xchar *u_cptr;
  1059. X{
  1060. X    fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \
  1061. Xdeclaration\n", myname, u_lineno, input_file_name);
  1062. X    print_pos(u_line, u_cptr);
  1063. X    done(1);
  1064. X}
  1065. X
  1066. X
  1067. Xover_unionized(u_cptr)
  1068. Xchar *u_cptr;
  1069. X{
  1070. X    fprintf(stderr, "%s: e - line %d of \"%s\", too many %%union \
  1071. Xdeclarations\n", myname, lineno, input_file_name);
  1072. X    print_pos(line, u_cptr);
  1073. X    done(1);
  1074. X}
  1075. X
  1076. X
  1077. Xillegal_tag(t_lineno, t_line, t_cptr)
  1078. Xint t_lineno;
  1079. Xchar *t_line;
  1080. Xchar *t_cptr;
  1081. X{
  1082. X    fprintf(stderr, "%s: e - line %d of \"%s\", illegal tag\n",
  1083. X        myname, t_lineno, input_file_name);
  1084. X    print_pos(t_line, t_cptr);
  1085. X    done(1);
  1086. X}
  1087. X
  1088. X
  1089. Xillegal_character(c_cptr)
  1090. Xchar *c_cptr;
  1091. X{
  1092. X    fprintf(stderr, "%s: e - line %d of \"%s\", illegal character\n",
  1093. X        myname, lineno, input_file_name);
  1094. X    print_pos(line, c_cptr);
  1095. X    done(1);
  1096. X}
  1097. X
  1098. X
  1099. Xused_reserved(s)
  1100. Xchar *s;
  1101. X{
  1102. X    fprintf(stderr, "%s: e - line %d of \"%s\", illegal use of reserved symbol \
  1103. X%s\n", myname, lineno, input_file_name, s);
  1104. X    done(1);
  1105. X}
  1106. X
  1107. X
  1108. Xtokenized_start(s)
  1109. Xchar *s;
  1110. X{
  1111. X     fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s cannot be \
  1112. Xdeclared to be a token\n", myname, lineno, input_file_name, s);
  1113. X     done(1);
  1114. X}
  1115. X
  1116. X
  1117. Xretyped_warning(s)
  1118. Xchar *s;
  1119. X{
  1120. X    fprintf(stderr, "%s: w - line %d of \"%s\", the type of %s has been \
  1121. Xredeclared\n", myname, lineno, input_file_name, s);
  1122. X}
  1123. X
  1124. X
  1125. Xreprec_warning(s)
  1126. Xchar *s;
  1127. X{
  1128. X    fprintf(stderr, "%s: w - line %d of \"%s\", the precedence of %s has been \
  1129. Xredeclared\n", myname, lineno, input_file_name, s);
  1130. X}
  1131. X
  1132. X
  1133. Xrevalued_warning(s)
  1134. Xchar *s;
  1135. X{
  1136. X    fprintf(stderr, "%s: w - line %d of \"%s\", the value of %s has been \
  1137. Xredeclared\n", myname, lineno, input_file_name, s);
  1138. X}
  1139. X
  1140. X
  1141. Xterminal_start(s)
  1142. Xchar *s;
  1143. X{
  1144. X    fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s is a \
  1145. Xtoken\n", myname, lineno, input_file_name, s);
  1146. X    done(1);
  1147. X}
  1148. X
  1149. X
  1150. Xrestarted_warning()
  1151. X{
  1152. X    fprintf(stderr, "%s: w - line %d of \"%s\", the start symbol has been \
  1153. Xredeclared\n", myname, lineno, input_file_name);
  1154. X}
  1155. X
  1156. X
  1157. Xno_grammar()
  1158. X{
  1159. X    fprintf(stderr, "%s: e - line %d of \"%s\", no grammar has been \
  1160. Xspecified\n", myname, lineno, input_file_name);
  1161. X    done(1);
  1162. X}
  1163. X
  1164. X
  1165. Xterminal_lhs(s_lineno)
  1166. Xint s_lineno;
  1167. X{
  1168. X    fprintf(stderr, "%s: e - line %d of \"%s\", a token appears on the lhs \
  1169. Xof a production\n", myname, s_lineno, input_file_name);
  1170. X    done(1);
  1171. X}
  1172. X
  1173. X
  1174. Xprec_redeclared()
  1175. X{
  1176. X    fprintf(stderr, "%s: w - line %d of  \"%s\", conflicting %%prec \
  1177. Xspecifiers\n", myname, lineno, input_file_name);
  1178. X}
  1179. X
  1180. X
  1181. Xunterminated_action(a_lineno, a_line, a_cptr)
  1182. Xint a_lineno;
  1183. Xchar *a_line;
  1184. Xchar *a_cptr;
  1185. X{
  1186. X    fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n",
  1187. X        myname, a_lineno, input_file_name);
  1188. X    print_pos(a_line, a_cptr);
  1189. X    done(1);
  1190. X}
  1191. X
  1192. X
  1193. Xdollar_warning(a_lineno, i)
  1194. Xint a_lineno;
  1195. Xint i;
  1196. X{
  1197. X    fprintf(stderr, "%s: w - line %d of \"%s\", $%d references beyond the \
  1198. Xend of the current rule\n", myname, a_lineno, input_file_name, i);
  1199. X}
  1200. X
  1201. X
  1202. Xdollar_error(a_lineno, a_line, a_cptr)
  1203. Xint a_lineno;
  1204. Xchar *a_line;
  1205. Xchar *a_cptr;
  1206. X{
  1207. X    fprintf(stderr, "%s: e - line %d of \"%s\", illegal $-name\n",
  1208. X        myname, a_lineno, input_file_name);
  1209. X    print_pos(a_line, a_cptr);
  1210. X    done(1);
  1211. X}
  1212. X
  1213. X
  1214. Xuntyped_lhs()
  1215. X{
  1216. X    fprintf(stderr, "%s: e - line %d of \"%s\", $$ is untyped\n",
  1217. X        myname, lineno, input_file_name);
  1218. X    done(1);
  1219. X}
  1220. X
  1221. X
  1222. Xuntyped_rhs(i, s)
  1223. Xint i;
  1224. Xchar *s;
  1225. X{
  1226. X    fprintf(stderr, "%s: e - line %d of \"%s\", $%d (%s) is untyped\n",
  1227. X        myname, lineno, input_file_name, i, s);
  1228. X    done(1);
  1229. X}
  1230. X
  1231. X
  1232. Xunknown_rhs(i)
  1233. Xint i;
  1234. X{
  1235. X    fprintf(stderr, "%s: e - line %d of \"%s\", $%d is untyped\n",
  1236. X        myname, lineno, input_file_name, i);
  1237. X    done(1);
  1238. X}
  1239. X
  1240. X
  1241. Xdefault_action_warning()
  1242. X{
  1243. X    fprintf(stderr, "%s: w - line %d of \"%s\", the default action assigns an \
  1244. Xundefined value to $$\n", myname, lineno, input_file_name);
  1245. X}
  1246. X
  1247. X
  1248. Xundefined_goal(s)
  1249. Xchar *s;
  1250. X{
  1251. X    fprintf(stderr, "%s: e - the start symbol %s is undefined\n", myname, s);
  1252. X    done(1);
  1253. X}
  1254. X
  1255. X
  1256. Xundefined_symbol_warning(s)
  1257. Xchar *s;
  1258. X{
  1259. X    fprintf(stderr, "%s: w - the symbol %s is undefined\n", myname, s);
  1260. X}
  1261. END_OF_FILE
  1262. if test 6051 -ne `wc -c <'error.c'`; then
  1263.     echo shar: \"'error.c'\" unpacked with wrong size!
  1264. fi
  1265. # end of 'error.c'
  1266. fi
  1267. if test -f 'lalr.c' -a "${1}" != "-c" ; then 
  1268.   echo shar: Will not clobber existing file \"'lalr.c'\"
  1269. else
  1270. echo shar: Extracting \"'lalr.c'\" \(10213 characters\)
  1271. sed "s/^X//" >'lalr.c' <<'END_OF_FILE'
  1272. X#include "defs.h"
  1273. X
  1274. Xtypedef
  1275. X  struct shorts
  1276. X    {
  1277. X      struct shorts *next;
  1278. X      short value;
  1279. X    }
  1280. X  shorts;
  1281. X
  1282. Xint tokensetsize;
  1283. Xshort *lookaheads;
  1284. Xshort *LAruleno;
  1285. Xunsigned *LA;
  1286. Xshort *accessing_symbol;
  1287. Xcore **state_table;
  1288. Xshifts **shift_table;
  1289. Xreductions **reduction_table;
  1290. Xshort *goto_map;
  1291. Xshort *from_state;
  1292. Xshort *to_state;
  1293. X
  1294. Xshort **transpose();
  1295. X
  1296. Xstatic int infinity;
  1297. Xstatic int maxrhs;
  1298. Xstatic int ngotos;
  1299. Xstatic unsigned *F;
  1300. Xstatic short **includes;
  1301. Xstatic shorts **lookback;
  1302. Xstatic short **R;
  1303. Xstatic short *INDEX;
  1304. Xstatic short *VERTICES;
  1305. Xstatic int top;
  1306. X
  1307. X
  1308. Xlalr()
  1309. X{
  1310. X    tokensetsize = WORDSIZE(ntokens);
  1311. X
  1312. X    set_state_table();
  1313. X    set_accessing_symbol();
  1314. X    set_shift_table();
  1315. X    set_reduction_table();
  1316. X    set_maxrhs();
  1317. X    initialize_LA();
  1318. X    set_goto_map();
  1319. X    initialize_F();
  1320. X    build_relations();
  1321. X    compute_FOLLOWS();
  1322. X    compute_lookaheads();
  1323. X}
  1324. X
  1325. X
  1326. X
  1327. Xset_state_table()
  1328. X{
  1329. X    register core *sp;
  1330. X
  1331. X    state_table = NEW2(nstates, core *);
  1332. X    for (sp = first_state; sp; sp = sp->next)
  1333. X    state_table[sp->number] = sp;
  1334. X}
  1335. X
  1336. X
  1337. X
  1338. Xset_accessing_symbol()
  1339. X{
  1340. X    register core *sp;
  1341. X
  1342. X    accessing_symbol = NEW2(nstates, short);
  1343. X    for (sp = first_state; sp; sp = sp->next)
  1344. X    accessing_symbol[sp->number] = sp->accessing_symbol;
  1345. X}
  1346. X
  1347. X
  1348. X
  1349. Xset_shift_table()
  1350. X{
  1351. X    register shifts *sp;
  1352. X
  1353. X    shift_table = NEW2(nstates, shifts *);
  1354. X    for (sp = first_shift; sp; sp = sp->next)
  1355. X    shift_table[sp->number] = sp;
  1356. X}
  1357. X
  1358. X
  1359. X
  1360. Xset_reduction_table()
  1361. X{
  1362. X    register reductions *rp;
  1363. X
  1364. X    reduction_table = NEW2(nstates, reductions *);
  1365. X    for (rp = first_reduction; rp; rp = rp->next)
  1366. X    reduction_table[rp->number] = rp;
  1367. X}
  1368. X
  1369. X
  1370. X
  1371. Xset_maxrhs()
  1372. X{
  1373. X  register short *itemp;
  1374. X  register short *item_end;
  1375. X  register int length;
  1376. X  register int max;
  1377. X
  1378. X  length = 0;
  1379. X  max = 0;
  1380. X  item_end = ritem + nitems;
  1381. X  for (itemp = ritem; itemp < item_end; itemp++)
  1382. X    {
  1383. X      if (*itemp >= 0)
  1384. X    {
  1385. X      length++;
  1386. X    }
  1387. X      else
  1388. X    {
  1389. X      if (length > max) max = length;
  1390. X      length = 0;
  1391. X    }
  1392. X    }
  1393. X
  1394. X  maxrhs = max;
  1395. X}
  1396. X
  1397. X
  1398. X
  1399. Xinitialize_LA()
  1400. X{
  1401. X  register int i, j, k;
  1402. X  register reductions *rp;
  1403. X
  1404. X  lookaheads = NEW2(nstates + 1, short);
  1405. X
  1406. X  k = 0;
  1407. X  for (i = 0; i < nstates; i++)
  1408. X    {
  1409. X      lookaheads[i] = k;
  1410. X      rp = reduction_table[i];
  1411. X      if (rp)
  1412. X    k += rp->nreds;
  1413. X    }
  1414. X  lookaheads[nstates] = k;
  1415. X
  1416. X  LA = NEW2(k * tokensetsize, unsigned);
  1417. X  LAruleno = NEW2(k, short);
  1418. X  lookback = NEW2(k, shorts *);
  1419. X
  1420. X  k = 0;
  1421. X  for (i = 0; i < nstates; i++)
  1422. X    {
  1423. X      rp = reduction_table[i];
  1424. X      if (rp)
  1425. X    {
  1426. X      for (j = 0; j < rp->nreds; j++)
  1427. X        {
  1428. X          LAruleno[k] = rp->rules[j];
  1429. X          k++;
  1430. X        }
  1431. X    }
  1432. X    }
  1433. X}
  1434. X
  1435. X
  1436. Xset_goto_map()
  1437. X{
  1438. X  register shifts *sp;
  1439. X  register int i;
  1440. X  register int symbol;
  1441. X  register int k;
  1442. X  register short *temp_map;
  1443. X  register int state2;
  1444. X  register int state1;
  1445. X
  1446. X  goto_map = NEW2(nvars + 1, short) - ntokens;
  1447. X  temp_map = NEW2(nvars + 1, short) - ntokens;
  1448. X
  1449. X  ngotos = 0;
  1450. X  for (sp = first_shift; sp; sp = sp->next)
  1451. X    {
  1452. X      for (i = sp->nshifts - 1; i >= 0; i--)
  1453. X    {
  1454. X      symbol = accessing_symbol[sp->shift[i]];
  1455. X
  1456. X      if (ISTOKEN(symbol)) break;
  1457. X
  1458. X      if (ngotos == MAXSHORT)
  1459. X        fatal("too many gotos");
  1460. X
  1461. X      ngotos++;
  1462. X      goto_map[symbol]++;
  1463. X        }
  1464. X    }
  1465. X
  1466. X  k = 0;
  1467. X  for (i = ntokens; i < nsyms; i++)
  1468. X    {
  1469. X      temp_map[i] = k;
  1470. X      k += goto_map[i];
  1471. X    }
  1472. X
  1473. X  for (i = ntokens; i < nsyms; i++)
  1474. X    goto_map[i] = temp_map[i];
  1475. X
  1476. X  goto_map[nsyms] = ngotos;
  1477. X  temp_map[nsyms] = ngotos;
  1478. X
  1479. X  from_state = NEW2(ngotos, short);
  1480. X  to_state = NEW2(ngotos, short);
  1481. X
  1482. X  for (sp = first_shift; sp; sp = sp->next)
  1483. X    {
  1484. X      state1 = sp->number;
  1485. X      for (i = sp->nshifts - 1; i >= 0; i--)
  1486. X    {
  1487. X      state2 = sp->shift[i];
  1488. X      symbol = accessing_symbol[state2];
  1489. X
  1490. X      if (ISTOKEN(symbol)) break;
  1491. X
  1492. X      k = temp_map[symbol]++;
  1493. X      from_state[k] = state1;
  1494. X      to_state[k] = state2;
  1495. X    }
  1496. X    }
  1497. X
  1498. X  FREE(temp_map + ntokens);
  1499. X}
  1500. X
  1501. X
  1502. X
  1503. X/*  Map_goto maps a state/symbol pair into its numeric representation.    */
  1504. X
  1505. Xint
  1506. Xmap_goto(state, symbol)
  1507. Xint state;
  1508. Xint symbol;
  1509. X{
  1510. X    register int high;
  1511. X    register int low;
  1512. X    register int middle;
  1513. X    register int s;
  1514. X
  1515. X    low = goto_map[symbol];
  1516. X    high = goto_map[symbol + 1];
  1517. X
  1518. X    for (;;)
  1519. X    {
  1520. X    assert(low <= high);
  1521. X    middle = (low + high) >> 1;
  1522. X    s = from_state[middle];
  1523. X    if (s == state)
  1524. X        return (middle);
  1525. X    else if (s < state)
  1526. X        low = middle + 1;
  1527. X    else
  1528. X        high = middle - 1;
  1529. X    }
  1530. X}
  1531. X
  1532. X
  1533. X
  1534. Xinitialize_F()
  1535. X{
  1536. X  register int i;
  1537. X  register int j;
  1538. X  register int k;
  1539. X  register shifts *sp;
  1540. X  register short *edge;
  1541. X  register unsigned *rowp;
  1542. X  register short *rp;
  1543. X  register short **reads;
  1544. X  register int nedges;
  1545. X  register int stateno;
  1546. X  register int symbol;
  1547. X  register int nwords;
  1548. X
  1549. X  nwords = ngotos * tokensetsize;
  1550. X  F = NEW2(nwords, unsigned);
  1551. X
  1552. X  reads = NEW2(ngotos, short *);
  1553. X  edge = NEW2(ngotos + 1, short);
  1554. X  nedges = 0;
  1555. X
  1556. X  rowp = F;
  1557. X  for (i = 0; i < ngotos; i++)
  1558. X    {
  1559. X      stateno = to_state[i];
  1560. X      sp = shift_table[stateno];
  1561. X
  1562. X      if (sp)
  1563. X    {
  1564. X      k = sp->nshifts;
  1565. X
  1566. X      for (j = 0; j < k; j++)
  1567. X        {
  1568. X          symbol = accessing_symbol[sp->shift[j]];
  1569. X          if (ISVAR(symbol))
  1570. X        break;
  1571. X          SETBIT(rowp, symbol);
  1572. X        }
  1573. X
  1574. X      for (; j < k; j++)
  1575. X        {
  1576. X          symbol = accessing_symbol[sp->shift[j]];
  1577. X          if (nullable[symbol])
  1578. X        edge[nedges++] = map_goto(stateno, symbol);
  1579. X        }
  1580. X    
  1581. X      if (nedges)
  1582. X        {
  1583. X          reads[i] = rp = NEW2(nedges + 1, short);
  1584. X
  1585. X          for (j = 0; j < nedges; j++)
  1586. X        rp[j] = edge[j];
  1587. X
  1588. X          rp[nedges] = -1;
  1589. X          nedges = 0;
  1590. X        }
  1591. X    }
  1592. X
  1593. X      rowp += tokensetsize;
  1594. X    }
  1595. X
  1596. X  SETBIT(F, 0);
  1597. X  digraph(reads);
  1598. X
  1599. X  for (i = 0; i < ngotos; i++)
  1600. X    {
  1601. X      if (reads[i])
  1602. X    FREE(reads[i]);
  1603. X    }
  1604. X
  1605. X  FREE(reads);
  1606. X  FREE(edge);
  1607. X}
  1608. X
  1609. X
  1610. X
  1611. Xbuild_relations()
  1612. X{
  1613. X  register int i;
  1614. X  register int j;
  1615. X  register int k;
  1616. X  register short *rulep;
  1617. X  register short *rp;
  1618. X  register shifts *sp;
  1619. X  register int length;
  1620. X  register int nedges;
  1621. X  register int done;
  1622. X  register int state1;
  1623. X  register int stateno;
  1624. X  register int symbol1;
  1625. X  register int symbol2;
  1626. X  register short *shortp;
  1627. X  register short *edge;
  1628. X  register short *states;
  1629. X  register short **new_includes;
  1630. X
  1631. X  includes = NEW2(ngotos, short *);
  1632. X  edge = NEW2(ngotos + 1, short);
  1633. X  states = NEW2(maxrhs + 1, short);
  1634. X
  1635. X  for (i = 0; i < ngotos; i++)
  1636. X    {
  1637. X      nedges = 0;
  1638. X      state1 = from_state[i];
  1639. X      symbol1 = accessing_symbol[to_state[i]];
  1640. X
  1641. X      for (rulep = derives[symbol1]; *rulep >= 0; rulep++)
  1642. X    {
  1643. X      length = 1;
  1644. X      states[0] = state1;
  1645. X      stateno = state1;
  1646. X
  1647. X      for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++)
  1648. X        {
  1649. X          symbol2 = *rp;
  1650. X          sp = shift_table[stateno];
  1651. X          k = sp->nshifts;
  1652. X
  1653. X          for (j = 0; j < k; j++)
  1654. X        {
  1655. X          stateno = sp->shift[j];
  1656. X          if (accessing_symbol[stateno] == symbol2) break;
  1657. X        }
  1658. X
  1659. X          states[length++] = stateno;
  1660. X        }
  1661. X
  1662. X      add_lookback_edge(stateno, *rulep, i);
  1663. X
  1664. X      length--;
  1665. X      done = 0;
  1666. X      while (!done)
  1667. X        {
  1668. X          done = 1;
  1669. X          rp--;
  1670. X          if (ISVAR(*rp))
  1671. X        {
  1672. X          stateno = states[--length];
  1673. X          edge[nedges++] = map_goto(stateno, *rp);
  1674. X          if (nullable[*rp] && length > 0) done = 0;
  1675. X        }
  1676. X        }
  1677. X    }
  1678. X
  1679. X      if (nedges)
  1680. X    {
  1681. X      includes[i] = shortp = NEW2(nedges + 1, short);
  1682. X      for (j = 0; j < nedges; j++)
  1683. X        shortp[j] = edge[j];
  1684. X      shortp[nedges] = -1;
  1685. X    }
  1686. X    }
  1687. X
  1688. X  new_includes = transpose(includes, ngotos);
  1689. X
  1690. X  for (i = 0; i < ngotos; i++)
  1691. X    if (includes[i])
  1692. X      FREE(includes[i]);
  1693. X
  1694. X  FREE(includes);
  1695. X
  1696. X  includes = new_includes;
  1697. X
  1698. X  FREE(edge);
  1699. X  FREE(states);
  1700. X}
  1701. X
  1702. X
  1703. Xadd_lookback_edge(stateno, ruleno, gotono)
  1704. Xint stateno, ruleno, gotono;
  1705. X{
  1706. X    register int i, k;
  1707. X    register int found;
  1708. X    register shorts *sp;
  1709. X
  1710. X    i = lookaheads[stateno];
  1711. X    k = lookaheads[stateno + 1];
  1712. X    found = 0;
  1713. X    while (!found && i < k)
  1714. X    {
  1715. X    if (LAruleno[i] == ruleno)
  1716. X        found = 1;
  1717. X    else
  1718. X        ++i;
  1719. X    }
  1720. X    assert(found);
  1721. X
  1722. X    sp = NEW(shorts);
  1723. X    sp->next = lookback[i];
  1724. X    sp->value = gotono;
  1725. X    lookback[i] = sp;
  1726. X}
  1727. X
  1728. X
  1729. X
  1730. Xshort **
  1731. Xtranspose(R, n)
  1732. Xshort **R;
  1733. Xint n;
  1734. X{
  1735. X  register short **new_R;
  1736. X  register short **temp_R;
  1737. X  register short *nedges;
  1738. X  register short *sp;
  1739. X  register int i;
  1740. X  register int k;
  1741. X
  1742. X  nedges = NEW2(n, short);
  1743. X
  1744. X  for (i = 0; i < n; i++)
  1745. X    {
  1746. X      sp = R[i];
  1747. X      if (sp)
  1748. X    {
  1749. X      while (*sp >= 0)
  1750. X        nedges[*sp++]++;
  1751. X    }
  1752. X    }
  1753. X
  1754. X  new_R = NEW2(n, short *);
  1755. X  temp_R = NEW2(n, short *);
  1756. X
  1757. X  for (i = 0; i < n; i++)
  1758. X    {
  1759. X      k = nedges[i];
  1760. X      if (k > 0)
  1761. X    {
  1762. X      sp = NEW2(k + 1, short);
  1763. X      new_R[i] = sp;
  1764. X      temp_R[i] = sp;
  1765. X      sp[k] = -1;
  1766. X    }
  1767. X    }
  1768. X
  1769. X  FREE(nedges);
  1770. X
  1771. X  for (i = 0; i < n; i++)
  1772. X    {
  1773. X      sp = R[i];
  1774. X      if (sp)
  1775. X    {
  1776. X      while (*sp >= 0)
  1777. X        *temp_R[*sp++]++ = i;
  1778. X    }
  1779. X    }
  1780. X
  1781. X  FREE(temp_R);
  1782. X
  1783. X  return (new_R);
  1784. X}
  1785. X
  1786. X
  1787. X
  1788. Xcompute_FOLLOWS()
  1789. X{
  1790. X  digraph(includes);
  1791. X}
  1792. X
  1793. X
  1794. Xcompute_lookaheads()
  1795. X{
  1796. X  register int i, n;
  1797. X  register unsigned *fp1, *fp2, *fp3;
  1798. X  register shorts *sp, *next;
  1799. X  register unsigned *rowp;
  1800. X
  1801. X  rowp = LA;
  1802. X  n = lookaheads[nstates];
  1803. X  for (i = 0; i < n; i++)
  1804. X    {
  1805. X      fp3 = rowp + tokensetsize;
  1806. X      for (sp = lookback[i]; sp; sp = sp->next)
  1807. X    {
  1808. X      fp1 = rowp;
  1809. X      fp2 = F + tokensetsize * sp->value;
  1810. X      while (fp1 < fp3)
  1811. X        *fp1++ |= *fp2++;
  1812. X    }
  1813. X      rowp = fp3;
  1814. X    }
  1815. X
  1816. X  for (i = 0; i < n; i++)
  1817. X    for (sp = lookback[i]; sp; sp = next)
  1818. X      {
  1819. X        next = sp->next;
  1820. X        FREE(sp);
  1821. X      }
  1822. X
  1823. X  FREE(lookback);
  1824. X  FREE(F);
  1825. X}
  1826. X
  1827. X
  1828. Xdigraph(relation)
  1829. Xshort **relation;
  1830. X{
  1831. X  register int i;
  1832. X
  1833. X  infinity = ngotos + 2;
  1834. X  INDEX = NEW2(ngotos + 1, short);
  1835. X  VERTICES = NEW2(ngotos + 1, short);
  1836. X  top = 0;
  1837. X
  1838. X  R = relation;
  1839. X
  1840. X  for (i = 0; i < ngotos; i++)
  1841. X    INDEX[i] = 0;
  1842. X
  1843. X  for (i = 0; i < ngotos; i++)
  1844. X    {
  1845. X      if (INDEX[i] == 0 && R[i])
  1846. X    traverse(i);
  1847. X    }
  1848. X
  1849. X  FREE(INDEX);
  1850. X  FREE(VERTICES);
  1851. X}
  1852. X
  1853. X
  1854. X
  1855. Xtraverse(i)
  1856. Xregister int i;
  1857. X{
  1858. X  register unsigned *fp1;
  1859. X  register unsigned *fp2;
  1860. X  register unsigned *fp3;
  1861. X  register int j;
  1862. X  register short *rp;
  1863. X
  1864. X  int height;
  1865. X  unsigned *base;
  1866. X
  1867. X  VERTICES[++top] = i;
  1868. X  INDEX[i] = height = top;
  1869. X
  1870. X  base = F + i * tokensetsize;
  1871. X  fp3 = base + tokensetsize;
  1872. X
  1873. X  rp = R[i];
  1874. X  if (rp)
  1875. X    {
  1876. X      while ((j = *rp++) >= 0)
  1877. X    {
  1878. X      if (INDEX[j] == 0)
  1879. X        traverse(j);
  1880. X
  1881. X      if (INDEX[i] > INDEX[j])
  1882. X        INDEX[i] = INDEX[j];
  1883. X
  1884. X      fp1 = base;
  1885. X      fp2 = F + j * tokensetsize;
  1886. X
  1887. X      while (fp1 < fp3)
  1888. X        *fp1++ |= *fp2++;
  1889. X    }
  1890. X    }
  1891. X
  1892. X  if (INDEX[i] == height)
  1893. X    {
  1894. X      for (;;)
  1895. X    {
  1896. X      j = VERTICES[top--];
  1897. X      INDEX[j] = infinity;
  1898. X
  1899. X      if (i == j)
  1900. X        break;
  1901. X
  1902. X      fp1 = base;
  1903. X      fp2 = F + j * tokensetsize;
  1904. X
  1905. X      while (fp1 < fp3)
  1906. X        *fp2++ = *fp1++;
  1907. X    }
  1908. X    }
  1909. X}
  1910. END_OF_FILE
  1911. if test 10213 -ne `wc -c <'lalr.c'`; then
  1912.     echo shar: \"'lalr.c'\" unpacked with wrong size!
  1913. fi
  1914. # end of 'lalr.c'
  1915. fi
  1916. if test -f 'lr0.c' -a "${1}" != "-c" ; then 
  1917.   echo shar: Will not clobber existing file \"'lr0.c'\"
  1918. else
  1919. echo shar: Extracting \"'lr0.c'\" \(9587 characters\)
  1920. sed "s/^X//" >'lr0.c' <<'END_OF_FILE'
  1921. X
  1922. X#include "defs.h"
  1923. X
  1924. Xextern short *itemset;
  1925. Xextern short *itemsetend;
  1926. Xextern unsigned *ruleset;
  1927. X
  1928. Xint nstates;
  1929. Xcore *first_state;
  1930. Xshifts *first_shift;
  1931. Xreductions *first_reduction;
  1932. X
  1933. Xint get_state();
  1934. Xcore *new_state();
  1935. X
  1936. Xstatic core **state_set;
  1937. Xstatic core *this_state;
  1938. Xstatic core *last_state;
  1939. Xstatic shifts *last_shift;
  1940. Xstatic reductions *last_reduction;
  1941. X
  1942. Xstatic int nshifts;
  1943. Xstatic short *shift_symbol;
  1944. X
  1945. Xstatic short *redset;
  1946. Xstatic short *shiftset;
  1947. X
  1948. Xstatic short **kernel_base;
  1949. Xstatic short **kernel_end;
  1950. Xstatic short *kernel_items;
  1951. X
  1952. X
  1953. Xallocate_itemsets()
  1954. X{
  1955. X    register short *itemp;
  1956. X    register short *item_end;
  1957. X    register int symbol;
  1958. X    register int i;
  1959. X    register int count;
  1960. X    register int max;
  1961. X    register short *symbol_count;
  1962. X
  1963. X    count = 0;
  1964. X    symbol_count = NEW2(nsyms, short);
  1965. X
  1966. X    item_end = ritem + nitems;
  1967. X    for (itemp = ritem; itemp < item_end; itemp++)
  1968. X    {
  1969. X    symbol = *itemp;
  1970. X    if (symbol >= 0)
  1971. X    {
  1972. X        count++;
  1973. X        symbol_count[symbol]++;
  1974. X    }
  1975. X    }
  1976. X
  1977. X    kernel_base = NEW2(nsyms, short *);
  1978. X    kernel_items = NEW2(count, short);
  1979. X
  1980. X    count = 0;
  1981. X    max = 0;
  1982. X    for (i = 0; i < nsyms; i++)
  1983. X    {
  1984. X    kernel_base[i] = kernel_items + count;
  1985. X    count += symbol_count[i];
  1986. X    if (max < symbol_count[i])
  1987. X        max = symbol_count[i];
  1988. X    }
  1989. X
  1990. X    shift_symbol = symbol_count;
  1991. X    kernel_end = NEW2(nsyms, short *);
  1992. X}
  1993. X
  1994. X
  1995. Xallocate_storage()
  1996. X{
  1997. X    allocate_itemsets();
  1998. X    shiftset = NEW2(nsyms, short);
  1999. X    redset = NEW2(nrules + 1, short);
  2000. X    state_set = NEW2(nitems, core *);
  2001. X}
  2002. X
  2003. X
  2004. Xappend_states()
  2005. X{
  2006. X    register int i;
  2007. X    register int j;
  2008. X    register int symbol;
  2009. X
  2010. X#ifdef    TRACE
  2011. X    fprintf(stderr, "Entering append_states()\n");
  2012. X#endif
  2013. X    for (i = 1; i < nshifts; i++)
  2014. X    {
  2015. X    symbol = shift_symbol[i];
  2016. X    j = i;
  2017. X    while (j > 0 && shift_symbol[j - 1] > symbol)
  2018. X    {
  2019. X        shift_symbol[j] = shift_symbol[j - 1];
  2020. X        j--;
  2021. X    }
  2022. X    shift_symbol[j] = symbol;
  2023. X    }
  2024. X
  2025. X    for (i = 0; i < nshifts; i++)
  2026. X    {
  2027. X    symbol = shift_symbol[i];
  2028. X    shiftset[i] = get_state(symbol);
  2029. X    }
  2030. X}
  2031. X
  2032. X
  2033. Xfree_storage()
  2034. X{
  2035. X    FREE(shift_symbol);
  2036. X    FREE(redset);
  2037. X    FREE(shiftset);
  2038. X    FREE(kernel_base);
  2039. X    FREE(kernel_end);
  2040. X    FREE(kernel_items);
  2041. X    FREE(state_set);
  2042. X}
  2043. X
  2044. X
  2045. X
  2046. Xgenerate_states()
  2047. X{
  2048. X    allocate_storage();
  2049. X    itemset = NEW2(nitems, short);
  2050. X    ruleset = NEW2(WORDSIZE(nrules), unsigned);
  2051. X    set_first_derives();
  2052. X    initialize_states();
  2053. X
  2054. X    while (this_state)
  2055. X    {
  2056. X    closure(this_state->items, this_state->nitems);
  2057. X    save_reductions();
  2058. X    new_itemsets();
  2059. X    append_states();
  2060. X
  2061. X    if (nshifts > 0)
  2062. X        save_shifts();
  2063. X
  2064. X    this_state = this_state->next;
  2065. X    }
  2066. X
  2067. X    finalize_closure();
  2068. X    free_storage();
  2069. X}
  2070. X
  2071. X
  2072. X
  2073. Xint
  2074. Xget_state(symbol)
  2075. Xint symbol;
  2076. X{
  2077. X    register int key;
  2078. X    register short *isp1;
  2079. X    register short *isp2;
  2080. X    register short *iend;
  2081. X    register core *sp;
  2082. X    register int found;
  2083. X    register int n;
  2084. X
  2085. X#ifdef    TRACE
  2086. X    fprintf(stderr, "Entering get_state(%d)\n", symbol);
  2087. X#endif
  2088. X
  2089. X    isp1 = kernel_base[symbol];
  2090. X    iend = kernel_end[symbol];
  2091. X    n = iend - isp1;
  2092. X
  2093. X    key = *isp1;
  2094. X    assert(0 <= key && key < nitems);
  2095. X    sp = state_set[key];
  2096. X    if (sp)
  2097. X    {
  2098. X    found = 0;
  2099. X    while (!found)
  2100. X    {
  2101. X        if (sp->nitems == n)
  2102. X        {
  2103. X        found = 1;
  2104. X        isp1 = kernel_base[symbol];
  2105. X        isp2 = sp->items;
  2106. X
  2107. X        while (found && isp1 < iend)
  2108. X        {
  2109. X            if (*isp1++ != *isp2++)
  2110. X            found = 0;
  2111. X        }
  2112. X        }
  2113. X
  2114. X        if (!found)
  2115. X        {
  2116. X        if (sp->link)
  2117. X        {
  2118. X            sp = sp->link;
  2119. X        }
  2120. X        else
  2121. X        {
  2122. X            sp = sp->link = new_state(symbol);
  2123. X            found = 1;
  2124. X        }
  2125. X        }
  2126. X    }
  2127. X    }
  2128. X    else
  2129. X    {
  2130. X    state_set[key] = sp = new_state(symbol);
  2131. X    }
  2132. X
  2133. X    return (sp->number);
  2134. X}
  2135. X
  2136. X
  2137. X
  2138. Xinitialize_states()
  2139. X{
  2140. X    register int i;
  2141. X    register short *start_derives;
  2142. X    register core *p;
  2143. X
  2144. X    start_derives = derives[start_symbol];
  2145. X    for (i = 0; start_derives[i] >= 0; ++i)
  2146. X    continue;
  2147. X
  2148. X    p = (core *) MALLOC(sizeof(core) + i*sizeof(short));
  2149. X    if (p == 0) no_space();
  2150. X
  2151. X    p->next = 0;
  2152. X    p->link = 0;
  2153. X    p->number = 0;
  2154. X    p->accessing_symbol = 0;
  2155. X    p->nitems = i;
  2156. X
  2157. X    for (i = 0;  start_derives[i] >= 0; ++i)
  2158. X    p->items[i] = rrhs[start_derives[i]];
  2159. X
  2160. X    first_state = last_state = this_state = p;
  2161. X    nstates = 1;
  2162. X}
  2163. X
  2164. X
  2165. Xnew_itemsets()
  2166. X{
  2167. X    register int i;
  2168. X    register int shiftcount;
  2169. X    register short *isp;
  2170. X    register short *ksp;
  2171. X    register int symbol;
  2172. X
  2173. X    for (i = 0; i < nsyms; i++)
  2174. X    kernel_end[i] = 0;
  2175. X
  2176. X    shiftcount = 0;
  2177. X    isp = itemset;
  2178. X    while (isp < itemsetend)
  2179. X    {
  2180. X    i = *isp++;
  2181. X    symbol = ritem[i];
  2182. X    if (symbol > 0)
  2183. X    {
  2184. X        ksp = kernel_end[symbol];
  2185. X        if (!ksp)
  2186. X        {
  2187. X        shift_symbol[shiftcount++] = symbol;
  2188. X        ksp = kernel_base[symbol];
  2189. X        }
  2190. X
  2191. X        *ksp++ = i + 1;
  2192. X        kernel_end[symbol] = ksp;
  2193. X    }
  2194. X    }
  2195. X
  2196. X    nshifts = shiftcount;
  2197. X}
  2198. X
  2199. X
  2200. X
  2201. Xcore *
  2202. Xnew_state(symbol)
  2203. Xint symbol;
  2204. X{
  2205. X    register int n;
  2206. X    register core *p;
  2207. X    register short *isp1;
  2208. X    register short *isp2;
  2209. X    register short *iend;
  2210. X
  2211. X#ifdef    TRACE
  2212. X    fprintf(stderr, "Entering new_state(%d)\n", symbol);
  2213. X#endif
  2214. X
  2215. X    if (nstates >= MAXSHORT)
  2216. X    fatal("too many states");
  2217. X
  2218. X    isp1 = kernel_base[symbol];
  2219. X    iend = kernel_end[symbol];
  2220. X    n = iend - isp1;
  2221. X
  2222. X    p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short)));
  2223. X    p->accessing_symbol = symbol;
  2224. X    p->number = nstates;
  2225. X    p->nitems = n;
  2226. X
  2227. X    isp2 = p->items;
  2228. X    while (isp1 < iend)
  2229. X    *isp2++ = *isp1++;
  2230. X
  2231. X    last_state->next = p;
  2232. X    last_state = p;
  2233. X
  2234. X    nstates++;
  2235. X
  2236. X    return (p);
  2237. X}
  2238. X
  2239. X
  2240. X/* show_cores is used for debugging */
  2241. X
  2242. Xshow_cores()
  2243. X{
  2244. X    core *p;
  2245. X    int i, j, k, n;
  2246. X    int itemno;
  2247. X
  2248. X    k = 0;
  2249. X    for (p = first_state; p; ++k, p = p->next)
  2250. X    {
  2251. X    if (k) printf("\n");
  2252. X    printf("state %d, number = %d, accessing symbol = %s\n",
  2253. X        k, p->number, symbol_name[p->accessing_symbol]);
  2254. X    n = p->nitems;
  2255. X    for (i = 0; i < n; ++i)
  2256. X    {
  2257. X        itemno = p->items[i];
  2258. X        printf("%4d  ", itemno);
  2259. X        j = itemno;
  2260. X        while (ritem[j] >= 0) ++j;
  2261. X        printf("%s :", symbol_name[rlhs[-ritem[j]]]);
  2262. X        j = rrhs[-ritem[j]];
  2263. X        while (j < itemno)
  2264. X        printf(" %s", symbol_name[ritem[j++]]);
  2265. X        printf(" .");
  2266. X        while (ritem[j] >= 0)
  2267. X        printf(" %s", symbol_name[ritem[j++]]);
  2268. X        printf("\n");
  2269. X        fflush(stdout);
  2270. X    }
  2271. X    }
  2272. X}
  2273. X
  2274. X
  2275. X/* show_ritems is used for debugging */
  2276. X
  2277. Xshow_ritems()
  2278. X{
  2279. X    int i;
  2280. X
  2281. X    for (i = 0; i < nitems; ++i)
  2282. X    printf("ritem[%d] = %d\n", i, ritem[i]);
  2283. X}
  2284. X
  2285. X
  2286. X/* show_rrhs is used for debugging */
  2287. Xshow_rrhs()
  2288. X{
  2289. X    int i;
  2290. X
  2291. X    for (i = 0; i < nrules; ++i)
  2292. X    printf("rrhs[%d] = %d\n", i, rrhs[i]);
  2293. X}
  2294. X
  2295. X
  2296. X/* show_shifts is used for debugging */
  2297. X
  2298. Xshow_shifts()
  2299. X{
  2300. X    shifts *p;
  2301. X    int i, j, k;
  2302. X
  2303. X    k = 0;
  2304. X    for (p = first_shift; p; ++k, p = p->next)
  2305. X    {
  2306. X    if (k) printf("\n");
  2307. X    printf("shift %d, number = %d, nshifts = %d\n", k, p->number,
  2308. X        p->nshifts);
  2309. X    j = p->nshifts;
  2310. X    for (i = 0; i < j; ++i)
  2311. X        printf("\t%d\n", p->shift[i]);
  2312. X    }
  2313. X}
  2314. X
  2315. X
  2316. Xsave_shifts()
  2317. X{
  2318. X    register shifts *p;
  2319. X    register short *sp1;
  2320. X    register short *sp2;
  2321. X    register short *send;
  2322. X
  2323. X    p = (shifts *) allocate((unsigned) (sizeof(shifts) +
  2324. X            (nshifts - 1) * sizeof(short)));
  2325. X
  2326. X    p->number = this_state->number;
  2327. X    p->nshifts = nshifts;
  2328. X
  2329. X    sp1 = shiftset;
  2330. X    sp2 = p->shift;
  2331. X    send = shiftset + nshifts;
  2332. X
  2333. X    while (sp1 < send)
  2334. X    *sp2++ = *sp1++;
  2335. X
  2336. X    if (last_shift)
  2337. X    {
  2338. X    last_shift->next = p;
  2339. X    last_shift = p;
  2340. X    }
  2341. X    else
  2342. X    {
  2343. X    first_shift = p;
  2344. X    last_shift = p;
  2345. X    }
  2346. X}
  2347. X
  2348. X
  2349. X
  2350. Xsave_reductions()
  2351. X{
  2352. X    register short *isp;
  2353. X    register short *rp1;
  2354. X    register short *rp2;
  2355. X    register int item;
  2356. X    register int count;
  2357. X    register reductions *p;
  2358. X    register short *rend;
  2359. X
  2360. X    count = 0;
  2361. X    for (isp = itemset; isp < itemsetend; isp++)
  2362. X    {
  2363. X    item = ritem[*isp];
  2364. X    if (item < 0)
  2365. X    {
  2366. X        redset[count++] = -item;
  2367. X    }
  2368. X    }
  2369. X
  2370. X    if (count)
  2371. X    {
  2372. X    p = (reductions *) allocate((unsigned) (sizeof(reductions) +
  2373. X                    (count - 1) * sizeof(short)));
  2374. X
  2375. X    p->number = this_state->number;
  2376. X    p->nreds = count;
  2377. X
  2378. X    rp1 = redset;
  2379. X    rp2 = p->rules;
  2380. X    rend = rp1 + count;
  2381. X
  2382. X    while (rp1 < rend)
  2383. X        *rp2++ = *rp1++;
  2384. X
  2385. X    if (last_reduction)
  2386. X    {
  2387. X        last_reduction->next = p;
  2388. X        last_reduction = p;
  2389. X    }
  2390. X    else
  2391. X    {
  2392. X        first_reduction = p;
  2393. X        last_reduction = p;
  2394. X    }
  2395. X    }
  2396. X}
  2397. X
  2398. X
  2399. Xset_derives()
  2400. X{
  2401. X    register int i, k;
  2402. X    register int lhs;
  2403. X    register short *rules;
  2404. X
  2405. X    derives = NEW2(nsyms, short *);
  2406. X    rules = NEW2(nvars + nrules, short);
  2407. X
  2408. X    k = 0;
  2409. X    for (lhs = start_symbol; lhs < nsyms; lhs++)
  2410. X    {
  2411. X    derives[lhs] = rules + k;
  2412. X    for (i = 0; i < nrules; i++)
  2413. X    {
  2414. X        if (rlhs[i] == lhs)
  2415. X        {
  2416. X        rules[k] = i;
  2417. X        k++;
  2418. X        }
  2419. X    }
  2420. X    rules[k] = -1;
  2421. X    k++;
  2422. X    }
  2423. X
  2424. X#ifdef    DEBUG
  2425. X    print_derives();
  2426. X#endif
  2427. X}
  2428. X
  2429. Xfree_derives()
  2430. X{
  2431. X    FREE(derives[start_symbol]);
  2432. X    FREE(derives);
  2433. X}
  2434. X
  2435. X#ifdef    DEBUG
  2436. Xprint_derives()
  2437. X{
  2438. X    register int i;
  2439. X    register short *sp;
  2440. X
  2441. X    printf("\nDERIVES\n\n");
  2442. X
  2443. X    for (i = start_symbol; i < nsyms; i++)
  2444. X    {
  2445. X    printf("%s derives ", symbol_name[i]);
  2446. X    for (sp = derives[i]; *sp >= 0; sp++)
  2447. X    {
  2448. X        printf("  %d", *sp);
  2449. X    }
  2450. X    putchar('\n');
  2451. X    }
  2452. X
  2453. X    putchar('\n');
  2454. X}
  2455. X#endif
  2456. X
  2457. X
  2458. Xset_nullable()
  2459. X{
  2460. X    register int i, j;
  2461. X    register int empty;
  2462. X    int done;
  2463. X
  2464. X    nullable = MALLOC(nsyms);
  2465. X    if (nullable == 0) no_space();
  2466. X
  2467. X    for (i = 0; i < nsyms; ++i)
  2468. X    nullable[i] = 0;
  2469. X
  2470. X    done = 0;
  2471. X    while (!done)
  2472. X    {
  2473. X    done = 1;
  2474. X    for (i = 1; i < nitems; i++)
  2475. X    {
  2476. X        empty = 1;
  2477. X        while ((j = ritem[i]) >= 0)
  2478. X        {
  2479. X        if (!nullable[j])
  2480. X            empty = 0;
  2481. X        ++i;
  2482. X        }
  2483. X        if (empty)
  2484. X        {
  2485. X        j = rlhs[-j];
  2486. X        if (!nullable[j])
  2487. X        {
  2488. X            nullable[j] = 1;
  2489. X            done = 0;
  2490. X        }
  2491. X        }
  2492. X    }
  2493. X    }
  2494. X
  2495. X#ifdef DEBUG
  2496. X    for (i = 0; i < nsyms; i++)
  2497. X    {
  2498. X    if (nullable[i])
  2499. X        printf("%s is nullable\n", symbol_name[i]);
  2500. X    else
  2501. X        printf("%s is not nullable\n", symbol_name[i]);
  2502. X    }
  2503. X#endif
  2504. X}
  2505. X
  2506. X
  2507. Xfree_nullable()
  2508. X{
  2509. X    FREE(nullable);
  2510. X}
  2511. X
  2512. X
  2513. Xlr0()
  2514. X{
  2515. X    set_derives();
  2516. X    set_nullable();
  2517. X    generate_states();
  2518. X}
  2519. END_OF_FILE
  2520. if test 9587 -ne `wc -c <'lr0.c'`; then
  2521.     echo shar: \"'lr0.c'\" unpacked with wrong size!
  2522. fi
  2523. # end of 'lr0.c'
  2524. fi
  2525. if test -f 'main.c' -a "${1}" != "-c" ; then 
  2526.   echo shar: Will not clobber existing file \"'main.c'\"
  2527. else
  2528. echo shar: Extracting \"'main.c'\" \(6630 characters\)
  2529. sed "s/^X//" >'main.c' <<'END_OF_FILE'
  2530. X#include <signal.h>
  2531. X#include "defs.h"
  2532. X
  2533. Xchar dflag;
  2534. Xchar lflag;
  2535. Xchar rflag;
  2536. Xchar tflag;
  2537. Xchar vflag;
  2538. X
  2539. Xchar *symbol_prefix;
  2540. Xchar *file_prefix = "y";
  2541. Xchar *myname = "yacc";
  2542. Xchar *temp_form = "yacc.XXXXXXX";
  2543. X
  2544. Xint lineno;
  2545. Xint outline;
  2546. X
  2547. Xchar *action_file_name;
  2548. Xchar *code_file_name;
  2549. Xchar *defines_file_name;
  2550. Xchar *input_file_name = "";
  2551. Xchar *output_file_name;
  2552. Xchar *text_file_name;
  2553. Xchar *union_file_name;
  2554. Xchar *verbose_file_name;
  2555. X
  2556. XFILE *action_file;    /*  a temp file, used to save actions associated    */
  2557. X            /*  with rules until the parser is written        */
  2558. XFILE *code_file;    /*  y.code.c (used when the -r option is specified) */
  2559. XFILE *defines_file;    /*  y.tab.h                        */
  2560. XFILE *input_file;    /*  the input file                    */
  2561. XFILE *output_file;    /*  y.tab.c                        */
  2562. XFILE *text_file;    /*  a temp file, used to save text until all        */
  2563. X            /*  symbols have been defined                */
  2564. XFILE *union_file;    /*  a temp file, used to save the union            */
  2565. X            /*  definition until all symbol have been        */
  2566. X            /*  defined                        */
  2567. XFILE *verbose_file;    /*  y.output                        */
  2568. X
  2569. Xint nitems;
  2570. Xint nrules;
  2571. Xint nsyms;
  2572. Xint ntokens;
  2573. Xint nvars;
  2574. X
  2575. Xint   start_symbol;
  2576. Xchar  **symbol_name;
  2577. Xshort *symbol_value;
  2578. Xshort *symbol_prec;
  2579. Xchar  *symbol_assoc;
  2580. X
  2581. Xshort *ritem;
  2582. Xshort *rlhs;
  2583. Xshort *rrhs;
  2584. Xshort *rprec;
  2585. Xchar  *rassoc;
  2586. Xshort **derives;
  2587. Xchar *nullable;
  2588. X
  2589. Xextern char *mktemp();
  2590. Xextern char *getenv();
  2591. X
  2592. X
  2593. Xdone(k)
  2594. Xint k;
  2595. X{
  2596. X    if (action_file) { fclose(action_file); unlink(action_file_name); }
  2597. X    if (text_file) { fclose(text_file); unlink(text_file_name); }
  2598. X    if (union_file) { fclose(union_file); unlink(union_file_name); }
  2599. X    exit(k);
  2600. X}
  2601. X
  2602. X
  2603. Xvoid
  2604. Xonintr(signo)
  2605. X    int signo;
  2606. X{
  2607. X    done(1);
  2608. X}
  2609. X
  2610. X
  2611. Xset_signals()
  2612. X{
  2613. X#ifdef SIGINT
  2614. X    if (signal(SIGINT, SIG_IGN) != SIG_IGN)
  2615. X    signal(SIGINT, onintr);
  2616. X#endif
  2617. X#ifdef SIGTERM
  2618. X    if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
  2619. X    signal(SIGTERM, onintr);
  2620. X#endif
  2621. X#ifdef SIGHUP
  2622. X    if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
  2623. X    signal(SIGHUP, onintr);
  2624. X#endif
  2625. X}
  2626. X
  2627. X
  2628. Xusage()
  2629. X{
  2630. X    fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname);
  2631. X    exit(1);
  2632. X}
  2633. X
  2634. X
  2635. Xgetargs(argc, argv)
  2636. Xint argc;
  2637. Xchar *argv[];
  2638. X{
  2639. X    register int i;
  2640. X    register char *s;
  2641. X
  2642. X    if (argc > 0) myname = argv[0];
  2643. X    for (i = 1; i < argc; ++i)
  2644. X    {
  2645. X    s = argv[i];
  2646. X    if (*s != '-') break;
  2647. X    switch (*++s)
  2648. X    {
  2649. X    case '\0':
  2650. X        input_file = stdin;
  2651. X        if (i + 1 < argc) usage();
  2652. X        return;
  2653. X
  2654. X    case '-':
  2655. X        ++i;
  2656. X        goto no_more_options;
  2657. X
  2658. X    case 'b':
  2659. X        if (*++s)
  2660. X         file_prefix = s;
  2661. X        else if (++i < argc)
  2662. X        file_prefix = argv[i];
  2663. X        else
  2664. X        usage();
  2665. X        continue;
  2666. X
  2667. X    case 'd':
  2668. X        dflag = 1;
  2669. X        break;
  2670. X
  2671. X    case 'l':
  2672. X        lflag = 1;
  2673. X        break;
  2674. X
  2675. X    case 'p':
  2676. X        if (*++s)
  2677. X        symbol_prefix = s;
  2678. X        else if (++i < argc)
  2679. X        symbol_prefix = argv[i];
  2680. X        else
  2681. X        usage();
  2682. X        continue;
  2683. X
  2684. X    case 'r':
  2685. X        rflag = 1;
  2686. X        break;
  2687. X
  2688. X    case 't':
  2689. X        tflag = 1;
  2690. X        break;
  2691. X
  2692. X    case 'v':
  2693. X        vflag = 1;
  2694. X        break;
  2695. X
  2696. X    default:
  2697. X        usage();
  2698. X    }
  2699. X
  2700. X    for (;;)
  2701. X    {
  2702. X        switch (*++s)
  2703. X        {
  2704. X        case '\0':
  2705. X        goto end_of_option;
  2706. X
  2707. X        case 'd':
  2708. X        dflag = 1;
  2709. X        break;
  2710. X
  2711. X        case 'l':
  2712. X        lflag = 1;
  2713. X        break;
  2714. X
  2715. X        case 'r':
  2716. X        rflag = 1;
  2717. X        break;
  2718. X
  2719. X        case 't':
  2720. X        tflag = 1;
  2721. X        break;
  2722. X
  2723. X        case 'v':
  2724. X        vflag = 1;
  2725. X        break;
  2726. X
  2727. X        default:
  2728. X        usage();
  2729. X        }
  2730. X    }
  2731. Xend_of_option:;
  2732. X    }
  2733. X
  2734. Xno_more_options:;
  2735. X    if (i + 1 != argc) usage();
  2736. X    input_file_name = argv[i];
  2737. X}
  2738. X
  2739. X
  2740. Xchar *
  2741. Xallocate(n)
  2742. Xunsigned n;
  2743. X{
  2744. X    register char *p;
  2745. X
  2746. X    p = NULL;
  2747. X    if (n)
  2748. X    {
  2749. X    p = CALLOC(1, n);
  2750. X    if (!p) no_space();
  2751. X    }
  2752. X    return (p);
  2753. X}
  2754. X
  2755. X
  2756. Xcreate_file_names()
  2757. X{
  2758. X    int i, len;
  2759. X    char *tmpdir;
  2760. X
  2761. X    tmpdir = getenv("TMPDIR");
  2762. X    if (tmpdir == 0) tmpdir = "/tmp";
  2763. X
  2764. X    len = strlen(tmpdir);
  2765. X    i = len + 13;
  2766. X    if (len && tmpdir[len-1] != '/')
  2767. X    ++i;
  2768. X
  2769. X    action_file_name = MALLOC(i);
  2770. X    if (action_file_name == 0) no_space();
  2771. X    text_file_name = MALLOC(i);
  2772. X    if (text_file_name == 0) no_space();
  2773. X    union_file_name = MALLOC(i);
  2774. X    if (union_file_name == 0) no_space();
  2775. X
  2776. X    strcpy(action_file_name, tmpdir);
  2777. X    strcpy(text_file_name, tmpdir);
  2778. X    strcpy(union_file_name, tmpdir);
  2779. X
  2780. X    if (len && tmpdir[len - 1] != '/')
  2781. X    {
  2782. X    action_file_name[len] = '/';
  2783. X    text_file_name[len] = '/';
  2784. X    union_file_name[len] = '/';
  2785. X    ++len;
  2786. X    }
  2787. X
  2788. X    strcpy(action_file_name + len, temp_form);
  2789. X    strcpy(text_file_name + len, temp_form);
  2790. X    strcpy(union_file_name + len, temp_form);
  2791. X
  2792. X    action_file_name[len + 5] = 'a';
  2793. X    text_file_name[len + 5] = 't';
  2794. X    union_file_name[len + 5] = 'u';
  2795. X
  2796. X    mktemp(action_file_name);
  2797. X    mktemp(text_file_name);
  2798. X    mktemp(union_file_name);
  2799. X
  2800. X    len = strlen(file_prefix);
  2801. X
  2802. X    output_file_name = MALLOC(len + 7);
  2803. X    if (output_file_name == 0)
  2804. X    no_space();
  2805. X    strcpy(output_file_name, file_prefix);
  2806. X    strcpy(output_file_name + len, OUTPUT_SUFFIX);
  2807. X
  2808. X    if (rflag)
  2809. X    {
  2810. X    code_file_name = MALLOC(len + 8);
  2811. X    if (code_file_name == 0)
  2812. X        no_space();
  2813. X    strcpy(code_file_name, file_prefix);
  2814. X    strcpy(code_file_name + len, CODE_SUFFIX);
  2815. X    }
  2816. X    else
  2817. X    code_file_name = output_file_name;
  2818. X
  2819. X    if (dflag)
  2820. X    {
  2821. X    defines_file_name = MALLOC(len + 7);
  2822. X    if (defines_file_name == 0)
  2823. X        no_space();
  2824. X    strcpy(defines_file_name, file_prefix);
  2825. X    strcpy(defines_file_name + len, DEFINES_SUFFIX);
  2826. X    }
  2827. X
  2828. X    if (vflag)
  2829. X    {
  2830. X    verbose_file_name = MALLOC(len + 8);
  2831. X    if (verbose_file_name == 0)
  2832. X        no_space();
  2833. X    strcpy(verbose_file_name, file_prefix);
  2834. X    strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
  2835. X    }
  2836. X}
  2837. X
  2838. X
  2839. Xopen_files()
  2840. X{
  2841. X    create_file_names();
  2842. X
  2843. X    if (input_file == 0)
  2844. X    {
  2845. X    input_file = fopen(input_file_name, "r");
  2846. X    if (input_file == 0)
  2847. X        open_error(input_file_name);
  2848. X    }
  2849. X
  2850. X    action_file = fopen(action_file_name, "w");
  2851. X    if (action_file == 0)
  2852. X    open_error(action_file_name);
  2853. X
  2854. X    text_file = fopen(text_file_name, "w");
  2855. X    if (text_file == 0)
  2856. X    open_error(text_file_name);
  2857. X
  2858. X    if (vflag)
  2859. X    {
  2860. X    verbose_file = fopen(verbose_file_name, "w");
  2861. X    if (verbose_file == 0)
  2862. X        open_error(verbose_file_name);
  2863. X    }
  2864. X
  2865. X    if (dflag)
  2866. X    {
  2867. X    defines_file = fopen(defines_file_name, "w");
  2868. X    if (defines_file == 0)
  2869. X        open_error(defines_file_name);
  2870. X    union_file = fopen(union_file_name, "w");
  2871. X    if (union_file ==  0)
  2872. X        open_error(union_file_name);
  2873. X    }
  2874. X
  2875. X    output_file = fopen(output_file_name, "w");
  2876. X    if (output_file == 0)
  2877. X    open_error(output_file_name);
  2878. X
  2879. X    if (rflag)
  2880. X    {
  2881. X    code_file = fopen(code_file_name, "w");
  2882. X    if (code_file == 0)
  2883. X        open_error(code_file_name);
  2884. X    }
  2885. X    else
  2886. X    code_file = output_file;
  2887. X}
  2888. X
  2889. X
  2890. Xint
  2891. Xmain(argc, argv)
  2892. Xint argc;
  2893. Xchar *argv[];
  2894. X{
  2895. X    set_signals();
  2896. X    getargs(argc, argv);
  2897. X    open_files();
  2898. X    reader();
  2899. X    lr0();
  2900. X    lalr();
  2901. X    make_parser();
  2902. X    verbose();
  2903. X    output();
  2904. X    done(0);
  2905. X    /*NOTREACHED*/
  2906. X}
  2907. END_OF_FILE
  2908. if test 6630 -ne `wc -c <'main.c'`; then
  2909.     echo shar: \"'main.c'\" unpacked with wrong size!
  2910. fi
  2911. # end of 'main.c'
  2912. fi
  2913. if test -f 'mkpar.c' -a "${1}" != "-c" ; then 
  2914.   echo shar: Will not clobber existing file \"'mkpar.c'\"
  2915. else
  2916. echo shar: Extracting \"'mkpar.c'\" \(6316 characters\)
  2917. sed "s/^X//" >'mkpar.c' <<'END_OF_FILE'
  2918. X
  2919. X#include "defs.h"
  2920. X
  2921. Xaction **parser;
  2922. Xint SRtotal;
  2923. Xint RRtotal;
  2924. Xshort *SRconflicts;
  2925. Xshort *RRconflicts;
  2926. Xshort *defred;
  2927. Xshort *rules_used;
  2928. Xshort nunused;
  2929. Xshort final_state;
  2930. X
  2931. Xstatic int SRcount;
  2932. Xstatic int RRcount;
  2933. X
  2934. Xextern action *parse_actions();
  2935. Xextern action *get_shifts();
  2936. Xextern action *add_reductions();
  2937. Xextern action *add_reduce();
  2938. X
  2939. X
  2940. Xmake_parser()
  2941. X{
  2942. X    register int i;
  2943. X
  2944. X    parser = NEW2(nstates, action *);
  2945. X    for (i = 0; i < nstates; i++)
  2946. X    parser[i] = parse_actions(i);
  2947. X
  2948. X    find_final_state();
  2949. X    remove_conflicts();
  2950. X    unused_rules();
  2951. X    if (SRtotal + RRtotal > 0) total_conflicts();
  2952. X    defreds();
  2953. X}
  2954. X
  2955. X
  2956. Xaction *
  2957. Xparse_actions(stateno)
  2958. Xregister int stateno;
  2959. X{
  2960. X    register action *actions;
  2961. X
  2962. X    actions = get_shifts(stateno);
  2963. X    actions = add_reductions(stateno, actions);
  2964. X    return (actions);
  2965. X}
  2966. X
  2967. X
  2968. Xaction *
  2969. Xget_shifts(stateno)
  2970. Xint stateno;
  2971. X{
  2972. X    register action *actions, *temp;
  2973. X    register shifts *sp;
  2974. X    register short *to_state;
  2975. X    register int i, k;
  2976. X    register int symbol;
  2977. X
  2978. X    actions = 0;
  2979. X    sp = shift_table[stateno];
  2980. X    if (sp)
  2981. X    {
  2982. X    to_state = sp->shift;
  2983. X    for (i = sp->nshifts - 1; i >= 0; i--)
  2984. X    {
  2985. X        k = to_state[i];
  2986. X        symbol = accessing_symbol[k];
  2987. X        if (ISTOKEN(symbol))
  2988. X        {
  2989. X        temp = NEW(action);
  2990. X        temp->next = actions;
  2991. X        temp->symbol = symbol;
  2992. X        temp->number = k;
  2993. X        temp->prec = symbol_prec[symbol];
  2994. X        temp->action_code = SHIFT;
  2995. X        temp->assoc = symbol_assoc[symbol];
  2996. X        actions = temp;
  2997. X        }
  2998. X    }
  2999. X    }
  3000. X    return (actions);
  3001. X}
  3002. X
  3003. Xaction *
  3004. Xadd_reductions(stateno, actions)
  3005. Xint stateno;
  3006. Xregister action *actions;
  3007. X{
  3008. X    register int i, j, m, n;
  3009. X    register int ruleno, tokensetsize;
  3010. X    register unsigned *rowp;
  3011. X
  3012. X    tokensetsize = WORDSIZE(ntokens);
  3013. X    m = lookaheads[stateno];
  3014. X    n = lookaheads[stateno + 1];
  3015. X    for (i = m; i < n; i++)
  3016. X    {
  3017. X    ruleno = LAruleno[i];
  3018. X    rowp = LA + i * tokensetsize;
  3019. X    for (j = ntokens - 1; j >= 0; j--)
  3020. X    {
  3021. X        if (BIT(rowp, j))
  3022. X        actions = add_reduce(actions, ruleno, j);
  3023. X    }
  3024. X    }
  3025. X    return (actions);
  3026. X}
  3027. X
  3028. X
  3029. Xaction *
  3030. Xadd_reduce(actions, ruleno, symbol)
  3031. Xregister action *actions;
  3032. Xregister int ruleno, symbol;
  3033. X{
  3034. X    register action *temp, *prev, *next;
  3035. X
  3036. X    prev = 0;
  3037. X    for (next = actions; next && next->symbol < symbol; next = next->next)
  3038. X    prev = next;
  3039. X
  3040. X    while (next && next->symbol == symbol && next->action_code == SHIFT)
  3041. X    {
  3042. X    prev = next;
  3043. X    next = next->next;
  3044. X    }
  3045. X
  3046. X    while (next && next->symbol == symbol &&
  3047. X        next->action_code == REDUCE && next->number < ruleno)
  3048. X    {
  3049. X    prev = next;
  3050. X    next = next->next;
  3051. X    }
  3052. X
  3053. X    temp = NEW(action);
  3054. X    temp->next = next;
  3055. X    temp->symbol = symbol;
  3056. X    temp->number = ruleno;
  3057. X    temp->prec = rprec[ruleno];
  3058. X    temp->action_code = REDUCE;
  3059. X    temp->assoc = rassoc[ruleno];
  3060. X
  3061. X    if (prev)
  3062. X    prev->next = temp;
  3063. X    else
  3064. X    actions = temp;
  3065. X
  3066. X    return (actions);
  3067. X}
  3068. X
  3069. X
  3070. Xfind_final_state()
  3071. X{
  3072. X    register int goal, i;
  3073. X    register short *to_state;
  3074. X    register shifts *p;
  3075. X
  3076. X    p = shift_table[0];
  3077. X    to_state = p->shift;
  3078. X    goal = ritem[1];
  3079. X    for (i = p->nshifts - 1; i >= 0; --i)
  3080. X    {
  3081. X    final_state = to_state[i];
  3082. X    if (accessing_symbol[final_state] == goal) break;
  3083. X    }
  3084. X}
  3085. X
  3086. X
  3087. Xunused_rules()
  3088. X{
  3089. X    register int i;
  3090. X    register action *p;
  3091. X
  3092. X    rules_used = (short *) MALLOC(nrules*sizeof(short));
  3093. X    if (rules_used == 0) no_space();
  3094. X
  3095. X    for (i = 0; i < nrules; ++i)
  3096. X    rules_used[i] = 0;
  3097. X
  3098. X    for (i = 0; i < nstates; ++i)
  3099. X    {
  3100. X    for (p = parser[i]; p; p = p->next)
  3101. X    {
  3102. X        if (p->action_code == REDUCE && p->suppressed == 0)
  3103. X        rules_used[p->number] = 1;
  3104. X    }
  3105. X    }
  3106. X
  3107. X    nunused = 0;
  3108. X    for (i = 3; i < nrules; ++i)
  3109. X    if (!rules_used[i]) ++nunused;
  3110. X
  3111. X    if (nunused)
  3112. X    if (nunused == 1)
  3113. X        fprintf(stderr, "%s: 1 rule never reduced\n", myname);
  3114. X    else
  3115. X        fprintf(stderr, "%s: %d rules never reduced\n", myname, nunused);
  3116. X}
  3117. X
  3118. X
  3119. Xremove_conflicts()
  3120. X{
  3121. X    register int i;
  3122. X    register int symbol;
  3123. X    register action *p, *pref;
  3124. X
  3125. X    SRtotal = 0;
  3126. X    RRtotal = 0;
  3127. X    SRconflicts = NEW2(nstates, short);
  3128. X    RRconflicts = NEW2(nstates, short);
  3129. X    for (i = 0; i < nstates; i++)
  3130. X    {
  3131. X    SRcount = 0;
  3132. X    RRcount = 0;
  3133. X    symbol = -1;
  3134. X    for (p = parser[i]; p; p = p->next)
  3135. X    {
  3136. X        if (p->symbol != symbol)
  3137. X        {
  3138. X        pref = p;
  3139. X        symbol = p->symbol;
  3140. X        }
  3141. X        else if (i == final_state && symbol == 0)
  3142. X        {
  3143. X        SRcount++;
  3144. X        p->suppressed = 1;
  3145. X        }
  3146. X        else if (pref->action_code == SHIFT)
  3147. X        {
  3148. X        if (pref->prec > 0 && p->prec > 0)
  3149. X        {
  3150. X            if (pref->prec < p->prec)
  3151. X            {
  3152. X            pref->suppressed = 2;
  3153. X            pref = p;
  3154. X            }
  3155. X            else if (pref->prec > p->prec)
  3156. X            {
  3157. X            p->suppressed = 2;
  3158. X            }
  3159. X            else if (pref->assoc == LEFT)
  3160. X            {
  3161. X            pref->suppressed = 2;
  3162. X            pref = p;
  3163. X            }
  3164. X            else if (pref->assoc == RIGHT)
  3165. X            {
  3166. X            p->suppressed = 2;
  3167. X            }
  3168. X            else
  3169. X            {
  3170. X            pref->suppressed = 2;
  3171. X            p->suppressed = 2;
  3172. X            }
  3173. X        }
  3174. X        else
  3175. X        {
  3176. X            SRcount++;
  3177. X            p->suppressed = 1;
  3178. X        }
  3179. X        }
  3180. X        else
  3181. X        {
  3182. X        RRcount++;
  3183. X        p->suppressed = 1;
  3184. X        }
  3185. X    }
  3186. X    SRtotal += SRcount;
  3187. X    RRtotal += RRcount;
  3188. X    SRconflicts[i] = SRcount;
  3189. X    RRconflicts[i] = RRcount;
  3190. X    }
  3191. X}
  3192. X
  3193. X
  3194. Xtotal_conflicts()
  3195. X{
  3196. X    fprintf(stderr, "%s: ", myname);
  3197. X    if (SRtotal == 1)
  3198. X    fprintf(stderr, "1 shift/reduce conflict");
  3199. X    else if (SRtotal > 1)
  3200. X    fprintf(stderr, "%d shift/reduce conflicts", SRtotal);
  3201. X
  3202. X    if (SRtotal && RRtotal)
  3203. X    fprintf(stderr, ", ");
  3204. X
  3205. X    if (RRtotal == 1)
  3206. X    fprintf(stderr, "1 reduce/reduce conflict");
  3207. X    else if (RRtotal > 1)
  3208. X    fprintf(stderr, "%d reduce/reduce conflicts", RRtotal);
  3209. X
  3210. X    fprintf(stderr, ".\n");
  3211. X}
  3212. X
  3213. X
  3214. Xint
  3215. Xsole_reduction(stateno)
  3216. Xint stateno;
  3217. X{
  3218. X    register int count, ruleno;
  3219. X    register action *p;
  3220. X
  3221. X    count = 0;
  3222. X    ruleno = 0; 
  3223. X    for (p = parser[stateno]; p; p = p->next)
  3224. X    {
  3225. X    if (p->action_code == SHIFT && p->suppressed == 0)
  3226. X        return (0);
  3227. X    else if (p->action_code == REDUCE && p->suppressed == 0)
  3228. X    {
  3229. X        if (ruleno > 0 && p->number != ruleno)
  3230. X        return (0);
  3231. X        if (p->symbol != 1)
  3232. X        ++count;
  3233. X        ruleno = p->number;
  3234. X    }
  3235. X    }
  3236. X
  3237. X    if (count == 0)
  3238. X    return (0);
  3239. X    return (ruleno);
  3240. X}
  3241. X
  3242. X
  3243. Xdefreds()
  3244. X{
  3245. X    register int i;
  3246. X
  3247. X    defred = NEW2(nstates, short);
  3248. X    for (i = 0; i < nstates; i++)
  3249. X    defred[i] = sole_reduction(i);
  3250. X}
  3251. Xfree_action_row(p)
  3252. Xregister action *p;
  3253. X{
  3254. X  register action *q;
  3255. X
  3256. X  while (p)
  3257. X    {
  3258. X      q = p->next;
  3259. X      FREE(p);
  3260. X      p = q;
  3261. X    }
  3262. X}
  3263. X
  3264. Xfree_parser()
  3265. X{
  3266. X  register int i;
  3267. X
  3268. X  for (i = 0; i < nstates; i++)
  3269. X    free_action_row(parser[i]);
  3270. X
  3271. X  FREE(parser);
  3272. X}
  3273. X
  3274. END_OF_FILE
  3275. if test 6316 -ne `wc -c <'mkpar.c'`; then
  3276.     echo shar: \"'mkpar.c'\" unpacked with wrong size!
  3277. fi
  3278. # end of 'mkpar.c'
  3279. fi
  3280. if test -f 'skeleton.c' -a "${1}" != "-c" ; then 
  3281.   echo shar: Will not clobber existing file \"'skeleton.c'\"
  3282. else
  3283. echo shar: Extracting \"'skeleton.c'\" \(8596 characters\)
  3284. sed "s/^X//" >'skeleton.c' <<'END_OF_FILE'
  3285. X#include "defs.h"
  3286. X
  3287. X/*  The definition of yysccsid in the banner should be replaced with    */
  3288. X/*  a #pragma ident directive if the target C compiler supports        */
  3289. X/*  #pragma ident directives.                        */
  3290. X/*                                    */
  3291. X/*  If the skeleton is changed, the banner should be changed so that    */
  3292. X/*  the altered version can be easily distinguished from the original.    */
  3293. X/*                                    */
  3294. X/*  The #defines included with the banner are there because they are    */
  3295. X/*  useful in subsequent code.  The macros #defined in the header or    */
  3296. X/*  the body either are not useful outside of semantic actions or    */
  3297. X/*  are conditional.                            */
  3298. X
  3299. Xchar *banner[] =
  3300. X{
  3301. X    "#ifndef lint",
  3302. X    "static char yysccsid[] = \"@(#)yaccpar    1.9 (Berkeley) 02/21/93\";",
  3303. X    "#endif",
  3304. X    "#define YYBYACC 1",
  3305. X    "#define YYMAJOR 1",
  3306. X    "#define YYMINOR 9",
  3307. X    "#define yyclearin (yychar=(-1))",
  3308. X    "#define yyerrok (yyerrflag=0)",
  3309. X    "#define YYRECOVERING (yyerrflag!=0)",
  3310. X    0
  3311. X};
  3312. X
  3313. X
  3314. Xchar *tables[] =
  3315. X{
  3316. X    "extern short yylhs[];",
  3317. X    "extern short yylen[];",
  3318. X    "extern short yydefred[];",
  3319. X    "extern short yydgoto[];",
  3320. X    "extern short yysindex[];",
  3321. X    "extern short yyrindex[];",
  3322. X    "extern short yygindex[];",
  3323. X    "extern short yytable[];",
  3324. X    "extern short yycheck[];",
  3325. X    "#if YYDEBUG",
  3326. X    "extern char *yyname[];",
  3327. X    "extern char *yyrule[];",
  3328. X    "#endif",
  3329. X    0
  3330. X};
  3331. X
  3332. X
  3333. Xchar *header[] =
  3334. X{
  3335. X    "#ifdef YYSTACKSIZE",
  3336. X    "#undef YYMAXDEPTH",
  3337. X    "#define YYMAXDEPTH YYSTACKSIZE",
  3338. X    "#else",
  3339. X    "#ifdef YYMAXDEPTH",
  3340. X    "#define YYSTACKSIZE YYMAXDEPTH",
  3341. X    "#else",
  3342. X    "#define YYSTACKSIZE 500",
  3343. X    "#define YYMAXDEPTH 500",
  3344. X    "#endif",
  3345. X    "#endif",
  3346. X    "int yydebug;",
  3347. X    "int yynerrs;",
  3348. X    "int yyerrflag;",
  3349. X    "int yychar;",
  3350. X    "short *yyssp;",
  3351. X    "YYSTYPE *yyvsp;",
  3352. X    "YYSTYPE yyval;",
  3353. X    "YYSTYPE yylval;",
  3354. X    "short yyss[YYSTACKSIZE];",
  3355. X    "YYSTYPE yyvs[YYSTACKSIZE];",
  3356. X    "#define yystacksize YYSTACKSIZE",
  3357. X    0
  3358. X};
  3359. X
  3360. X
  3361. Xchar *body[] =
  3362. X{
  3363. X    "#define YYABORT goto yyabort",
  3364. X    "#define YYREJECT goto yyabort",
  3365. X    "#define YYACCEPT goto yyaccept",
  3366. X    "#define YYERROR goto yyerrlab",
  3367. X    "int",
  3368. X    "yyparse()",
  3369. X    "{",
  3370. X    "    register int yym, yyn, yystate;",
  3371. X    "#if YYDEBUG",
  3372. X    "    register char *yys;",
  3373. X    "    extern char *getenv();",
  3374. X    "",
  3375. X    "    if (yys = getenv(\"YYDEBUG\"))",
  3376. X    "    {",
  3377. X    "        yyn = *yys;",
  3378. X    "        if (yyn >= '0' && yyn <= '9')",
  3379. X    "            yydebug = yyn - '0';",
  3380. X    "    }",
  3381. X    "#endif",
  3382. X    "",
  3383. X    "    yynerrs = 0;",
  3384. X    "    yyerrflag = 0;",
  3385. X    "    yychar = (-1);",
  3386. X    "",
  3387. X    "    yyssp = yyss;",
  3388. X    "    yyvsp = yyvs;",
  3389. X    "    *yyssp = yystate = 0;",
  3390. X    "",
  3391. X    "yyloop:",
  3392. X    "    if (yyn = yydefred[yystate]) goto yyreduce;",
  3393. X    "    if (yychar < 0)",
  3394. X    "    {",
  3395. X    "        if ((yychar = yylex()) < 0) yychar = 0;",
  3396. X    "#if YYDEBUG",
  3397. X    "        if (yydebug)",
  3398. X    "        {",
  3399. X    "            yys = 0;",
  3400. X    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
  3401. X    "            if (!yys) yys = \"illegal-symbol\";",
  3402. X    "            printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
  3403. X    "                    YYPREFIX, yystate, yychar, yys);",
  3404. X    "        }",
  3405. X    "#endif",
  3406. X    "    }",
  3407. X    "    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
  3408. X    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
  3409. X    "    {",
  3410. X    "#if YYDEBUG",
  3411. X    "        if (yydebug)",
  3412. X    "            printf(\"%sdebug: state %d, shifting to state %d\\n\",",
  3413. X    "                    YYPREFIX, yystate, yytable[yyn]);",
  3414. X    "#endif",
  3415. X    "        if (yyssp >= yyss + yystacksize - 1)",
  3416. X    "        {",
  3417. X    "            goto yyoverflow;",
  3418. X    "        }",
  3419. X    "        *++yyssp = yystate = yytable[yyn];",
  3420. X    "        *++yyvsp = yylval;",
  3421. X    "        yychar = (-1);",
  3422. X    "        if (yyerrflag > 0)  --yyerrflag;",
  3423. X    "        goto yyloop;",
  3424. X    "    }",
  3425. X    "    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
  3426. X    "            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
  3427. X    "    {",
  3428. X    "        yyn = yytable[yyn];",
  3429. X    "        goto yyreduce;",
  3430. X    "    }",
  3431. X    "    if (yyerrflag) goto yyinrecovery;",
  3432. X    "#ifdef lint",
  3433. X    "    goto yynewerror;",
  3434. X    "#endif",
  3435. X    "yynewerror:",
  3436. X    "    yyerror(\"syntax error\");",
  3437. X    "#ifdef lint",
  3438. X    "    goto yyerrlab;",
  3439. X    "#endif",
  3440. X    "yyerrlab:",
  3441. X    "    ++yynerrs;",
  3442. X    "yyinrecovery:",
  3443. X    "    if (yyerrflag < 3)",
  3444. X    "    {",
  3445. X    "        yyerrflag = 3;",
  3446. X    "        for (;;)",
  3447. X    "        {",
  3448. X    "            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
  3449. X    "                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
  3450. X    "            {",
  3451. X    "#if YYDEBUG",
  3452. X    "                if (yydebug)",
  3453. X    "                    printf(\"%sdebug: state %d, error recovery shifting\\",
  3454. X    " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
  3455. X    "#endif",
  3456. X    "                if (yyssp >= yyss + yystacksize - 1)",
  3457. X    "                {",
  3458. X    "                    goto yyoverflow;",
  3459. X    "                }",
  3460. X    "                *++yyssp = yystate = yytable[yyn];",
  3461. X    "                *++yyvsp = yylval;",
  3462. X    "                goto yyloop;",
  3463. X    "            }",
  3464. X    "            else",
  3465. X    "            {",
  3466. X    "#if YYDEBUG",
  3467. X    "                if (yydebug)",
  3468. X    "                    printf(\"%sdebug: error recovery discarding state %d\
  3469. X\\n\",",
  3470. X    "                            YYPREFIX, *yyssp);",
  3471. X    "#endif",
  3472. X    "                if (yyssp <= yyss) goto yyabort;",
  3473. X    "                --yyssp;",
  3474. X    "                --yyvsp;",
  3475. X    "            }",
  3476. X    "        }",
  3477. X    "    }",
  3478. X    "    else",
  3479. X    "    {",
  3480. X    "        if (yychar == 0) goto yyabort;",
  3481. X    "#if YYDEBUG",
  3482. X    "        if (yydebug)",
  3483. X    "        {",
  3484. X    "            yys = 0;",
  3485. X    "            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
  3486. X    "            if (!yys) yys = \"illegal-symbol\";",
  3487. X    "            printf(\"%sdebug: state %d, error recovery discards token %d\
  3488. X (%s)\\n\",",
  3489. X    "                    YYPREFIX, yystate, yychar, yys);",
  3490. X    "        }",
  3491. X    "#endif",
  3492. X    "        yychar = (-1);",
  3493. X    "        goto yyloop;",
  3494. X    "    }",
  3495. X    "yyreduce:",
  3496. X    "#if YYDEBUG",
  3497. X    "    if (yydebug)",
  3498. X    "        printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
  3499. X    "                YYPREFIX, yystate, yyn, yyrule[yyn]);",
  3500. X    "#endif",
  3501. X    "    yym = yylen[yyn];",
  3502. X    "    yyval = yyvsp[1-yym];",
  3503. X    "    switch (yyn)",
  3504. X    "    {",
  3505. X    0
  3506. X};
  3507. X
  3508. X
  3509. Xchar *trailer[] =
  3510. X{
  3511. X    "    }",
  3512. X    "    yyssp -= yym;",
  3513. X    "    yystate = *yyssp;",
  3514. X    "    yyvsp -= yym;",
  3515. X    "    yym = yylhs[yyn];",
  3516. X    "    if (yystate == 0 && yym == 0)",
  3517. X    "    {",
  3518. X    "#if YYDEBUG",
  3519. X    "        if (yydebug)",
  3520. X    "            printf(\"%sdebug: after reduction, shifting from state 0 to\\",
  3521. X    " state %d\\n\", YYPREFIX, YYFINAL);",
  3522. X    "#endif",
  3523. X    "        yystate = YYFINAL;",
  3524. X    "        *++yyssp = YYFINAL;",
  3525. X    "        *++yyvsp = yyval;",
  3526. X    "        if (yychar < 0)",
  3527. X    "        {",
  3528. X    "            if ((yychar = yylex()) < 0) yychar = 0;",
  3529. X    "#if YYDEBUG",
  3530. X    "            if (yydebug)",
  3531. X    "            {",
  3532. X    "                yys = 0;",
  3533. X    "                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
  3534. X    "                if (!yys) yys = \"illegal-symbol\";",
  3535. X    "                printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
  3536. X    "                        YYPREFIX, YYFINAL, yychar, yys);",
  3537. X    "            }",
  3538. X    "#endif",
  3539. X    "        }",
  3540. X    "        if (yychar == 0) goto yyaccept;",
  3541. X    "        goto yyloop;",
  3542. X    "    }",
  3543. X    "    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
  3544. X    "            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
  3545. X    "        yystate = yytable[yyn];",
  3546. X    "    else",
  3547. X    "        yystate = yydgoto[yym];",
  3548. X    "#if YYDEBUG",
  3549. X    "    if (yydebug)",
  3550. X    "        printf(\"%sdebug: after reduction, shifting from state %d \\",
  3551. X    "to state %d\\n\", YYPREFIX, *yyssp, yystate);",
  3552. X    "#endif",
  3553. X    "    if (yyssp >= yyss + yystacksize - 1)",
  3554. X    "    {",
  3555. X    "        goto yyoverflow;",
  3556. X    "    }",
  3557. X    "    *++yyssp = yystate;",
  3558. X    "    *++yyvsp = yyval;",
  3559. X    "    goto yyloop;",
  3560. X    "yyoverflow:",
  3561. X    "    yyerror(\"yacc stack overflow\");",
  3562. X    "yyabort:",
  3563. X    "    return (1);",
  3564. X    "yyaccept:",
  3565. X    "    return (0);",
  3566. X    "}",
  3567. X    0
  3568. X};
  3569. X
  3570. X
  3571. Xwrite_section(section)
  3572. Xchar *section[];
  3573. X{
  3574. X    register int c;
  3575. X    register int i;
  3576. X    register char *s;
  3577. X    register FILE *f;
  3578. X
  3579. X    f = code_file;
  3580. X    for (i = 0; s = section[i]; ++i)
  3581. X    {
  3582. X    ++outline;
  3583. X    while (c = *s)
  3584. X    {
  3585. X        putc(c, f);
  3586. X        ++s;
  3587. X    }
  3588. X    putc('\n', f);
  3589. X    }
  3590. X}
  3591. END_OF_FILE
  3592. if test 8596 -ne `wc -c <'skeleton.c'`; then
  3593.     echo shar: \"'skeleton.c'\" unpacked with wrong size!
  3594. fi
  3595. # end of 'skeleton.c'
  3596. fi
  3597. if test -f 'symtab.c' -a "${1}" != "-c" ; then 
  3598.   echo shar: Will not clobber existing file \"'symtab.c'\"
  3599. else
  3600. echo shar: Extracting \"'symtab.c'\" \(1841 characters\)
  3601. sed "s/^X//" >'symtab.c' <<'END_OF_FILE'
  3602. X#include "defs.h"
  3603. X
  3604. X
  3605. X/* TABLE_SIZE is the number of entries in the symbol table. */
  3606. X/* TABLE_SIZE must be a power of two.                */
  3607. X
  3608. X#define    TABLE_SIZE 1024
  3609. X
  3610. X
  3611. Xbucket **symbol_table;
  3612. Xbucket *first_symbol;
  3613. Xbucket *last_symbol;
  3614. X
  3615. X
  3616. Xint
  3617. Xhash(name)
  3618. Xchar *name;
  3619. X{
  3620. X    register char *s;
  3621. X    register int c, k;
  3622. X
  3623. X    assert(name && *name);
  3624. X    s = name;
  3625. X    k = *s;
  3626. X    while (c = *++s)
  3627. X    k = (31*k + c) & (TABLE_SIZE - 1);
  3628. X
  3629. X    return (k);
  3630. X}
  3631. X
  3632. X
  3633. Xbucket *
  3634. Xmake_bucket(name)
  3635. Xchar *name;
  3636. X{
  3637. X    register bucket *bp;
  3638. X
  3639. X    assert(name);
  3640. X    bp = (bucket *) MALLOC(sizeof(bucket));
  3641. X    if (bp == 0) no_space();
  3642. X    bp->link = 0;
  3643. X    bp->next = 0;
  3644. X    bp->name = MALLOC(strlen(name) + 1);
  3645. X    if (bp->name == 0) no_space();
  3646. X    bp->tag = 0;
  3647. X    bp->value = UNDEFINED;
  3648. X    bp->index = 0;
  3649. X    bp->prec = 0;
  3650. X    bp-> class = UNKNOWN;
  3651. X    bp->assoc = TOKEN;
  3652. X
  3653. X    if (bp->name == 0) no_space();
  3654. X    strcpy(bp->name, name);
  3655. X
  3656. X    return (bp);
  3657. X}
  3658. X
  3659. X
  3660. Xbucket *
  3661. Xlookup(name)
  3662. Xchar *name;
  3663. X{
  3664. X    register bucket *bp, **bpp;
  3665. X
  3666. X    bpp = symbol_table + hash(name);
  3667. X    bp = *bpp;
  3668. X
  3669. X    while (bp)
  3670. X    {
  3671. X    if (strcmp(name, bp->name) == 0) return (bp);
  3672. X    bpp = &bp->link;
  3673. X    bp = *bpp;
  3674. X    }
  3675. X
  3676. X    *bpp = bp = make_bucket(name);
  3677. X    last_symbol->next = bp;
  3678. X    last_symbol = bp;
  3679. X
  3680. X    return (bp);
  3681. X}
  3682. X
  3683. X
  3684. Xcreate_symbol_table()
  3685. X{
  3686. X    register int i;
  3687. X    register bucket *bp;
  3688. X
  3689. X    symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  3690. X    if (symbol_table == 0) no_space();
  3691. X    for (i = 0; i < TABLE_SIZE; i++)
  3692. X    symbol_table[i] = 0;
  3693. X
  3694. X    bp = make_bucket("error");
  3695. X    bp->index = 1;
  3696. X    bp->class = TERM;
  3697. X
  3698. X    first_symbol = bp;
  3699. X    last_symbol = bp;
  3700. X    symbol_table[hash("error")] = bp;
  3701. X}
  3702. X
  3703. X
  3704. Xfree_symbol_table()
  3705. X{
  3706. X    FREE(symbol_table);
  3707. X    symbol_table = 0;
  3708. X}
  3709. X
  3710. X
  3711. Xfree_symbols()
  3712. X{
  3713. X    register bucket *p, *q;
  3714. X
  3715. X    for (p = first_symbol; p; p = q)
  3716. X    {
  3717. X    q = p->next;
  3718. X    FREE(p);
  3719. X    }
  3720. X}
  3721. END_OF_FILE
  3722. if test 1841 -ne `wc -c <'symtab.c'`; then
  3723.     echo shar: \"'symtab.c'\" unpacked with wrong size!
  3724. fi
  3725. # end of 'symtab.c'
  3726. fi
  3727. if test ! -d 'test' ; then
  3728.     echo shar: Creating directory \"'test'\"
  3729.     mkdir 'test'
  3730. fi
  3731. if test -f 'test/error.output' -a "${1}" != "-c" ; then 
  3732.   echo shar: Will not clobber existing file \"'test/error.output'\"
  3733. else
  3734. echo shar: Extracting \"'test/error.output'\" \(262 characters\)
  3735. sed "s/^X//" >'test/error.output' <<'END_OF_FILE'
  3736. X   0  $accept : S $end
  3737. X
  3738. X   1  S : error
  3739. X
  3740. Xstate 0
  3741. X    $accept : . S $end  (0)
  3742. X
  3743. X    error  shift 1
  3744. X    .  error
  3745. X
  3746. X    S  goto 2
  3747. X
  3748. X
  3749. Xstate 1
  3750. X    S : error .  (1)
  3751. X
  3752. X    .  reduce 1
  3753. X
  3754. X
  3755. Xstate 2
  3756. X    $accept : S . $end  (0)
  3757. X
  3758. X    $end  accept
  3759. X
  3760. X
  3761. X2 terminals, 2 nonterminals
  3762. X2 grammar rules, 3 states
  3763. END_OF_FILE
  3764. if test 262 -ne `wc -c <'test/error.output'`; then
  3765.     echo shar: \"'test/error.output'\" unpacked with wrong size!
  3766. fi
  3767. # end of 'test/error.output'
  3768. fi
  3769. if test -f 'test/error.tab.c' -a "${1}" != "-c" ; then 
  3770.   echo shar: Will not clobber existing file \"'test/error.tab.c'\"
  3771. else
  3772. echo shar: Extracting \"'test/error.tab.c'\" \(6617 characters\)
  3773. sed "s/^X//" >'test/error.tab.c' <<'END_OF_FILE'
  3774. X#ifndef lint
  3775. Xstatic char yysccsid[] = "@(#)yaccpar    1.9 (Berkeley) 02/21/93";
  3776. X#endif
  3777. X#define YYBYACC 1
  3778. X#define YYMAJOR 1
  3779. X#define YYMINOR 9
  3780. X#define yyclearin (yychar=(-1))
  3781. X#define yyerrok (yyerrflag=0)
  3782. X#define YYRECOVERING (yyerrflag!=0)
  3783. X#define YYPREFIX "yy"
  3784. X#define YYERRCODE 256
  3785. Xshort yylhs[] = {                                        -1,
  3786. X    0,
  3787. X};
  3788. Xshort yylen[] = {                                         2,
  3789. X    1,
  3790. X};
  3791. Xshort yydefred[] = {                                      0,
  3792. X    1,    0,
  3793. X};
  3794. Xshort yydgoto[] = {                                       2,
  3795. X};
  3796. Xshort yysindex[] = {                                   -256,
  3797. X    0,    0,
  3798. X};
  3799. Xshort yyrindex[] = {                                      0,
  3800. X    0,    0,
  3801. X};
  3802. Xshort yygindex[] = {                                      0,
  3803. X};
  3804. X#define YYTABLESIZE 0
  3805. Xshort yytable[] = {                                       1,
  3806. X};
  3807. Xshort yycheck[] = {                                     256,
  3808. X};
  3809. X#define YYFINAL 2
  3810. X#ifndef YYDEBUG
  3811. X#define YYDEBUG 0
  3812. X#endif
  3813. X#define YYMAXTOKEN 0
  3814. X#if YYDEBUG
  3815. Xchar *yyname[] = {
  3816. X"end-of-file",
  3817. X};
  3818. Xchar *yyrule[] = {
  3819. X"$accept : S",
  3820. X"S : error",
  3821. X};
  3822. X#endif
  3823. X#ifndef YYSTYPE
  3824. Xtypedef int YYSTYPE;
  3825. X#endif
  3826. X#ifdef YYSTACKSIZE
  3827. X#undef YYMAXDEPTH
  3828. X#define YYMAXDEPTH YYSTACKSIZE
  3829. X#else
  3830. X#ifdef YYMAXDEPTH
  3831. X#define YYSTACKSIZE YYMAXDEPTH
  3832. X#else
  3833. X#define YYSTACKSIZE 500
  3834. X#define YYMAXDEPTH 500
  3835. X#endif
  3836. X#endif
  3837. Xint yydebug;
  3838. Xint yynerrs;
  3839. Xint yyerrflag;
  3840. Xint yychar;
  3841. Xshort *yyssp;
  3842. XYYSTYPE *yyvsp;
  3843. XYYSTYPE yyval;
  3844. XYYSTYPE yylval;
  3845. Xshort yyss[YYSTACKSIZE];
  3846. XYYSTYPE yyvs[YYSTACKSIZE];
  3847. X#define yystacksize YYSTACKSIZE
  3848. X#line 4 "error.y"
  3849. Xmain(){printf("yyparse() = %d\n",yyparse());}
  3850. Xyylex(){return-1;}
  3851. Xyyerror(s)char*s;{printf("%s\n",s);}
  3852. X#line 80 "error.tab.c"
  3853. X#define YYABORT goto yyabort
  3854. X#define YYREJECT goto yyabort
  3855. X#define YYACCEPT goto yyaccept
  3856. X#define YYERROR goto yyerrlab
  3857. Xint
  3858. Xyyparse()
  3859. X{
  3860. X    register int yym, yyn, yystate;
  3861. X#if YYDEBUG
  3862. X    register char *yys;
  3863. X    extern char *getenv();
  3864. X
  3865. X    if (yys = getenv("YYDEBUG"))
  3866. X    {
  3867. X        yyn = *yys;
  3868. X        if (yyn >= '0' && yyn <= '9')
  3869. X            yydebug = yyn - '0';
  3870. X    }
  3871. X#endif
  3872. X
  3873. X    yynerrs = 0;
  3874. X    yyerrflag = 0;
  3875. X    yychar = (-1);
  3876. X
  3877. X    yyssp = yyss;
  3878. X    yyvsp = yyvs;
  3879. X    *yyssp = yystate = 0;
  3880. X
  3881. Xyyloop:
  3882. X    if (yyn = yydefred[yystate]) goto yyreduce;
  3883. X    if (yychar < 0)
  3884. X    {
  3885. X        if ((yychar = yylex()) < 0) yychar = 0;
  3886. X#if YYDEBUG
  3887. X        if (yydebug)
  3888. X        {
  3889. X            yys = 0;
  3890. X            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  3891. X            if (!yys) yys = "illegal-symbol";
  3892. X            printf("%sdebug: state %d, reading %d (%s)\n",
  3893. X                    YYPREFIX, yystate, yychar, yys);
  3894. X        }
  3895. X#endif
  3896. X    }
  3897. X    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
  3898. X            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  3899. X    {
  3900. X#if YYDEBUG
  3901. X        if (yydebug)
  3902. X            printf("%sdebug: state %d, shifting to state %d\n",
  3903. X                    YYPREFIX, yystate, yytable[yyn]);
  3904. X#endif
  3905. X        if (yyssp >= yyss + yystacksize - 1)
  3906. X        {
  3907. X            goto yyoverflow;
  3908. X        }
  3909. X        *++yyssp = yystate = yytable[yyn];
  3910. X        *++yyvsp = yylval;
  3911. X        yychar = (-1);
  3912. X        if (yyerrflag > 0)  --yyerrflag;
  3913. X        goto yyloop;
  3914. X    }
  3915. X    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
  3916. X            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  3917. X    {
  3918. X        yyn = yytable[yyn];
  3919. X        goto yyreduce;
  3920. X    }
  3921. X    if (yyerrflag) goto yyinrecovery;
  3922. X#ifdef lint
  3923. X    goto yynewerror;
  3924. X#endif
  3925. Xyynewerror:
  3926. X    yyerror("syntax error");
  3927. X#ifdef lint
  3928. X    goto yyerrlab;
  3929. X#endif
  3930. Xyyerrlab:
  3931. X    ++yynerrs;
  3932. Xyyinrecovery:
  3933. X    if (yyerrflag < 3)
  3934. X    {
  3935. X        yyerrflag = 3;
  3936. X        for (;;)
  3937. X        {
  3938. X            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
  3939. X                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
  3940. X            {
  3941. X#if YYDEBUG
  3942. X                if (yydebug)
  3943. X                    printf("%sdebug: state %d, error recovery shifting\
  3944. X to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
  3945. X#endif
  3946. X                if (yyssp >= yyss + yystacksize - 1)
  3947. X                {
  3948. X                    goto yyoverflow;
  3949. X                }
  3950. X                *++yyssp = yystate = yytable[yyn];
  3951. X                *++yyvsp = yylval;
  3952. X                goto yyloop;
  3953. X            }
  3954. X            else
  3955. X            {
  3956. X#if YYDEBUG
  3957. X                if (yydebug)
  3958. X                    printf("%sdebug: error recovery discarding state %d\n",
  3959. X                            YYPREFIX, *yyssp);
  3960. X#endif
  3961. X                if (yyssp <= yyss) goto yyabort;
  3962. X                --yyssp;
  3963. X                --yyvsp;
  3964. X            }
  3965. X        }
  3966. X    }
  3967. X    else
  3968. X    {
  3969. X        if (yychar == 0) goto yyabort;
  3970. X#if YYDEBUG
  3971. X        if (yydebug)
  3972. X        {
  3973. X            yys = 0;
  3974. X            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  3975. X            if (!yys) yys = "illegal-symbol";
  3976. X            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
  3977. X                    YYPREFIX, yystate, yychar, yys);
  3978. X        }
  3979. X#endif
  3980. X        yychar = (-1);
  3981. X        goto yyloop;
  3982. X    }
  3983. Xyyreduce:
  3984. X#if YYDEBUG
  3985. X    if (yydebug)
  3986. X        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
  3987. X                YYPREFIX, yystate, yyn, yyrule[yyn]);
  3988. X#endif
  3989. X    yym = yylen[yyn];
  3990. X    yyval = yyvsp[1-yym];
  3991. X    switch (yyn)
  3992. X    {
  3993. X    }
  3994. X    yyssp -= yym;
  3995. X    yystate = *yyssp;
  3996. X    yyvsp -= yym;
  3997. X    yym = yylhs[yyn];
  3998. X    if (yystate == 0 && yym == 0)
  3999. X    {
  4000. X#if YYDEBUG
  4001. X        if (yydebug)
  4002. X            printf("%sdebug: after reduction, shifting from state 0 to\
  4003. X state %d\n", YYPREFIX, YYFINAL);
  4004. X#endif
  4005. X        yystate = YYFINAL;
  4006. X        *++yyssp = YYFINAL;
  4007. X        *++yyvsp = yyval;
  4008. X        if (yychar < 0)
  4009. X        {
  4010. X            if ((yychar = yylex()) < 0) yychar = 0;
  4011. X#if YYDEBUG
  4012. X            if (yydebug)
  4013. X            {
  4014. X                yys = 0;
  4015. X                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  4016. X                if (!yys) yys = "illegal-symbol";
  4017. X                printf("%sdebug: state %d, reading %d (%s)\n",
  4018. X                        YYPREFIX, YYFINAL, yychar, yys);
  4019. X            }
  4020. X#endif
  4021. X        }
  4022. X        if (yychar == 0) goto yyaccept;
  4023. X        goto yyloop;
  4024. X    }
  4025. X    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
  4026. X            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
  4027. X        yystate = yytable[yyn];
  4028. X    else
  4029. X        yystate = yydgoto[yym];
  4030. X#if YYDEBUG
  4031. X    if (yydebug)
  4032. X        printf("%sdebug: after reduction, shifting from state %d \
  4033. Xto state %d\n", YYPREFIX, *yyssp, yystate);
  4034. X#endif
  4035. X    if (yyssp >= yyss + yystacksize - 1)
  4036. X    {
  4037. X        goto yyoverflow;
  4038. X    }
  4039. X    *++yyssp = yystate;
  4040. X    *++yyvsp = yyval;
  4041. X    goto yyloop;
  4042. Xyyoverflow:
  4043. X    yyerror("yacc stack overflow");
  4044. Xyyabort:
  4045. X    return (1);
  4046. Xyyaccept:
  4047. X    return (0);
  4048. X}
  4049. END_OF_FILE
  4050. if test 6617 -ne `wc -c <'test/error.tab.c'`; then
  4051.     echo shar: \"'test/error.tab.c'\" unpacked with wrong size!
  4052. fi
  4053. # end of 'test/error.tab.c'
  4054. fi
  4055. if test -f 'test/error.tab.h' -a "${1}" != "-c" ; then 
  4056.   echo shar: Will not clobber existing file \"'test/error.tab.h'\"
  4057. else
  4058. echo shar: Extracting \"'test/error.tab.h'\" \(0 characters\)
  4059. sed "s/^X//" >'test/error.tab.h' <<'END_OF_FILE'
  4060. END_OF_FILE
  4061. if test 0 -ne `wc -c <'test/error.tab.h'`; then
  4062.     echo shar: \"'test/error.tab.h'\" unpacked with wrong size!
  4063. fi
  4064. # end of 'test/error.tab.h'
  4065. fi
  4066. if test -f 'test/error.y' -a "${1}" != "-c" ; then 
  4067.   echo shar: Will not clobber existing file \"'test/error.y'\"
  4068. else
  4069. echo shar: Extracting \"'test/error.y'\" \(117 characters\)
  4070. sed "s/^X//" >'test/error.y' <<'END_OF_FILE'
  4071. X%%
  4072. XS: error
  4073. X%%
  4074. Xmain(){printf("yyparse() = %d\n",yyparse());}
  4075. Xyylex(){return-1;}
  4076. Xyyerror(s)char*s;{printf("%s\n",s);}
  4077. END_OF_FILE
  4078. if test 117 -ne `wc -c <'test/error.y'`; then
  4079.     echo shar: \"'test/error.y'\" unpacked with wrong size!
  4080. fi
  4081. # end of 'test/error.y'
  4082. fi
  4083. if test -f 'test/ftp.tab.h' -a "${1}" != "-c" ; then 
  4084.   echo shar: Will not clobber existing file \"'test/ftp.tab.h'\"
  4085. else
  4086. echo shar: Extracting \"'test/ftp.tab.h'\" \(1038 characters\)
  4087. sed "s/^X//" >'test/ftp.tab.h' <<'END_OF_FILE'
  4088. X#define A 257
  4089. X#define B 258
  4090. X#define C 259
  4091. X#define E 260
  4092. X#define F 261
  4093. X#define I 262
  4094. X#define L 263
  4095. X#define N 264
  4096. X#define P 265
  4097. X#define R 266
  4098. X#define S 267
  4099. X#define T 268
  4100. X#define SP 269
  4101. X#define CRLF 270
  4102. X#define COMMA 271
  4103. X#define STRING 272
  4104. X#define NUMBER 273
  4105. X#define USER 274
  4106. X#define PASS 275
  4107. X#define ACCT 276
  4108. X#define REIN 277
  4109. X#define QUIT 278
  4110. X#define PORT 279
  4111. X#define PASV 280
  4112. X#define TYPE 281
  4113. X#define STRU 282
  4114. X#define MODE 283
  4115. X#define RETR 284
  4116. X#define STOR 285
  4117. X#define APPE 286
  4118. X#define MLFL 287
  4119. X#define MAIL 288
  4120. X#define MSND 289
  4121. X#define MSOM 290
  4122. X#define MSAM 291
  4123. X#define MRSQ 292
  4124. X#define MRCP 293
  4125. X#define ALLO 294
  4126. X#define REST 295
  4127. X#define RNFR 296
  4128. X#define RNTO 297
  4129. X#define ABOR 298
  4130. X#define DELE 299
  4131. X#define CWD 300
  4132. X#define LIST 301
  4133. X#define NLST 302
  4134. X#define SITE 303
  4135. X#define STAT 304
  4136. X#define HELP 305
  4137. X#define NOOP 306
  4138. X#define MKD 307
  4139. X#define RMD 308
  4140. X#define PWD 309
  4141. X#define CDUP 310
  4142. X#define STOU 311
  4143. X#define SMNT 312
  4144. X#define SYST 313
  4145. X#define SIZE 314
  4146. X#define MDTM 315
  4147. X#define UMASK 316
  4148. X#define IDLE 317
  4149. X#define CHMOD 318
  4150. X#define LEXERR 319
  4151. END_OF_FILE
  4152. if test 1038 -ne `wc -c <'test/ftp.tab.h'`; then
  4153.     echo shar: \"'test/ftp.tab.h'\" unpacked with wrong size!
  4154. fi
  4155. # end of 'test/ftp.tab.h'
  4156. fi
  4157. if test -f 'verbose.c' -a "${1}" != "-c" ; then 
  4158.   echo shar: Will not clobber existing file \"'verbose.c'\"
  4159. else
  4160. echo shar: Extracting \"'verbose.c'\" \(6329 characters\)
  4161. sed "s/^X//" >'verbose.c' <<'END_OF_FILE'
  4162. X
  4163. X#include "defs.h"
  4164. X
  4165. X
  4166. Xstatic short *null_rules;
  4167. X
  4168. Xverbose()
  4169. X{
  4170. X    register int i;
  4171. X
  4172. X    if (!vflag) return;
  4173. X
  4174. X    null_rules = (short *) MALLOC(nrules*sizeof(short));
  4175. X    if (null_rules == 0) no_space();
  4176. X    fprintf(verbose_file, "\f\n");
  4177. X    for (i = 0; i < nstates; i++)
  4178. X    print_state(i);
  4179. X    FREE(null_rules);
  4180. X
  4181. X    if (nunused)
  4182. X    log_unused();
  4183. X    if (SRtotal || RRtotal)
  4184. X    log_conflicts();
  4185. X
  4186. X    fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens,
  4187. X        nvars);
  4188. X    fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates);
  4189. X}
  4190. X
  4191. X
  4192. Xlog_unused()
  4193. X{
  4194. X    register int i;
  4195. X    register short *p;
  4196. X
  4197. X    fprintf(verbose_file, "\n\nRules never reduced:\n");
  4198. X    for (i = 3; i < nrules; ++i)
  4199. X    {
  4200. X    if (!rules_used[i])
  4201. X    {
  4202. X        fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]);
  4203. X        for (p = ritem + rrhs[i]; *p >= 0; ++p)
  4204. X        fprintf(verbose_file, " %s", symbol_name[*p]);
  4205. X        fprintf(verbose_file, "  (%d)\n", i - 2);
  4206. X    }
  4207. X    }
  4208. X}
  4209. X
  4210. X
  4211. Xlog_conflicts()
  4212. X{
  4213. X    register int i;
  4214. X
  4215. X    fprintf(verbose_file, "\n\n");
  4216. X    for (i = 0; i < nstates; i++)
  4217. X    {
  4218. X    if (SRconflicts[i] || RRconflicts[i])
  4219. X    {
  4220. X        fprintf(verbose_file, "State %d contains ", i);
  4221. X        if (SRconflicts[i] == 1)
  4222. X        fprintf(verbose_file, "1 shift/reduce conflict");
  4223. X        else if (SRconflicts[i] > 1)
  4224. X        fprintf(verbose_file, "%d shift/reduce conflicts",
  4225. X            SRconflicts[i]);
  4226. X        if (SRconflicts[i] && RRconflicts[i])
  4227. X        fprintf(verbose_file, ", ");
  4228. X        if (RRconflicts[i] == 1)
  4229. X        fprintf(verbose_file, "1 reduce/reduce conflict");
  4230. X        else if (RRconflicts[i] > 1)
  4231. X        fprintf(verbose_file, "%d reduce/reduce conflicts",
  4232. X            RRconflicts[i]);
  4233. X        fprintf(verbose_file, ".\n");
  4234. X    }
  4235. X    }
  4236. X}
  4237. X
  4238. X
  4239. Xprint_state(state)
  4240. Xint state;
  4241. X{
  4242. X    if (state)
  4243. X    fprintf(verbose_file, "\n\n");
  4244. X    if (SRconflicts[state] || RRconflicts[state])
  4245. X    print_conflicts(state);
  4246. X    fprintf(verbose_file, "state %d\n", state);
  4247. X    print_core(state);
  4248. X    print_nulls(state);
  4249. X    print_actions(state);
  4250. X}
  4251. X
  4252. X
  4253. Xprint_conflicts(state)
  4254. Xint state;
  4255. X{
  4256. X    register int symbol, act, number;
  4257. X    register action *p;
  4258. X
  4259. X    symbol = -1;
  4260. X    for (p = parser[state]; p; p = p->next)
  4261. X    {
  4262. X    if (p->suppressed == 2)
  4263. X        continue;
  4264. X
  4265. X    if (p->symbol != symbol)
  4266. X    {
  4267. X        symbol = p->symbol;
  4268. X        number = p->number;
  4269. X        if (p->action_code == SHIFT)
  4270. X        act = SHIFT;
  4271. X        else
  4272. X        act = REDUCE;
  4273. X    }
  4274. X    else if (p->suppressed == 1)
  4275. X    {
  4276. X        if (state == final_state && symbol == 0)
  4277. X        {
  4278. X        fprintf(verbose_file, "%d: shift/reduce conflict \
  4279. X(accept, reduce %d) on $end\n", state, p->number - 2);
  4280. X        }
  4281. X        else
  4282. X        {
  4283. X        if (act == SHIFT)
  4284. X        {
  4285. X            fprintf(verbose_file, "%d: shift/reduce conflict \
  4286. X(shift %d, reduce %d) on %s\n", state, number, p->number - 2,
  4287. X                symbol_name[symbol]);
  4288. X        }
  4289. X        else
  4290. X        {
  4291. X            fprintf(verbose_file, "%d: reduce/reduce conflict \
  4292. X(reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2,
  4293. X                symbol_name[symbol]);
  4294. X        }
  4295. X        }
  4296. X    }
  4297. X    }
  4298. X}
  4299. X
  4300. X
  4301. Xprint_core(state)
  4302. Xint state;
  4303. X{
  4304. X    register int i;
  4305. X    register int k;
  4306. X    register int rule;
  4307. X    register core *statep;
  4308. X    register short *sp;
  4309. X    register short *sp1;
  4310. X
  4311. X    statep = state_table[state];
  4312. X    k = statep->nitems;
  4313. X
  4314. X    for (i = 0; i < k; i++)
  4315. X    {
  4316. X    sp1 = sp = ritem + statep->items[i];
  4317. X
  4318. X    while (*sp >= 0) ++sp;
  4319. X    rule = -(*sp);
  4320. X    fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]);
  4321. X
  4322. X        for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
  4323. X        fprintf(verbose_file, "%s ", symbol_name[*sp]);
  4324. X
  4325. X    putc('.', verbose_file);
  4326. X
  4327. X    while (*sp >= 0)
  4328. X    {
  4329. X        fprintf(verbose_file, " %s", symbol_name[*sp]);
  4330. X        sp++;
  4331. X    }
  4332. X    fprintf(verbose_file, "  (%d)\n", -2 - *sp);
  4333. X    }
  4334. X}
  4335. X
  4336. X
  4337. Xprint_nulls(state)
  4338. Xint state;
  4339. X{
  4340. X    register action *p;
  4341. X    register int i, j, k, nnulls;
  4342. X
  4343. X    nnulls = 0;
  4344. X    for (p = parser[state]; p; p = p->next)
  4345. X    {
  4346. X    if (p->action_code == REDUCE &&
  4347. X        (p->suppressed == 0 || p->suppressed == 1))
  4348. X    {
  4349. X        i = p->number;
  4350. X        if (rrhs[i] + 1 == rrhs[i+1])
  4351. X        {
  4352. X        for (j = 0; j < nnulls && i > null_rules[j]; ++j)
  4353. X            continue;
  4354. X
  4355. X        if (j == nnulls)
  4356. X        {
  4357. X            ++nnulls;
  4358. X            null_rules[j] = i;
  4359. X        }
  4360. X        else if (i != null_rules[j])
  4361. X        {
  4362. X            ++nnulls;
  4363. X            for (k = nnulls - 1; k > j; --k)
  4364. X            null_rules[k] = null_rules[k-1];
  4365. X            null_rules[j] = i;
  4366. X        }
  4367. X        }
  4368. X    }
  4369. X    }
  4370. X
  4371. X    for (i = 0; i < nnulls; ++i)
  4372. X    {
  4373. X    j = null_rules[i];
  4374. X    fprintf(verbose_file, "\t%s : .  (%d)\n", symbol_name[rlhs[j]],
  4375. X        j - 2);
  4376. X    }
  4377. X    fprintf(verbose_file, "\n");
  4378. X}
  4379. X
  4380. X
  4381. Xprint_actions(stateno)
  4382. Xint stateno;
  4383. X{
  4384. X    register action *p;
  4385. X    register shifts *sp;
  4386. X    register int as;
  4387. X
  4388. X    if (stateno == final_state)
  4389. X    fprintf(verbose_file, "\t$end  accept\n");
  4390. X
  4391. X    p = parser[stateno];
  4392. X    if (p)
  4393. X    {
  4394. X    print_shifts(p);
  4395. X    print_reductions(p, defred[stateno]);
  4396. X    }
  4397. X
  4398. X    sp = shift_table[stateno];
  4399. X    if (sp && sp->nshifts > 0)
  4400. X    {
  4401. X    as = accessing_symbol[sp->shift[sp->nshifts - 1]];
  4402. X    if (ISVAR(as))
  4403. X        print_gotos(stateno);
  4404. X    }
  4405. X}
  4406. X
  4407. X
  4408. Xprint_shifts(p)
  4409. Xregister action *p;
  4410. X{
  4411. X    register int count;
  4412. X    register action *q;
  4413. X
  4414. X    count = 0;
  4415. X    for (q = p; q; q = q->next)
  4416. X    {
  4417. X    if (q->suppressed < 2 && q->action_code == SHIFT)
  4418. X        ++count;
  4419. X    }
  4420. X
  4421. X    if (count > 0)
  4422. X    {
  4423. X    for (; p; p = p->next)
  4424. X    {
  4425. X        if (p->action_code == SHIFT && p->suppressed == 0)
  4426. X        fprintf(verbose_file, "\t%s  shift %d\n",
  4427. X                symbol_name[p->symbol], p->number);
  4428. X    }
  4429. X    }
  4430. X}
  4431. X
  4432. X
  4433. Xprint_reductions(p, defred)
  4434. Xregister action *p;
  4435. Xregister int defred;
  4436. X{
  4437. X    register int k, anyreds;
  4438. X    register action *q;
  4439. X
  4440. X    anyreds = 0;
  4441. X    for (q = p; q ; q = q->next)
  4442. X    {
  4443. X    if (q->action_code == REDUCE && q->suppressed < 2)
  4444. X    {
  4445. X        anyreds = 1;
  4446. X        break;
  4447. X    }
  4448. X    }
  4449. X
  4450. X    if (anyreds == 0)
  4451. X    fprintf(verbose_file, "\t.  error\n");
  4452. X    else
  4453. X    {
  4454. X    for (; p; p = p->next)
  4455. X    {
  4456. X        if (p->action_code == REDUCE && p->number != defred)
  4457. X        {
  4458. X        k = p->number - 2;
  4459. X        if (p->suppressed == 0)
  4460. X            fprintf(verbose_file, "\t%s  reduce %d\n",
  4461. X                symbol_name[p->symbol], k);
  4462. X        }
  4463. X    }
  4464. X
  4465. X        if (defred > 0)
  4466. X        fprintf(verbose_file, "\t.  reduce %d\n", defred - 2);
  4467. X    }
  4468. X}
  4469. X
  4470. X
  4471. Xprint_gotos(stateno)
  4472. Xint stateno;
  4473. X{
  4474. X    register int i, k;
  4475. X    register int as;
  4476. X    register short *to_state;
  4477. X    register shifts *sp;
  4478. X
  4479. X    putc('\n', verbose_file);
  4480. X    sp = shift_table[stateno];
  4481. X    to_state = sp->shift;
  4482. X    for (i = 0; i < sp->nshifts; ++i)
  4483. X    {
  4484. X    k = to_state[i];
  4485. X    as = accessing_symbol[k];
  4486. X    if (ISVAR(as))
  4487. X        fprintf(verbose_file, "\t%s  goto %d\n", symbol_name[as], k);
  4488. X    }
  4489. X}
  4490. X
  4491. END_OF_FILE
  4492. if test 6329 -ne `wc -c <'verbose.c'`; then
  4493.     echo shar: \"'verbose.c'\" unpacked with wrong size!
  4494. fi
  4495. # end of 'verbose.c'
  4496. fi
  4497. if test -f 'warshall.c' -a "${1}" != "-c" ; then 
  4498.   echo shar: Will not clobber existing file \"'warshall.c'\"
  4499. else
  4500. echo shar: Extracting \"'warshall.c'\" \(1191 characters\)
  4501. sed "s/^X//" >'warshall.c' <<'END_OF_FILE'
  4502. X#include "defs.h"
  4503. X
  4504. Xtransitive_closure(R, n)
  4505. Xunsigned *R;
  4506. Xint n;
  4507. X{
  4508. X    register int rowsize;
  4509. X    register unsigned i;
  4510. X    register unsigned *rowj;
  4511. X    register unsigned *rp;
  4512. X    register unsigned *rend;
  4513. X    register unsigned *ccol;
  4514. X    register unsigned *relend;
  4515. X    register unsigned *cword;
  4516. X    register unsigned *rowi;
  4517. X
  4518. X    rowsize = WORDSIZE(n);
  4519. X    relend = R + n*rowsize;
  4520. X
  4521. X    cword = R;
  4522. X    i = 0;
  4523. X    rowi = R;
  4524. X    while (rowi < relend)
  4525. X    {
  4526. X    ccol = cword;
  4527. X    rowj = R;
  4528. X
  4529. X    while (rowj < relend)
  4530. X    {
  4531. X        if (*ccol & (1 << i))
  4532. X        {
  4533. X        rp = rowi;
  4534. X        rend = rowj + rowsize;
  4535. X        while (rowj < rend)
  4536. X            *rowj++ |= *rp++;
  4537. X        }
  4538. X        else
  4539. X        {
  4540. X        rowj += rowsize;
  4541. X        }
  4542. X
  4543. X        ccol += rowsize;
  4544. X    }
  4545. X
  4546. X    if (++i >= BITS_PER_WORD)
  4547. X    {
  4548. X        i = 0;
  4549. X        cword++;
  4550. X    }
  4551. X
  4552. X    rowi += rowsize;
  4553. X    }
  4554. X}
  4555. X
  4556. Xreflexive_transitive_closure(R, n)
  4557. Xunsigned *R;
  4558. Xint n;
  4559. X{
  4560. X    register int rowsize;
  4561. X    register unsigned i;
  4562. X    register unsigned *rp;
  4563. X    register unsigned *relend;
  4564. X
  4565. X    transitive_closure(R, n);
  4566. X
  4567. X    rowsize = WORDSIZE(n);
  4568. X    relend = R + n*rowsize;
  4569. X
  4570. X    i = 0;
  4571. X    rp = R;
  4572. X    while (rp < relend)
  4573. X    {
  4574. X    *rp |= (1 << i);
  4575. X    if (++i >= BITS_PER_WORD)
  4576. X    {
  4577. X        i = 0;
  4578. X        rp++;
  4579. X    }
  4580. X
  4581. X    rp += rowsize;
  4582. X    }
  4583. X}
  4584. END_OF_FILE
  4585. if test 1191 -ne `wc -c <'warshall.c'`; then
  4586.     echo shar: \"'warshall.c'\" unpacked with wrong size!
  4587. fi
  4588. # end of 'warshall.c'
  4589. fi
  4590. if test -f 'yacc.1' -a "${1}" != "-c" ; then 
  4591.   echo shar: Will not clobber existing file \"'yacc.1'\"
  4592. else
  4593. echo shar: Extracting \"'yacc.1'\" \(2353 characters\)
  4594. sed "s/^X//" >'yacc.1' <<'END_OF_FILE'
  4595. X.\"    %W%    %R% (Berkeley) %E%
  4596. X.\"
  4597. X.TH YACC 1 "July\ 15,\ 1990"
  4598. X.UC 6
  4599. X.SH NAME
  4600. XYacc \- an LALR(1) parser generator
  4601. X.SH SYNOPSIS
  4602. X.B yacc [ -dlrtv ] [ -b
  4603. X.I file_prefix
  4604. X.B ] [ -p
  4605. X.I symbol_prefix
  4606. X.B ]
  4607. X.I filename
  4608. X.SH DESCRIPTION
  4609. X.I Yacc
  4610. Xreads the grammar specification in the file
  4611. X.I filename
  4612. Xand generates an LR(1) parser for it.
  4613. XThe parsers consist of a set of LALR(1) parsing tables and a driver routine
  4614. Xwritten in the C programming language.
  4615. X.I Yacc
  4616. Xnormally writes the parse tables and the driver routine to the file
  4617. X.IR y.tab.c.
  4618. X.PP
  4619. XThe following options are available:
  4620. X.RS
  4621. X.TP
  4622. X\fB-b \fIfile_prefix\fR
  4623. XThe
  4624. X.B -b
  4625. Xoption changes the prefix prepended to the output file names to
  4626. Xthe string denoted by
  4627. X.IR file_prefix.
  4628. XThe default prefix is the character
  4629. X.IR y.
  4630. X.TP
  4631. X.B -d
  4632. XThe \fB-d\fR option causes the header file
  4633. X.IR y.tab.h
  4634. Xto be written.
  4635. X.TP
  4636. X.B -l
  4637. XIf the
  4638. X.B -l
  4639. Xoption is not specified,
  4640. X.I yacc
  4641. Xwill insert \#line directives in the generated code.
  4642. XThe \#line directives let the C compiler relate errors in the
  4643. Xgenerated code to the user's original code.
  4644. XIf the \fB-l\fR option is specified,
  4645. X.I yacc
  4646. Xwill not insert the \#line directives.
  4647. X\&\#line directives specified by the user will be retained.
  4648. X.TP
  4649. X\fB-p \fIsymbol_prefix\fR
  4650. XThe
  4651. X.B -p
  4652. Xoption changes the prefix prepended to yacc-generated symbols to
  4653. Xthe string denoted by
  4654. X.IR symbol_prefix.
  4655. XThe default prefix is the string
  4656. X.IR yy.
  4657. X.TP
  4658. X.B -r
  4659. XThe
  4660. X.B -r
  4661. Xoption causes
  4662. X.I yacc
  4663. Xto produce separate files for code and tables.  The code file
  4664. Xis named
  4665. X.IR y.code.c,
  4666. Xand the tables file is named
  4667. X.IR y.tab.c.
  4668. X.TP
  4669. X.B -t
  4670. XThe
  4671. X.B -t
  4672. Xoption changes the preprocessor directives generated by
  4673. X.I yacc
  4674. Xso that debugging statements will be incorporated in the compiled code.
  4675. X.TP
  4676. X.B -v
  4677. XThe
  4678. X.B -v
  4679. Xoption causes a human-readable description of the generated parser to
  4680. Xbe written to the file
  4681. X.IR y.output.
  4682. X.RE
  4683. X.PP
  4684. XIf the environment variable TMPDIR is set, the string denoted by
  4685. XTMPDIR will be used as the name of the directory where the temporary
  4686. Xfiles are created.
  4687. X.SH FILES
  4688. X.IR y.code.c
  4689. X.br
  4690. X.IR y.tab.c
  4691. X.br
  4692. X.IR y.tab.h
  4693. X.br
  4694. X.IR y.output
  4695. X.br
  4696. X.IR /tmp/yacc.aXXXXXX
  4697. X.br
  4698. X.IR /tmp/yacc.tXXXXXX
  4699. X.br
  4700. X.IR /tmp/yacc.uXXXXXX
  4701. X.SH DIAGNOSTICS
  4702. XIf there are rules that are never reduced, the number of such rules is
  4703. Xreported on standard error.
  4704. XIf there are any LALR(1) conflicts, the number of conflicts is reported
  4705. Xon standard error.
  4706. END_OF_FILE
  4707. if test 2353 -ne `wc -c <'yacc.1'`; then
  4708.     echo shar: \"'yacc.1'\" unpacked with wrong size!
  4709. fi
  4710. # end of 'yacc.1'
  4711. fi
  4712. echo shar: End of archive 1 \(of 3\).
  4713. cp /dev/null ark1isdone
  4714. MISSING=""
  4715. for I in 1 2 3 ; do
  4716.     if test ! -f ark${I}isdone ; then
  4717.     MISSING="${MISSING} ${I}"
  4718.     fi
  4719. done
  4720. if test "${MISSING}" = "" ; then
  4721.     echo You have unpacked all 3 archives.
  4722.     rm -f ark[1-9]isdone
  4723. else
  4724.     echo You still need to unpack the following archives:
  4725.     echo "        " ${MISSING}
  4726. fi
  4727. ##  End of shell archive.
  4728. exit 0
  4729.