[comp.unix.programmer] yacc-a-dy YACC yacc, Help me HACK!

mpledger@cti1.UUCP (Mark Pledger) (10/03/90)

     Could somebody please give me a hand with a lex & yacc problem.  I am 
trying to build a small subset of the SQL language.  For purposes of this 
question my yacc grammer is defined below. 

%start cmds

%%

cmds        : select ';'
            { 
            fprintf(stdout,"SQL syntax correct.\n");
            }
            ;

select      : SELECT sel_list 
            {
            }
            ;

sel_list    : sel_type
            {
            }
            | sel_list ',' sel_type
            {
            }
            ; 

sel_type    : attr_name  
            {
            }
            ;

attr_name   : IDENTIFIER
            {
            }
            ;

%%

... and so on


     My lex specifications are list below.

delimiters           [ \t]
ws                   {delimiters}+
newline              [\n]
letter               [A-Za-z_]
int                  [0-9]+
string               {letter}+
squote               \'[^\'\n]*\'
dquote               \"[^\"\n]*\"
quotes               (squote|dquote)

%% /* RULES */
{quotes}             { 
                     yylval.string = yytext;
                     return(QUOTES);         
                     }

";"                  { 
                     yylval.string = yytext;
                     return(EOC);         
                     }

","                  { 
                     yylval.string = yytext;
                     return(',');         
                     }

"q"                  {        /* interactive quit command */
                     yylval.string = yytext;
                     return( 0 );  
                     }

{newline}            { 
                     lineno++;
                     }

{int}                { 
                     yylval.integer = atoi(yytext);
                     return(INT);         
                     }

{ws}                 ;        /* white space */

{string}             {        /* normal token */
                     yylval.string = yytext;
                     return(symlookup()); 
                     }    

"/*"                 { skipcomment();
                     }

.                    {        /* for testing only */
                     ECHO; exit(0);
                     }

%% 

... and so on



     This lex & yacc grammer works only part of the time.  I have specified 
in the yacc grammer to allow multiple attr_name's after the key word SELECT.  
Using the following examples below, I seem to be getting an error when I 
don't think I should.  I have run the lex code as a seperate program and it 
returns all valid tokens -- regardless of white space.  However when using 
the yacc grammer, white space becomes significant. 


      select sno;             <--- this works ok 


      select sno,pno;         <--- yyparse() returns a 1 if yacc grammer is
                           
                        (1)   sel_list : sel_type ',' sel_list
                                       | sel_type
                                       ;
                              sel_type : attr_name;
                              attr_name: IDENTIFIER;
                           

                              <---- but works ok if yacc grammer is

                        (2)   sel_list : sel_list ',' sel_type
                                       | sel_type
                                       ;
                              sel_type : attr_name;
                              attr_name: IDENTIFIER;


      select sno, pno;        <--- this works ok if yacc grammer is
                                   is specified as (1) above.


     I have read that using left recursion keeps the stack space smaller for 
yacc, so I am attempting to use it.  But specifications (1) and (2) seem to 
force a different syntax requirement (i.e., a space after the comma).  Why 
is this happening?  Now when yacc does work for 2 attribute names, it does 
not work for 3, 4, 5, 6, ... attributes.  Why?  I figured that if yacc 
worked for 2 attribute parameters it would surely work for 5, 6, or 10.  But 
I found out it doesn't. 

     I have poured over three books (O'Reilly's Lex & Yacc, the dragon book, 
and An Introduction to Compiler Contruction under Unix) and cannot find 
anything similiar.  Am I missing something?  By the way I am using GNU's flex
and bison programs, but will be uploading them to a 3b2 running SYS5 v.3.2. 
as soon as I get these darn things debugged. 

     Any help would be appriciated.  Thanks in advance.




-- 
Sincerely,


Mark Pledger

--------------------------------------------------------------------------
CTI                              |              (703) 685-5434 [voice]
2121 Crystal Drive               |              (703) 685-7022 [fax]
Suite 103                        |              
Arlington, DC  22202             |              mpledger@cti.com
--------------------------------------------------------------------------