[comp.sources.misc] REPOST: v19i093: wacco - A C++ LL parser generator, Part06/06

parag@hpsdeb.sde.hp.com (Parag Patel) (05/19/91)

Submitted-by: Parag Patel <parag@hpsdeb.sde.hp.com>
Posting-number: Volume 19, Issue 93
Archive-name: wacco/part06

#!/bin/sh
# do not concatenate these parts, unpack them in order with /bin/sh
# file wacco.doc.ps continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 6; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
	echo 'x - still skipping wacco.doc.ps'
else
echo 'x - continuing file wacco.doc.ps'
sed 's/^X//' << 'SHAR_EOF' >> 'wacco.doc.ps' &&
(If ) s sp (there ) s -5.680 nx sp (is ) s -5.660 nx sp (a ) s sp (") s
(Courier02400240) getfont ($$) s (Palatino-Roman02400240) getfont (", ) s
-5.680 nx sp (every ) s -5.660 nx sp (terminal ) s sp (must ) s -5.680 nx sp (have ) s
-5.660 nx sp (a ) s sp (lexical ) s -5.680 nx sp (value ) s -5.660 nx sp 3237 ss
1442 3237 m (Palatino-Roman02400240) getfont (associated ) s 26.160 nx sp (with ) s
sp (it. ) s 26.180 nx sp ( ) s 26.160 nx sp (Character ) s sp (and ) s 26.180 nx sp (string ) s
26.160 nx sp (constants ) s sp (are ) s 26.180 nx sp (self-defining. ) s 26.160 nx sp
( ) s sp (Other ) s 26.180 nx sp (non-terminals ) s 26.160 nx sp 3525 ss 1442 3525 m
(Palatino-Roman02400240) getfont (need to be described in the lex section.) s
3853 ss 1440 3853 m (Palatino-Roman02400240) getfont 4181 ss 1440 4181 m
(Palatino-Roman02400240) getfont (An example wacco source file with scanner:) s
4509 ss 1440 4509 m (Palatino-Roman02400240) getfont
(Courier02400240) getfont 4837 ss 1440 4837 m (Courier02400240) getfont
720.000 nx sp (expr: LPAREN expr RPAREN | "id" | [];) s 5165 ss 1440 5165 m
(Courier02400240) getfont 5493 ss 1440 5493 m (Courier02400240) getfont sp ($$) s
5821 ss 1440 5821 m (Courier02400240) getfont 6149 ss 1440 6149 m
(Courier02400240) getfont sp (%%) s 6477 ss 1440 6477 m
(Courier02400240) getfont 6805 ss 1440 6805 m (Courier02400240) getfont sp (".") s
1008.000 nx sp 1440.000 nx sp ({ return \(int\)EOI; }) s 7133 ss 1440 7133 m
(Courier02400240) getfont 7461 ss 1440 7461 m (Courier02400240) getfont
720.000 nx sp ($LPAREN) s 432.000 nx sp 1440.000 nx sp ("\("|"[") s 7789 ss
1440 7789 m (Courier02400240) getfont 720.000 nx sp ($RPAREN) s 432.000 nx sp
1440.000 nx sp ("\)"|"]") s 8117 ss 1440 8117 m (Courier02400240) getfont
8445 ss 1440 8445 m (Courier02400240) getfont 720.000 nx sp ([ \\t\\v\\n\\f]) s
1296.000 nx sp (;) s 8773 ss 1440 8773 m (Courier02400240) getfont 720.000 nx sp
(.  { w_scanerr\("Illegal character %d \(%c\)",) s 9101 ss 1440 9101 m
(Courier02400240) getfont sp 1440.000 nx sp (yytext[0], yytext[0]\); }) s
(Palatino-Roman02400240) getfont 9429 ss 1440 9429 m
(Palatino-Roman02400240) getfont 9757 ss 1440 9757 m
(Palatino-Roman02400240) getfont (The ) s 17.320 nx sp (string ) s 17.340 nx sp (") s
(Courier02400240) getfont (id) s (Palatino-Roman02400240) getfont (" ) s sp (naturally ) s
17.320 nx sp (stands ) s 17.340 nx sp (for ) s sp (itself. ) s 17.320 nx sp ( ) s
17.340 nx sp (Palatino-Italic02400240) getfont (LPAREN) s
(Palatino-Roman02400240) getfont ( ) s sp (and ) s 17.320 nx sp
(Palatino-Italic02400240) getfont (RPAREN) s (Palatino-Roman02400240) getfont ( ) s
17.340 nx sp (are ) s sp (described ) s 17.320 nx sp (in ) s 17.340 nx sp (the ) s sp (lex ) s
17.320 nx sp 10045 ss 1442 10045 m (Palatino-Roman02400240) getfont (section ) s
4.000 nx sp (in ) s sp (reverse ) s sp (order ) s sp (from ) s sp (a ) s sp (normal ) s sp (lex ) s
sp (file. ) s sp ( ) s sp (Wacco ) s sp (will ) s sp (convert ) s sp (those ) s sp (lines ) s sp (starting ) s
sp (with ) s sp 10333 ss 1442 10333 m (Palatino-Roman02400240) getfont (a ) s
26.640 nx sp (") s (Courier02400240) getfont ($) s (Palatino-Roman02400240) getfont
(" ) s sp (into ) s 26.660 nx sp (the ) s 26.640 nx sp (appropriate ) s sp (lex ) s
26.660 nx sp (output. ) s 26.640 nx sp (This ) s sp (is ) s 26.660 nx sp (not ) s
26.640 nx sp (only ) s sp (to ) s 26.660 nx sp (make ) s 26.640 nx sp (sure ) s sp (that ) s
26.660 nx sp (all ) s 26.640 nx sp (terminals ) s 26.660 nx sp (are ) s 26.640 nx sp
10621 ss 1442 10621 m (Palatino-Roman02400240) getfont (defined, ) s
14.380 nx sp (but ) s sp (allows ) s sp (defining ) s sp (a ) s 14.400 nx sp (language ) s
14.380 nx sp (without ) s sp (ever ) s sp (having ) s 14.400 nx sp (to ) s 14.380 nx sp (manually ) s
sp (define ) s sp (token ) s 14.400 nx sp (ids ) s 14.380 nx sp 10909 ss 1442 10909 m
(Palatino-Roman02400240) getfont (for any terminal symbol!) s 11237 ss
1440 11237 m (Palatino-Roman02400240) getfont 11565 ss 1440 11565 m
(Palatino-Roman02400240) getfont (AvantGarde-Demi02800280) getfont 11941 ss
1440 11941 m (AvantGarde-Demi02800280) getfont (Default scanner) s
(Palatino-Roman02400240) getfont 12269 ss 1440 12269 m
(Palatino-Roman02400240) getfont 12597 ss 1440 12597 m
(Palatino-Roman02400240) getfont (The ) s 12.680 nx sp (default ) s sp (scanner ) s
12.700 nx sp (\(located ) s 12.680 nx sp (in ) s sp (-lwacco\) ) s 12.700 nx sp (maintains ) s
12.680 nx sp (its ) s 12.700 nx sp (own ) s 12.680 nx sp (I/O ) s sp (file ) s
12.700 nx sp (pointer. ) s 12.680 nx sp ( ) s sp (This ) s 12.700 nx sp (is ) s
12.680 nx sp (so ) s 12.700 nx sp (that ) s 12.680 nx sp 12885 ss 1442 12885 m
(Palatino-Roman02400240) getfont (user ) s 3.420 nx sp (code ) s sp (can ) s
3.440 nx sp (implement ) s 3.420 nx sp (the ) s 3.440 nx sp (equivalent ) s
3.420 nx sp (of ) s 3.440 nx sp (") s (Courier02400240) getfont (#include) s
(Palatino-Roman02400240) getfont (" ) s 3.420 nx sp (without ) s sp (too ) s
3.440 nx sp (much ) s 3.420 nx sp (work. ) s 3.440 nx sp ( ) s 3.420 nx sp (The ) s
3.440 nx sp (func-) s 13173 ss 1442 13173 m (Palatino-Roman02400240) getfont (tions in the scanner include:) s
13501 ss 1440 13501 m (Palatino-Roman02400240) getfont 13829 ss 1440 13829 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (int w_openfile\(char *fname\)) s
(Palatino-Roman02400240) getfont 432.000 nx sp (// open a file to the specified name) s
14157 ss 1440 14157 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (void w_closefile\(\)) s
(Palatino-Roman02400240) getfont 288.000 nx sp 1440.000 nx sp (// close the last opened file) s
14485 ss 1440 14485 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (void w_setfile\(FILE *f\)) s
(Palatino-Roman02400240) getfont 1008.000 nx sp (// set the current file to this) s
NP 7020 1725 m 5580 1725 l GS 0.00 SG 1 SLW ST GR 5580 1725 m
showpage vm_state restore
X
X
save /vm_state E def [1 0 0 -1 0 0] concat 0.050000 0.050000 SC .5 SLW
0 -15840 TR 0 RO
0 0 0 15840 12240 15840 12240 0 pageboundary clip
userdict /#copies 1 put statusdict /manualfeed false put 1253 ss 1440 1253 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (FILE *w_getfile\(\)) s
(Palatino-Roman02400240) getfont 432.000 nx sp 1440.000 nx sp (// return the currently opened file) s
1581 ss 1440 1581 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (int w_currcol\(\)) s (Palatino-Roman02400240) getfont
sp 1440.000 nx sp (// the current column in the input) s 1909 ss 1440 1909 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (int w_currline\(\)) s
(Palatino-Roman02400240) getfont 576.000 nx sp 1440.000 nx sp (// the current line in the input) s
2237 ss 1440 2237 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (char *w_getcurrline\(\)) s
(Palatino-Roman02400240) getfont 1296.000 nx sp (// the text of the current line) s
2565 ss 1440 2565 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (int w_input\(\)) s 1008.000 nx sp
(Palatino-Roman02400240) getfont 1440.000 nx sp (// basic I/O routines which are) s
2893 ss 1440 2893 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (int w_unput\(int c\)) s
(Palatino-Roman02400240) getfont 288.000 nx sp 1440.000 nx sp (//          to be used by the scanner) s
3221 ss 1440 3221 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (void w_output\(int c\)) s
(Palatino-Roman02400240) getfont 3549 ss 1440 3549 m
(Palatino-Roman02400240) getfont 3877 ss 1440 3877 m
(Palatino-Roman02400240) getfont (You ) s 30.240 nx sp (should ) s 30.260 nx sp (call ) s
30.240 nx sp (either ) s 30.260 nx sp (Courier02400240) getfont (w_setfile\(\)) s
(Palatino-Roman02400240) getfont ( ) s 30.240 nx sp (or ) s 30.260 nx sp
(Courier02400240) getfont (w_openfile\(\)) s (Palatino-Roman02400240) getfont ( ) s
30.240 nx sp (before ) s 30.260 nx sp (starting ) s 30.240 nx sp (the ) s 30.260 nx sp
(parse ) s 30.240 nx sp (or ) s 30.260 nx sp (the ) s 30.240 nx sp 4165 ss 1442 4165 m
(Palatino-Roman02400240) getfont (default scanner will probably dump core.) s
4493 ss 1440 4493 m (Palatino-Roman02400240) getfont 4821 ss 1440 4821 m
(Palatino-Roman02400240) getfont (AvantGarde-Demi02800280) getfont 5197 ss
1440 5197 m (AvantGarde-Demi02800280) getfont (Parser's requirements) s
(Palatino-Roman02400240) getfont 5525 ss 1440 5525 m
(Palatino-Roman02400240) getfont 5853 ss 1440 5853 m
(Palatino-Roman02400240) getfont (The functions that the parser expects to have available are:) s
6181 ss 1440 6181 m (Palatino-Roman02400240) getfont 6509 ss 1440 6509 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (int w_gettoken\(\)) s
(Palatino-Roman02400240) getfont 576.000 nx sp 1440.000 nx sp (// get the next token - usually calls yylex\(\)) s
6837 ss 1440 6837 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp sp (// - must return ) s (Palatino-Italic02400240) getfont (EOI) s
(Palatino-Roman02400240) getfont ( on end-of-input) s 7165 ss 1440 7165 m
(Palatino-Roman02400240) getfont 7493 ss 1440 7493 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (int w_scanerr\(\)) s
(Palatino-Roman02400240) getfont sp 1440.000 nx sp (// printf-type error printing routine) s
7821 ss 1440 7821 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp sp (// - must always returns ) s
(Palatino-Italic02400240) getfont (RETERR) s (Palatino-Roman02400240) getfont
8149 ss 1440 8149 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp sp (// - is called with a ) s
(Palatino-Italic02400240) getfont (NULL) s (Palatino-Roman02400240) getfont ( argument) s
8477 ss 1440 8477 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp sp (// when just skipping a token in the input) s 8805 ss
1440 8805 m (Palatino-Roman02400240) getfont 9133 ss 1440 9133 m
(Palatino-Roman02400240) getfont (These are either are in the wacco library -lwacco, or must be provided by the user.) s
9461 ss 1440 9461 m (Palatino-Roman02400240) getfont 9789 ss 1440 9789 m
(Palatino-Roman02400240) getfont (The ) s 24.460 nx sp (default ) s sp
(Courier02400240) getfont (w_scanerr\(\)) s (Palatino-Roman02400240) getfont ( ) s
24.480 nx sp (will ) s 24.460 nx sp (try ) s sp (to ) s 24.480 nx sp (print ) s
24.460 nx sp (the ) s sp (line ) s 24.480 nx sp (that ) s 24.460 nx sp (had ) s sp (the ) s
24.480 nx sp (error, ) s 24.460 nx sp (and ) s sp (underneath ) s 24.480 nx sp (it ) s
24.460 nx sp 10077 ss 1442 10077 m (Palatino-Roman02400240) getfont (print ) s
29.300 nx sp (") s (Courier02400240) getfont (^) s (Palatino-Roman02400240) getfont
(" ) s sp (where ) s 29.320 nx sp (the ) s 29.300 nx sp (error ) s sp (occurred ) s
29.320 nx sp (and ) s 29.300 nx sp (") s (Courier02400240) getfont (*) s
(Palatino-Roman02400240) getfont (" ) s 29.320 nx sp (where ) s 29.300 nx sp (tokens ) s
sp (were ) s 29.320 nx sp (skipped ) s 29.300 nx sp (when ) s 29.320 nx sp (re-syncing. ) s
29.300 nx sp ( ) s sp 10365 ss 1442 10365 m (Palatino-Roman02400240) getfont (Because of some lex\(1\) funnies, this doesn't always work as expected.) s
10693 ss 1440 10693 m (Palatino-Roman02400240) getfont 11021 ss 1440 11021 m
(Palatino-Roman02400240) getfont (AvantGarde-Demi02800280) getfont 11397 ss
1440 11397 m (AvantGarde-Demi02800280) getfont (Parser functions) s
(Palatino-Roman02400240) getfont 11725 ss 1440 11725 m
(Palatino-Roman02400240) getfont 12053 ss 1440 12053 m
(Palatino-Roman02400240) getfont (Some other convenient functions defined in ) s
(Palatino-Italic02400240) getfont (parser.C) s (Palatino-Roman02400240) getfont
( include:) s 12381 ss 1440 12381 m (Palatino-Roman02400240) getfont 12709 ss
1440 12709 m (Palatino-Roman02400240) getfont 720.000 nx sp
(Courier02400240) getfont (int w_nexttoken\() s (Palatino-Roman02400240) getfont
(\)) s 497.000 nx sp (// return the value of the next token but don't) s 13037 ss
1440 13037 m (Palatino-Roman02400240) getfont 720.000 nx sp 1440.000 nx sp sp
(// scan it yet - calls ) s (Courier02400240) getfont (w_gettoken\(\)) s
(Palatino-Roman02400240) getfont ( at most once) s 13365 ss 1440 13365 m
(Palatino-Roman02400240) getfont 720.000 nx sp 1440.000 nx sp sp (// - useful for token look-ahead) s
13693 ss 1440 13693 m (Palatino-Roman02400240) getfont 14021 ss 1440 14021 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (void w_skiptoken\(\)) s
(Palatino-Roman02400240) getfont 288.000 nx sp (// scan the current token - the next call to) s
14349 ss 1440 14349 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp (// ) s (Courier02400240) getfont (w_nexttoken\(\)) s
(Palatino-Roman02400240) getfont ( will actually read another token) s 14677 ss
1440 14677 m (Palatino-Roman02400240) getfont showpage vm_state restore
X
X
save /vm_state E def [1 0 0 -1 0 0] concat 0.050000 0.050000 SC .5 SLW
0 -15840 TR 0 RO
0 0 0 15840 12240 15840 12240 0 pageboundary clip
userdict /#copies 1 put statusdict /manualfeed false put 1253 ss 1440 1253 m
(Palatino-Roman02400240) getfont 720.000 nx sp (Courier02400240) getfont (char *w_tokenname\(int tokid\)) s
(Palatino-Roman02400240) getfont 288.000 nx sp (// return the string name of a token) s
1581 ss 1440 1581 m (Palatino-Roman02400240) getfont 720.000 nx sp
1440.000 nx sp sp sp (// whose id is tokid) s 1909 ss 1440 1909 m
(Palatino-Roman02400240) getfont 2237 ss 1440 2237 m
(Palatino-Roman02400240) getfont (T) s 5.120 nx sp (h) s sp (e) s 5.140 nx sp (s) s
5.120 nx sp (e ) s 30.000 nx sp (a) s 5.120 nx sp (r) s 5.140 nx sp (e ) s 30.000 nx sp (o) s
5.120 nx sp (n) s sp (l) s 5.140 nx sp (y ) s 30.000 nx sp (r) s 5.120 nx sp (e) s
5.140 nx sp (a) s 5.120 nx sp (l) s sp (l) s 5.140 nx sp (y ) s 30.000 nx sp (u) s
5.120 nx sp (s) s sp (e) s 5.140 nx sp (f) s 5.120 nx sp (u) s sp (l ) s 30.000 nx sp (i) s
5.140 nx sp (f ) s 30.000 nx sp (y) s 5.120 nx sp (o) s 5.140 nx sp (u ) s 30.000 nx sp (a) s
5.120 nx sp (r) s sp (e ) s 30.000 nx sp (w) s 5.140 nx sp (r) s 5.120 nx sp (i) s sp (t) s
5.140 nx sp (i) s 5.120 nx sp (n) s sp (g ) s 30.000 nx sp (y) s 5.140 nx sp (o) s
5.120 nx sp (u) s 5.140 nx sp (r ) s 30.000 nx sp (o) s 5.120 nx sp (w) s sp (n ) s
30.000 nx sp (s) s 5.140 nx sp (c) s 5.120 nx sp (a) s sp (n) s 5.140 nx sp (n) s
5.120 nx sp (e) s sp (r ) s 30.000 nx sp (i) s 5.140 nx sp (n) s 5.120 nx sp (s) s
5.140 nx sp (t) s 5.120 nx sp (e) s sp (a) s 5.140 nx sp (d ) s 30.000 nx sp (o) s
5.120 nx sp (f ) s 30.000 nx sp (u) s 5.120 nx sp (s) s 5.140 nx sp (i) s 5.120 nx sp (n) s
sp (g ) s 30.000 nx sp (l) s 5.140 nx sp (e) s 5.120 nx sp (x) s 5.140 nx sp (. ) s
30.000 nx sp ( ) s sp (Courier02400240) getfont 2525 ss 1442 2525 m
(Courier02400240) getfont (w_nexttoken\(\)) s (Palatino-Roman02400240) getfont ( ) s
15.060 nx sp (and ) s 15.080 nx sp (Courier02400240) getfont (w_skiptoken\(\)) s
(Palatino-Roman02400240) getfont ( ) s sp (can ) s sp (also ) s sp (be ) s sp (used ) s
15.060 nx sp (to ) s 15.080 nx sp (somewhat ) s sp (direct ) s sp (the ) s sp (parse. ) s sp
( ) s sp (If ) s 15.060 nx sp 2813 ss 1442 2813 m (Palatino-Roman02400240) getfont
(you ) s -3.920 nx sp (provide ) s sp (your ) s -3.940 nx sp (own ) s -3.920 nx sp (infinite ) s
-3.940 nx sp (push-back ) s -3.920 nx sp (stack ) s -3.940 nx sp (of ) s -3.920 nx sp
(tokens, ) s sp (you ) s -3.940 nx sp (can ) s -3.920 nx sp (completely ) s -3.940 nx sp
(alter ) s -3.920 nx sp (the ) s -3.940 nx sp (parse ) s -3.920 nx sp 3101 ss
1442 3101 m (Palatino-Roman02400240) getfont (at run-time!) s 3429 ss
1440 3429 m (Palatino-Roman02400240) getfont 3757 ss 1440 3757 m
(Palatino-Roman02400240) getfont (AvantGarde-Demi02800280) getfont 4133 ss
1440 4133 m (AvantGarde-Demi02800280) getfont (Flex) s
(Palatino-Roman02400240) getfont 4461 ss 1440 4461 m
(Palatino-Roman02400240) getfont 4789 ss 1440 4789 m
(Palatino-Roman02400240) getfont (The program ) s
(Palatino-Italic02400240) getfont (flex\(1\)) s (Palatino-Roman02400240) getfont
( may be used instead of ) s (Palatino-Italic02400240) getfont (lex\(1\)) s
(Palatino-Roman02400240) getfont ( if desired, and is highly recommended.) s
5117 ss 1440 5117 m (Palatino-Roman02400240) getfont 5445 ss 1440 5445 m
(Palatino-Roman02400240) getfont (T) s 2.620 nx sp (h) s sp (e ) s 30.000 nx sp (e) s
2.640 nx sp (x) s 2.620 nx sp (t) s 2.640 nx sp (e) s 2.620 nx sp (r) s 2.640 nx sp (n ) s
30.000 nx sp (f) s 2.620 nx sp (o) s 2.640 nx sp (r ) s 30.000 nx sp (") s
(Courier02400240) getfont 2.620 nx sp (y) s sp (y) s 2.640 nx sp (t) s 2.620 nx sp (e) s
2.640 nx sp (x) s 2.620 nx sp (t) s (Palatino-Roman02400240) getfont 2.640 nx sp (" ) s
30.000 nx sp (i) s 2.620 nx sp (s ) s 30.000 nx sp (a) s 2.640 nx sp (u) s 2.620 nx sp (t) s
2.640 nx sp (o) s 2.620 nx sp (m) s sp (a) s 2.640 nx sp (t) s 2.620 nx sp (i) s 2.640 nx sp
(c) s 2.620 nx sp (a) s 2.640 nx sp (l) s 2.620 nx sp (l) s 2.640 nx sp (y ) s 30.000 nx sp
(d) s 2.620 nx sp (e) s 2.640 nx sp (c) s 2.620 nx sp (l) s sp (a) s 2.640 nx sp (r) s
2.620 nx sp (e) s 2.640 nx sp (d ) s 30.000 nx sp (i) s 2.620 nx sp (n ) s 30.000 nx sp
(Palatino-Italic02400240) getfont (p) s 2.640 nx sp (a) s 2.620 nx sp (r) s
2.640 nx sp (s) s 2.620 nx sp (e) s sp (r) s 2.640 nx sp (.) s 2.620 nx sp (C) s
(Palatino-Roman02400240) getfont 2.640 nx sp (. ) s 30.000 nx sp (U) s 2.620 nx sp
(n) s 2.640 nx sp (f) s 2.620 nx sp (o) s 2.640 nx sp (r) s 2.620 nx sp (t) s 2.640 nx sp (u) s
2.620 nx sp (n) s sp (a) s 2.640 nx sp (t) s 2.620 nx sp (e) s 2.640 nx sp (l) s 2.620 nx sp
(y) s 2.640 nx sp (, ) s 30.000 nx sp (i) s 2.620 nx sp (t ) s 30.000 nx sp (m) s
2.640 nx sp (a) s 2.620 nx sp (y ) s 30.000 nx sp (b) s 2.640 nx sp (e ) s 30.000 nx sp
5733 ss 1442 5733 m (Palatino-Roman02400240) getfont (wrong ) s 17.000 nx sp (for ) s
sp (the ) s sp (scanner ) s sp (generator ) s sp (actually ) s sp (being ) s sp (used. ) s sp ( ) s
sp (To ) s sp (change ) s sp (the ) s sp (definition, ) s sp (the ) s sp (macro ) s sp
(Palatino-Italic02400240) getfont 6021 ss 1442 6021 m
(Palatino-Italic02400240) getfont (YYTEXT_DECL) s
(Palatino-Roman02400240) getfont ( may be redefined at the top of your wacco grammar if you wish to use flex:) s
6349 ss 1440 6349 m (Palatino-Roman02400240) getfont
(Courier02400240) getfont 6677 ss 1440 6677 m (Courier02400240) getfont
720.000 nx sp ({) s 7005 ss 1440 7005 m (Courier02400240) getfont sp (#undef YYTEXT_DECL) s
7333 ss 1440 7333 m (Courier02400240) getfont sp (#define YYTEXT_DECL char *yytext) s
7661 ss 1440 7661 m (Courier02400240) getfont sp (}) s 7989 ss 1440 7989 m
(Courier02400240) getfont sp (...) s (Palatino-Roman02400240) getfont 8317 ss
1440 8317 m (Palatino-Roman02400240) getfont (Palatino-Roman02400240) getfont
8645 ss 1440 8645 m (Palatino-Roman02400240) getfont
(Palatino-Roman02400240) getfont (Palatino-Roman02400240) getfont
showpage vm_state restore
X
X
save /vm_state E def [1 0 0 -1 0 0] concat 0.050000 0.050000 SC .5 SLW
0 -15840 TR 0 RO
0 0 0 15840 12240 15840 12240 0 pageboundary clip
userdict /#copies 1 put statusdict /manualfeed false put 1253 ss 1440 1253 m
(Palatino-Roman02400240) getfont (AvantGarde-Demi02400240) getfont 1677 ss
4196 1677 m (AvantGarde-Demi02400240) getfont ( ) s
(AvantGarde-Demi03200320) getfont (Example Wacco Grammar) s
(AvantGarde-Demi02400240) getfont (Palatino-Roman02400240) getfont 2005 ss
1440 2005 m (Palatino-Roman02400240) getfont 2333 ss 1440 2333 m
(Palatino-Roman02400240) getfont 2661 ss 1440 2661 m
(Palatino-Roman02400240) getfont (// This is the usual required calculator sample.  It can still use) s
2989 ss 1440 2989 m (Palatino-Roman02400240) getfont (// a LOT of work, but it illustrates the basics.  Note that the) s
3317 ss 1440 3317 m (Palatino-Roman02400240) getfont (// precedence of operators is all wrong.) s
3645 ss 1440 3645 m (Palatino-Roman02400240) getfont
(Courier02400240) getfont 3973 ss 1440 3973 m (Courier02400240) getfont ({) s
4301 ss 1440 4301 m (Courier02400240) getfont (#include <stdio.h>) s 4629 ss
1440 4629 m (Courier02400240) getfont (#include <stdlib.h>) s 4957 ss
1440 4957 m (Courier02400240) getfont (}) s 5285 ss 1440 5285 m
(Courier02400240) getfont 5613 ss 1440 5613 m (Courier02400240) getfont (calc) s
5941 ss 1440 5941 m (Courier02400240) getfont 720.000 nx sp (:) s 1296.000 nx sp
(%{) s 6269 ss 1440 6269 m (Courier02400240) getfont 720.000 nx sp
1440.000 nx sp sp (while \(w_nexttoken\(\) != EOI\) {) s 6597 ss 1440 6597 m
(Courier02400240) getfont 720.000 nx sp 1440.000 nx sp (%}) s 6925 ss
1440 6925 m (Courier02400240) getfont 720.000 nx sp 1440.000 nx sp (expr \([] | '=' | ';' | ','\)) s
7253 ss 1440 7253 m (Courier02400240) getfont 720.000 nx sp 1440.000 nx sp (%{) s
7581 ss 1440 7581 m (Courier02400240) getfont 720.000 nx sp 1440.000 nx sp sp
(printf\("%f\\n", $expr\);) s 7909 ss 1440 7909 m (Courier02400240) getfont
720.000 nx sp 1440.000 nx sp sp (}) s 8237 ss 1440 8237 m
(Courier02400240) getfont 720.000 nx sp 1440.000 nx sp (%}) s 8565 ss
1440 8565 m (Courier02400240) getfont 720.000 nx sp (| []) s 8893 ss 1440 8893 m
(Courier02400240) getfont sp (;) s 9221 ss 1440 9221 m (Courier02400240) getfont
9549 ss 1440 9549 m (Courier02400240) getfont (expr<double>) s 9877 ss
1440 9877 m (Courier02400240) getfont sp (:) s 1296.000 nx sp (term { $binop_expr = $term; }) s
10205 ss 1440 10205 m (Courier02400240) getfont 720.000 nx sp 1440.000 nx sp
sp (binop_expr { $$ = $binop_expr; }) s 10533 ss 1440 10533 m
(Courier02400240) getfont 720.000 nx sp (;) s 10861 ss 1440 10861 m
(Courier02400240) getfont 11189 ss 1440 11189 m (Courier02400240) getfont (binop_expr<double>) s
11517 ss 1440 11517 m (Courier02400240) getfont sp (:) s 1296.000 nx sp ('+' expr { $$ += $expr; }) s
11845 ss 1440 11845 m (Courier02400240) getfont 720.000 nx sp (|) s
1296.000 nx sp ('-' expr { $$ -= $expr; }) s 12173 ss 1440 12173 m
(Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp ('*' expr { $$ *= $expr; }) s
12501 ss 1440 12501 m (Courier02400240) getfont 720.000 nx sp (|) s
1296.000 nx sp ('/' expr { $$ /= $expr; }) s 12829 ss 1440 12829 m
(Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp ('&' expr { $$ = \(int\)$$ & \(int\)$expr; }) s
13157 ss 1440 13157 m (Courier02400240) getfont 720.000 nx sp (|) s
1296.000 nx sp ('|' expr { $$ = \(int\)$$ | \(int\)$expr; }) s 13485 ss
1440 13485 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp ('^' expr { $$ = \(int\)$$ ^ \(int\)$expr; }) s
13813 ss 1440 13813 m (Courier02400240) getfont 720.000 nx sp (|) s
1296.000 nx sp ("<<" expr { $$ = \(int\)$$ << \(int\)$expr; }) s 14141 ss
1440 14141 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp (">>" expr { $$ = \(int\)$$ >> \(int\)$expr; }) s
14469 ss 1440 14469 m (Courier02400240) getfont 720.000 nx sp (|) s
1296.000 nx sp ("&&" expr { $$ = $$ && $expr; }) s
NP 8415 1725 m 4260 1725 l GS 0.00 SG 1 SLW ST GR 4260 1725 m
showpage vm_state restore
X
X
save /vm_state E def [1 0 0 -1 0 0] concat 0.050000 0.050000 SC .5 SLW
0 -15840 TR 0 RO
0 0 0 15840 12240 15840 12240 0 pageboundary clip
userdict /#copies 1 put statusdict /manualfeed false put 1253 ss 1440 1253 m
(Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp ("||" expr { $$ = $$ || $expr; }) s
1581 ss 1440 1581 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp
([]) s 1909 ss 1440 1909 m (Courier02400240) getfont 720.000 nx sp (;) s 2237 ss
1440 2237 m (Courier02400240) getfont 2565 ss 1440 2565 m
(Courier02400240) getfont (term<double>) s 2893 ss 1440 2893 m
(Courier02400240) getfont sp (:) s 1296.000 nx sp (DOUBLE { $$ = atof\(\(char *\)yytext\); }) s
3221 ss 1440 3221 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp
('-' expr { $$ = -$expr; }) s 3549 ss 1440 3549 m (Courier02400240) getfont
720.000 nx sp (|) s 1296.000 nx sp ('~' expr { $$ = ~\(int\)$expr; }) s 3877 ss
1440 3877 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp ('!' expr { $$ = !$expr; }) s
4205 ss 1440 4205 m (Courier02400240) getfont 720.000 nx sp (|) s 1296.000 nx sp
('\(' expr '\)' { $$ = $expr; }) s 4533 ss 1440 4533 m (Courier02400240) getfont
720.000 nx sp (;) s 4861 ss 1440 4861 m (Courier02400240) getfont 5189 ss
1440 5189 m (Courier02400240) getfont ({) s 5517 ss 1440 5517 m
(Courier02400240) getfont sp (main\(\)) s 5845 ss 1440 5845 m
(Courier02400240) getfont sp ({) s 6173 ss 1440 6173 m (Courier02400240) getfont
sp 1440.000 nx sp (w_setfile\(stdin\);) s 6501 ss 1440 6501 m
(Courier02400240) getfont 720.000 nx sp 1440.000 nx sp (calc\(\);) s 6829 ss
1440 6829 m (Courier02400240) getfont 720.000 nx sp (}) s 7157 ss 1440 7157 m
(Courier02400240) getfont (}) s 7485 ss 1440 7485 m (Courier02400240) getfont
7813 ss 1440 7813 m (Courier02400240) getfont ($$) s 8141 ss 1440 8141 m
(Courier02400240) getfont 8469 ss 1440 8469 m (Courier02400240) getfont (D) s
576.000 nx sp ([0-9]) s 8797 ss 1440 8797 m (Courier02400240) getfont (L) s sp ([_A-Za-z]) s
9125 ss 1440 9125 m (Courier02400240) getfont 9453 ss 1440 9453 m
(Courier02400240) getfont (%%) s 9781 ss 1440 9781 m (Courier02400240) getfont
10109 ss 1440 10109 m (Courier02400240) getfont (".") s 288.000 nx sp
1440.000 nx sp ({ return \(int\)EOI; }) s 10437 ss 1440 10437 m
(Courier02400240) getfont 10765 ss 1440 10765 m (Courier02400240) getfont ($DOUBLE) s
1152.000 nx sp (\() s 103.200 nx sp ({) s sp (D) s sp (}) s sp (+) s sp (\)) s sp (|) s sp (\() s sp
({) s sp (D) s sp (}) s sp (+) s sp (\\) s sp (.) s sp ({) s sp (D) s sp (}) s sp (+) s sp (\)) s sp (|) s sp (\() s
sp ({) s sp (D) s sp (}) s sp (+) s sp ([) s sp (E) s sp (e) s sp (]) s sp (-) s sp (?) s 11053 ss
1442 11053 m (Courier02400240) getfont ({D}+\)|\({D}+\\.{D}+[Ee]-?{D}+\)) s
11381 ss 1440 11381 m (Courier02400240) getfont 11709 ss 1440 11709 m
(Courier02400240) getfont ("#".*$) s 1296.000 nx sp 1440.000 nx sp (;) s 12037 ss
1440 12037 m (Courier02400240) getfont 12365 ss 1440 12365 m
(Courier02400240) getfont ([ \\t\\v\\n\\f]) s 576.000 nx sp (;) s 12693 ss
1440 12693 m (Courier02400240) getfont (.) s sp ({ ) s -12.000 nx sp (w_scanerr\("Illegal ) s
sp (character ) s sp (%d ) s sp (\($c\)", ) s sp (yytext[0], ) s sp (yytext[0]\); ) s sp
12981 ss 1442 12981 m (Courier02400240) getfont (}) s showpage vm_state restore
X
SHAR_EOF
echo 'File wacco.doc.ps is complete' &&
chmod 0555 wacco.doc.ps ||
echo 'restore of wacco.doc.ps failed'
Wc_c="`wc -c < 'wacco.doc.ps'`"
test 98569 -eq "$Wc_c" ||
	echo 'wacco.doc.ps: original size 98569, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= wacco.w ==============
if test -f 'wacco.w' -a X"$1" != X"-c"; then
	echo 'x - skipping wacco.w (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting wacco.w (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'wacco.w' &&
{
// Copyright (c) 1991 by Parag Patel.  All Rights Reserved.
static const char rcs_id[] = "$Header: wacco.w,v 1.13 91/02/22 16:04:36 hmgr Exp $";
X
#undef YYTEXT_DECL
#define YYTEXT_DECL char yytext[]
X
#include "defs.h"
X
struct nodedat
{
X	symbol *sym;
X	union
X	{
X		symnode *node;
X		char *alias;
X	};
X	nodedat *prev;
X	nodedat() { sym = NULL; node = NULL; prev = NULL; }
};
X
}
X
program
X	: directives { $code = NULL; } code { startcode = $code; } statlist
X	;
X
directives
X	: DIRECTIVE
X		{
X			int argc;
X			char **argv = strsep(yytext, " \t", TRUE, &argc);
X			getoptions(argc, argv);
X		}
X	| []
X	;
X
statlist
X	: statement { $code = NULL; } code { addnonterm($code); } statlist 
X	| []
X	;
X
statement<symbol*>
X	:	ID
X		{
X			$$ = addsymbol(yytext);
X			if ($$->type == TERMINAL)
X				(void)addnonterm($$);
X			if (startsymbol == NULL) 
X			{
X				startsymbol = $$;
X				$$->usecount += 2;
X			}
X		}
X		idtype
X		{
X			if ($$->rettype != NULL && $idtype != NULL &&
X					strcmp($$->rettype, $idtype) != 0)
X				scanerr("Two types defined for %s", $$->name);
X
X			if ($$->rettype == NULL)
X				$$->rettype = $idtype;
X			else
X				delete $idtype;
X		}
X		(<boolean> EXPORT { $$ = TRUE; } | [] { $$ = FALSE; })
X		{
X			if ($_)
X			{
X				exportedname = $$->export = TRUE;
X				$$->usecount += 2;
X			}
X		}
X		resyncset ':'
X		{
X			$$->list = $resyncset;
X			nodedat end;
X			end.sym = $concatlist.sym = $orlist.sym = $$;
X			$concatlist.prev = $orlist.prev = &end;
X		}
X		concatlist
X		{
X			symnode *node = $$->node;
X			if (node != NULL)
X			{
X				while (node->or != NULL)
X					node = node->or;
X				node->or = $concatlist.node;
X			}
X			else
X				node = $$->node = $concatlist.node;
X		}
X		orlist
X		{
X			if (node == NULL)
X				$$->node = $orlist.node;
X			else if (node->or == NULL)
X				node->or = $orlist.node;
X			else
X				node->or->or = $orlist.node;
X		}
X		';'
X	;
X
idtype<char*>
X	: '<'	{ $$ = readtype(); }
X	| []	{ $$ = NULL; }
X	;
X
concatlist<nodedat>
X	:	{
X			$code = $exprlist.sym = $$.sym;
X			$exprlist.prev = $$.prev;
X		} 
X		code exprlist
X		{
X			if ($code == NULL)
X				$$.node = $exprlist.node;
X			else
X			{
X				$$.node = new symnode;
X				$$.node->sym = $code;
X				$$.node->next = $exprlist.node;
X			}
X		}
X	| []
X	;
X
orlist<nodedat>
X	:	{
X			$concatlist.sym = $orlist.sym = $$.sym;
X			$concatlist.prev = $orlist.prev = $$.prev;
X		}
X		'|' concatlist orlist
X		{
X			$$.node = $concatlist.node;
X			if ($$.node == NULL)
X				$$.node = $orlist.node;
X			else
X				$$.node->or = $orlist.node;
X		}
X	| []
X	;
X
X
exprlist<nodedat>
X	:	{
X			$expression.sym = $code = $exprlist.sym = $$.sym;
X			$expression.prev = $exprlist.prev = $$.prev;
X		}
X		expression resyncset code exprlist
X		{
X			$$.node = new symnode;
X			$$.node->sym = $expression.sym;
X			$$.node->alias = $expression.alias;
X			$$.node->next = $exprlist.node;
X			$$.node->list = $resyncset;
X			if ($code != NULL)
X			{
X				$$.node->next = new symnode;
X				$$.node->next->sym = $code;
X				$$.node->next->next = $exprlist.node;
X			}
X		}
X	| []
X	;
X
resyncset<resynclist*>
X	: '[' resynclist ']'	{ $$ = $resynclist; }
X	| []					{ $$ = NULL; }
X	;
X
resynclist<resynclist*>
X	: resyncitem (',' resynclist { $$=$resynclist; } | [] { $$ = NULL; })
X			{
X				$$ = $resyncitem;
X				$$->next = $_;
X			}
X	;
X
resyncitem<resynclist*>
X	: settype=first resyncid settype=follow
X		{
X			$$ = $resyncid;
X			$$->first = $first == 0 && $follow == 0 ? 1 : $first;
X			$$->follow = $follow;
X		}
X	;
X
settype
X	: '+'	{ $$ = 1; }
X	| '-'	{ $$ = -1; }
X	| []	{ $$ = 0; }
X	;
X
resyncid<resynclist*>
X	: ID			{ $$ = new resynclist(yytext); }
X	| NULLSYM		{ $$ = new resynclist(NULL); }
X	| STRING		{ $$ = new resynclist(yytext); }
X	| CHARACTER		{ $$ = new resynclist(yytext); }
X	| '#' count		{ $$ = new resynclist(NULL);
X						$$->paren = $count == 0 ? 1 : $count; }
X	;
X
count
X	: INT	{ $$ = atoi(yytext); }
X	| '*'	{ $$ = -1; }
X	| []	{ $$ = 0; }
X	;
X
alias<char*>
X	: '=' (ID { $$ = yytext; } | INT { $$ = yytext; })
X			{ $$ = strdup($_); }
X	| []	{ $$ = NULL; }
X	;
X
expression<nodedat>
X	: ID		{ $$.sym = addsymbol(yytext);  $$.sym->usecount++; }
X		alias	{ $$.alias = $alias; }
X	| NULLSYM	{ $$.sym = getsymbol(EMPTY); }
X	| '#' count alias
X		{
X			nodedat *p = $$.prev;
X			for (int i = 0; p != NULL && ($count < 0 || i < $count); i++)
X			{
X				$$.sym = p->sym;
X				p = p->prev;
X			}
X			if ($count > 0 && i < $count)
X				scanerr("not that many parentheses");
X			$$.sym->usecount++;
X			$$.alias = $alias;
X		}
X	| STRING
X		{
X			$$.sym = addsymbol(yytext);
X			$$.sym->lexstr = $$.sym->name;
X			gotlexstr = TRUE;
X		}
X	| CHARACTER
X		{
X			$$.sym = addsymbol(yytext);
X			if ($$.sym->lexstr == NULL)
X			{
X				char *s = strdup(yytext);
X				s[0] = s[strlen(s) - 1] = '"';
X				$$.sym->lexstr = s;
X			}
X		}
X	| '(' idtype
X		{
X			char *type = $$.sym->rettype;
X			char *name = $$.sym->realname;
X			static int num = 1;
X
X			addnonterm($$.sym = addsymbol(strbldf("_P%d", num++)));
X			$$.sym->type = NONTERMINAL;
X			$$.sym->rettype = $idtype == NULL ? type : $idtype;
X			$$.sym->realname = name;
X			$$.sym->usecount++;
X
X			$concatlist.sym = $orlist.sym = $$.sym;
X			$concatlist.prev = $orlist.prev = &$$;
X		}
X		concatlist orlist ')' alias
X		{
X			$$.sym->node = $concatlist.node;
X			if ($$.sym->node == NULL)
X				$$.sym->node = $orlist.node;
X			else
X				$$.sym->node->or = $orlist.node;
X			$$.alias = $alias;
X		}
X	;
X
code<symbol*>
X	:	{
X			int rettype = 0;
X			int line = currline();
X		}
X		(<char*>
X			'{'		{ $$ = readcode(rettype); }
X			| BLOCKCODE	{ $$ = readblockcode(rettype); }
X		)
X		{
X			if ($$ != NULL)
X				$$->usedret = rettype;
X
X			$$ = new symbol;
X			$$->name = "<code>";
X			$$->type = CODE;
X			$$->code = $_;
X			$$->line = line;
X		}
X	| []	{ $$ = NULL; }
X	;
SHAR_EOF
chmod 0444 wacco.w ||
echo 'restore of wacco.w failed'
Wc_c="`wc -c < 'wacco.w'`"
test 5585 -eq "$Wc_c" ||
	echo 'wacco.w: original size 5585, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
rm -f _shar_seq_.tmp
echo You have unpacked the last part
exit 0
exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.