> In fact, my grammar currently has an obscene
> 20 shift/reduce and 4 reduce/reduce conflicts!

A shift/reduce conflict, IIRC, usually indicates a situation where
the grammar is unambiguous but may be inefficient.  Eliminating them
is nice, but not critical.

A R/R conflict, in contrast, is a point where the grammar is ambiguous
and you *must* fix it.

> (Unfortunately, bison isn't very
> helpful: it doesn't provide line-numbers when it warns me about
> the # of conflicts).

Turn on the verbose flag (-v|--verbose).  Near the top it should
list the S/R and R/R states.  You can then examine the states and
rules and see exactly where the problem is.

Cutting to the chase, the R/R problems are due to "TEMP" and
"TEMPORARY" being both "unreserved keywords" and part of
OptTempTableName.  If you comment them out in 'unreserved keywords'
the R/R error goes away but this may introduce errors elsewhere.

What is probably better is to move those tokens someplace else
where there's some context:

  into_clause : INTO OptTempTableName
        | /* EMPTY */
        ;

needs to be replaced with something like

  into_options : /* EMPTY */
        | TEMPORARY
        | TEMP
        ;

  into_clause : INTO into_options OptTempTableName
        | /* EMPTY */
        ;

with the corresponding modifiers removed from the OptTempTableName

Unfortunately, when I quickly tested that the number of S/R conflicts 
ballooned to 378.

As an aside, is there any reason to treat TEMP and TEMPORARY as two
separate identifiers?  It's common practice to have synonyms mapped
to a single identifier in the lexical analyzer, and the grammar itself
looks like it could benefit from some helper rules such as:

  temporary
        : TEMPORARY  { $$ = 1; }
        | TEMP       { $$ = 1; }
        |            { $$ = 0; }
        ;

  scope
        : GLOBAL     { $$ = 1; }
        | LOCAL      { $$ = 2; }
        |            { $$ = 0; }
        ;

  something : scope temporary somethingelse { ... }

Bear

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html

Reply via email to