yacc & lex - cupla questions

Charles - Anderson chucka at cup.portal.com
Fri Jul 27 09:02:52 AEST 1990


First suggestion is to buy the new book out from
O'Reilly and Associates, Inc. "lex & yacc". It answers 
your questions quite nicely. 1-800-338-6887

I listed a couple of suggestions below.

>i have been trying to parse a straightforward stream of bytes using the
>c-preprocessors lex & yacc.  being a new user of these utilities, i have
>a couple of problems for which i'd like to solicit your suggestions:
> 
>---------------------------------------------------------------------
>1.)  how does one redefine the i/o in a yacc/lex piece of code?  i.e.
>the code which is generated defaults to stdin and stdout for input and
>output, respectively.  i'd like to redefine these defaults w/o having 
>to hack on the intermediate c-code, since this is a live production 
>project; i'd like to be able to update and modify the program simply by 
>saying "make". 

You can use freopen, or if you wish another file use dup.

>
>---------------------------------------------------------------------
>2.)  how can one get the automagically-defined #defines, which can
>normally be created from yacc with the -d flag, to come out when you
>use a makefile?  i.e. suppose i have lex.l and yacc.y lex and yacc
>source files, respectively, and i have object files defined in my makefile 
>called lex.o and yacc.o such that "make" follows default rules to create 
>these from the aforementioned source files.   
>

Some make utilities have default rules for lex and yacc
file ending with .l and .y

You can always force make with a dependency ie:

prog:	prog.c lex.yy.o y.tab.o
	cc prog.c -o prog lex.yy.o y.tab.o -ly -ll

lex.yy.o: 	lex.yy.c
		cc lex.yy.c -c ...

lex.yy.c:	lex.l y.tab.o
		lex lex.l 

y.tab.o:	y.tab.c
		cc y.c -c ... 

y.tab.c:	y.y
		yacc -d y.y

This will only compile files that have changed.

Solution 2 is to put all the commands under prog: and wholesale
do what ever.

Solution 3 is to use a shell script and make it a dependency.


>---------------------------------------------------------------------
>3.)  if i have a yacc construct such as:
> 
>line3	: 	A B C
>		{  yacc action sequence }
>
>
>which indicates that the construct line3 is composed of the 3 tokens
>A B and C, in that order ...
> 
>how can i now assign the values of A, B, and C into local vars of my
>choice?  the problem lies in the fact that each of A B and C represent
>three calls to lex, and if i pass back a pointer to yytext[] from lex, 
>i only retain the value of the last token in the sequence, in this case C, 
>when i get to the action sequence in my yacc code.  what if i want to 
>be able to select the EXACT ascii tokens for each of A B and C above in 
>my yacc code.  how do i do that?
>

The book recommends having a line that gives the file name, 
parameters etc. Just as if it were a yacc specification.
Make it the first line as input and you get your file name.
You can have a default or make a fatal error if you do not
get your first line.

The book talks about redirection, opening multiple files as needed.

>
>any comments or suggestions would be most heartily appreciated.
>
>jp woodward
>univ of ill at chicago 
>312-996-0939



More information about the Comp.unix.wizards mailing list