berry (01/19/83)
#N:zinfandel:12400011:000:4172
zinfandel!berry Jan 17 15:47:00 1983
Since I got 5 requests, and our mail router insists on using
harpo, I am posting this in hopes that it will reach everyone
interested.
Here is the nitty-gritty on how I made "siamese twin" yacc
parsers fit into a single process. The reason I did it this way
was partly historical, and partly because when I merged the two
grammars, yacc's internal tables overflowed (we were restricted
to PDP-11's then).
The basic strategy is to edit the "dot-c" file produced by yacc
for ONE of the parsers. Since the secondary parser was for a
feature of our tester language called 'Data Director*', I substi-
tuted 'dd' for 'yy'. However, due to the peculiar miscegenous
interface between yacc parsers and lex, uh, lexers, some 'dd'
keywords needed to be changed back to 'yy' so that both parsers
could share a single lexer. (I KNOW it's "lexical analyzer", OK?
"lexer" is easier to type, unambiguous and not too offensive.)
Such things as 'yytext', the pointer to the text of the token,
and 'yylval', the actual token itself, need to be changed back,
along with a few others. Consult the 'ex' script 'ddyaccfix' in-
cluded below for details.
Some miscellaneous 'mv's need to be added to the makefile. I in-
clude a sample (editted) makefile for my project.
Finally, I include a sample (editted and abridged) yacc spec.
that illustrates how parser one calls parser two. In my case,
statements beginning with one of a number of keywords needed to
be parsed by the 'dd' parser. I included rules that matched
those tokens in the primary parser, and in the action for those
rules set a flag, call 'ddparse()' and reset the flag. It's that
simple.
The flag is used by the lexer for those few tokens that have
meanings in the context of the priary parser different from the
meanings in the context of the secondary parser. The lex actions
for those tokens look like
if ( doing_dd )
return FOO;
else
return BAR;
I hope this summary helps someone out there. Feel free to send
me questions or constructive comments. (or even a better way if
you have one!)
Berry Kercheval
Zehntel Inc.
(decvax!sytek!zehntel!zinfandel!berry)
(415)932-6900
-------
*Data Director is a trademark of Zehntel Inc.
::::::::
makefile
::::::::
convert: $(OBJ)
cc $(OBJ) $(LIBES) -o $(OFILE)
convert.c: convert.y
${YACC} ${YFLAGS} convert.y
mv y.tab.c convert.c
mv y.tab.h cy.tab.h
mv y.output cy.output
convert.o: convert.c
${CC} ${CFLAGS} -c convert.c
clex.yy.c: convert.l
${LEX} ${LFLAGS} convert.l
mv lex.yy.c clex.yy.c
clex.yy.o: clex.yy.c
${CC} ${CFLAGS} -c clex.yy.c
dd.c: ddyacc.y
${YACC} ${YFLAGS} ddyacc.y
mv y.tab.c dd.c
ex dd.c < ddyaccfix
mv y.tab.h dy.tab.h
mv y.output dy.output
dd.o: dd.c
${CC} ${CFLAGS} -c dd.c
OBJ = convert.o clex.yy.o main.o yyerror.o stubs.o dd.o cat.o
::::::::::
ddyaccfix
::::::::::
g/yy/s/yy/dd/g
g/ddreject/s/ddreject/yyreject/g
g/dderror/s/dderror/yyerror/g
g/ddsptr/s/ddsptr/yysptr/g
g/ddsbuf/s/ddsbuf/yysbuf/g
g/ddlex/s/ddlex/yylex/g
g/ddchar/s/ddchar/yychar/g
g/ddtext/s/ddtext/yytext/g
g/ddlval/s/ddlval/yylval/g
/YYSTYPE yylval, ddval;/d
i
extern YYSTYPE yylval;
YYSTYPE ddval;leichter (01/21/83)
Are we the only ones who have received this message >10 times over the last couple of days, or is the problem general? This isn't the only message that's been repeating but I noticed it. zehntel, are you at it again? -- Jerry decvax!yale-comix!leichter