Help with gram.y (UNDER)

Started by Chris Bitmeadover 25 years ago4 messages
#1Chris Bitmead
chris@bitmead.com

Can someone give be a bit of help with gram.y to get this UNDER syntax
right? I did what I though was the obvious syntax, but it no longer
accepts a plain create table after this change...

OptUnder: UNDER relation_name_list { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;

CreateStmt: CREATE OptTemp TABLE relation_name OptUnder '('
OptTableElementList ')' OptInherit
{
/*etc */
}
;

The full patch is here...
ftp://ftp.tech.com.au/pub/diff.x

#2Chris Bitmead
chris@bitmead.com
In reply to: Chris Bitmead (#1)
Re: Help with gram.y (UNDER)

It seems like bison is confused by having that '(' just after an
optional syntax (UNION). If I place something after OptUnder (USING just
to pick a token), then everything works fine (except of course the
spurious USING becomes part of the syntax).

Does the '(' have some kind of second-class status as a token that would
cause this wierdness?

Chris Bitmead wrote:

Show quoted text

Can someone give be a bit of help with gram.y to get this UNDER syntax
right? I did what I though was the obvious syntax, but it no longer
accepts a plain create table after this change...

OptUnder: UNDER relation_name_list { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;

CreateStmt: CREATE OptTemp TABLE relation_name OptUnder '('
OptTableElementList ')' OptInherit
{
/*etc */
}
;

The full patch is here...
ftp://ftp.tech.com.au/pub/diff.x

#3Chris Bitmead
chris@bitmead.com
In reply to: Chris Bitmead (#1)
Re: Help with gram.y (UNDER)

Chris Bitmead wrote:

It seems like bison is confused by having that '(' just after an
optional syntax (UNION).

I mean the optional UNDER

If I place something after OptUnder (USING just

I mean USING;

i.e. CreateStmt: CREATE OptTemp TABLE relation_name OptUnder USING '('
OptTableElementList ')' OptInherit

This will accept "CREATE TABLE foo USING (aa text);"

but this...

CreateStmt: CREATE OptTemp TABLE relation_name OptUnder '('
OptTableElementList ')' OptInherit

won't accept "CREATE TABLE foo (aa text);"

Show quoted text

to pick a token), then everything works fine (except of course the
spurious USING becomes part of the syntax).

Does the '(' have some kind of second-class status as a token that would
cause this wierdness?

Chris Bitmead wrote:

Can someone give be a bit of help with gram.y to get this UNDER syntax
right? I did what I though was the obvious syntax, but it no longer
accepts a plain create table after this change...

OptUnder: UNDER relation_name_list { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;

CreateStmt: CREATE OptTemp TABLE relation_name OptUnder '('
OptTableElementList ')' OptInherit
{
/*etc */
}
;

The full patch is here...
ftp://ftp.tech.com.au/pub/diff.x

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chris Bitmead (#2)
Re: Help with gram.y (UNDER)

Chris Bitmead <chris@bitmead.com> writes:

Does the '(' have some kind of second-class status as a token that would
cause this wierdness?

No ... very bizarre. I think you must be introducing some kind of
ambiguity into the grammar, but I can't quite see what. Are you
getting any sort of warnings out of bison?

Might be worth turning on the logfile option (forget if it's -v or -l)
and looking at the interpreted productions just to make sure bison
is reading things the same way you thought you wrote them.

regards, tom lane