REPOST: v19i093: wacco - A C++ LL parser generator, Part06/06
Parag Patel
parag at hpsdeb.sde.hp.com
Sun May 19 15:48:26 AEST 1991
Submitted-by: Parag Patel <parag at 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 at 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 at uunet.uu.net.
More information about the Comp.sources.misc
mailing list