help with bison

From: Neil Conway <nconway(at)klamath(dot)dyndns(dot)org>
To: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: help with bison
Date: 2002-04-11 01:28:53
Message-ID: 20020410212853.1d44f0ea.nconway@klamath.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi all,

I'm working on a fairly large patch (cleaning up Karel Zak's
PREPARE/EXECUTE work), and I'm having some problems with bison (I'm
a yacc newbie). In fact, my grammar currently has an obscene
20 shift/reduce and 4 reduce/reduce conflicts!

Would someone to be kind enough to let me know what I'm doing wrong,
and what I'll need to change? (Unfortunately, bison isn't very
helpful: it doesn't provide line-numbers when it warns me about
the # of conflicts). The patch for gram.y is below.

Thanks in advance,

Neil

--
Neil Conway <neilconway(at)rogers(dot)com>
PGP Key ID: DB3C29FC

Index: gram.y
===================================================================
RCS file: /var/lib/cvs/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.299
diff -c -r2.299 gram.y
*** gram.y 1 Apr 2002 04:35:38 -0000 2.299
--- gram.y 11 Apr 2002 01:26:21 -0000
***************
*** 133,144 ****
ClosePortalStmt, ClusterStmt, CommentStmt, ConstraintsSetStmt,
CopyStmt, CreateAsStmt, CreateDomainStmt, CreateGroupStmt, CreatePLangStmt,
CreateSchemaStmt, CreateSeqStmt, CreateStmt, CreateTrigStmt,
! CreateUserStmt, CreatedbStmt, CursorStmt, DefineStmt, DeleteStmt,
! DropGroupStmt, DropPLangStmt, DropSchemaStmt, DropStmt, DropTrigStmt,
! DropUserStmt, DropdbStmt, ExplainStmt, FetchStmt,
GrantStmt, IndexStmt, InsertStmt, ListenStmt, LoadStmt, LockStmt,
! NotifyStmt, OptimizableStmt, ProcedureStmt, ReindexStmt,
! RemoveAggrStmt, RemoveFuncStmt, RemoveOperStmt,
RenameStmt, RevokeStmt, RuleActionStmt, RuleActionStmtOrEmpty,
RuleStmt, SelectStmt, TransactionStmt, TruncateStmt,
UnlistenStmt, UpdateStmt, VacuumStmt, VariableResetStmt,
--- 133,145 ----
ClosePortalStmt, ClusterStmt, CommentStmt, ConstraintsSetStmt,
CopyStmt, CreateAsStmt, CreateDomainStmt, CreateGroupStmt, CreatePLangStmt,
CreateSchemaStmt, CreateSeqStmt, CreateStmt, CreateTrigStmt,
! CreateUserStmt, CreatedbStmt, CursorStmt, DeallocatePrepareStmt,
! DefineStmt, DeleteStmt, DropGroupStmt,
! DropPLangStmt, DropSchemaStmt, DropStmt, DropTrigStmt,
! DropUserStmt, DropdbStmt, ExecuteStmt, ExplainStmt, FetchStmt,
GrantStmt, IndexStmt, InsertStmt, ListenStmt, LoadStmt, LockStmt,
! NotifyStmt, OptimizableStmt, ProcedureStmt, PrepareStmt, prepare_query,
! ReindexStmt, RemoveAggrStmt, RemoveFuncStmt, RemoveOperStmt,
RenameStmt, RevokeStmt, RuleActionStmt, RuleActionStmtOrEmpty,
RuleStmt, SelectStmt, TransactionStmt, TruncateStmt,
UnlistenStmt, UpdateStmt, VacuumStmt, VariableResetStmt,
***************
*** 204,210 ****
any_name, any_name_list, expr_list, dotted_name, attrs,
target_list, update_target_list, insert_column_list,
def_list, opt_indirection, group_clause, TriggerFuncArgs,
! select_limit, opt_select_limit

%type <range> into_clause, OptTempTableName

--- 205,214 ----
any_name, any_name_list, expr_list, dotted_name, attrs,
target_list, update_target_list, insert_column_list,
def_list, opt_indirection, group_clause, TriggerFuncArgs,
! select_limit, opt_select_limit, types_list,
! types_prepare_clause, execute_using
!
! %type <ival> prepare_store

%type <range> into_clause, OptTempTableName

***************
*** 319,325 ****
COALESCE, COLLATE, COLUMN, COMMIT,
CONSTRAINT, CONSTRAINTS, CREATE, CROSS, CURRENT_DATE,
CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
! DAY_P, DEC, DECIMAL, DECLARE, DEFAULT, DELETE, DESC,
DISTINCT, DOUBLE, DROP,
ELSE, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXECUTE, EXISTS, EXTRACT,
FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
--- 323,329 ----
COALESCE, COLLATE, COLUMN, COMMIT,
CONSTRAINT, CONSTRAINTS, CREATE, CROSS, CURRENT_DATE,
CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
! DAY_P, DEALLOCATE, DEC, DECIMAL, DECLARE, DEFAULT, DELETE, DESC,
DISTINCT, DOUBLE, DROP,
ELSE, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT, EXECUTE, EXISTS, EXTRACT,
FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
***************
*** 329,335 ****
MATCH, MINUTE_P, MONTH_P, NAMES,
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
OF, OLD, ON, ONLY, OPTION, OR, ORDER, OUTER_P, OVERLAPS,
! PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCHEMA, SCROLL, SECOND_P, SELECT, SESSION, SESSION_USER, SET, SOME, SUBSTRING,
TABLE, TEMPORARY, THEN, TIME, TIMESTAMP,
--- 333,339 ----
MATCH, MINUTE_P, MONTH_P, NAMES,
NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
OF, OLD, ON, ONLY, OPTION, OR, ORDER, OUTER_P, OVERLAPS,
! PARTIAL, POSITION, PRECISION, PREPARE, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
SCHEMA, SCROLL, SECOND_P, SELECT, SESSION, SESSION_USER, SET, SOME, SUBSTRING,
TABLE, TEMPORARY, THEN, TIME, TIMESTAMP,
***************
*** 363,372 ****
DATABASE, DELIMITERS, DO,
EACH, ENCODING, EXCLUSIVE, EXPLAIN,
FORCE, FORWARD, FREEZE, FUNCTION, HANDLER,
! ILIKE, INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
LANCOMPILER, LIMIT, LISTEN, LOAD, LOCATION, LOCK_P,
MAXVALUE, MINVALUE, MODE, MOVE,
! NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
OFFSET, OIDS, OPERATOR, OWNER, PASSWORD, PROCEDURAL,
REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT,
--- 367,376 ----
DATABASE, DELIMITERS, DO,
EACH, ENCODING, EXCLUSIVE, EXPLAIN,
FORCE, FORWARD, FREEZE, FUNCTION, HANDLER,
! ILIKE, INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, INTERNAL,
LANCOMPILER, LIMIT, LISTEN, LOAD, LOCATION, LOCK_P,
MAXVALUE, MINVALUE, MODE, MOVE,
! NEW, NOCREATEDB, NOCREATEUSER, NONE, NOSHARE, NOTHING, NOTIFY, NOTNULL,
OFFSET, OIDS, OPERATOR, OWNER, PASSWORD, PROCEDURAL,
REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT,
***************
*** 460,465 ****
--- 464,470 ----
| CreateTrigStmt
| CreateUserStmt
| ClusterStmt
+ | DeallocatePrepareStmt
| DefineStmt
| DropStmt
| DropSchemaStmt
***************
*** 469,474 ****
--- 474,480 ----
| DropPLangStmt
| DropTrigStmt
| DropUserStmt
+ | ExecuteStmt
| ExplainStmt
| FetchStmt
| GrantStmt
***************
*** 477,482 ****
--- 483,489 ----
| UnlistenStmt
| LockStmt
| NotifyStmt
+ | PrepareStmt
| ProcedureStmt
| ReindexStmt
| RemoveAggrStmt
***************
*** 3489,3494 ****
--- 3496,3594 ----
| DeleteStmt /* by default all are $$=$1 */
;

+ /*****************************************************************************
+ *
+ * PREPARE STATEMENTS
+ *
+ *****************************************************************************/
+ PrepareStmt: PREPARE name AS prepare_query types_prepare_clause prepare_store
+ {
+ PrepareStmt *n = makeNode(PrepareStmt);
+ n->name = $2;
+ n->query = (Query *) $4;
+ n->types = (List *) $5;
+ n->store = $6;
+ $$ = (Node *) n;
+ }
+ ;
+
+ prepare_query: SelectStmt
+ | UpdateStmt
+ | InsertStmt
+ | DeleteStmt
+ ;
+
+ types_list: SimpleTypename
+ { $$ = makeList1($1); }
+ | types_list ',' SimpleTypename
+ { $$ = lappend($1, $3); }
+ ;
+
+ types_prepare_clause: USING types_list { $$ = $2; }
+ | /*EMPTY*/ { $$ = NIL; }
+ ;
+
+ prepare_store: NOSHARE { $$ = 1; }
+ | GLOBAL { $$ = 2; }
+ | SHARE { $$ = 0; } /* default */
+ | /* EMPTY */ { $$ = 0; }
+ ;
+
+ /*****************************************************************************
+ *
+ * EXECUTE STATEMENTS
+ *
+ *****************************************************************************/
+ ExecuteStmt: EXECUTE name into_clause USING execute_using prepare_store
+ {
+ ExecuteStmt *n = makeNode(ExecuteStmt);
+ n->name = $2;
+ n->into = $3;
+ n->using = $5;
+ n->store = $6;
+ $$ = (Node *) n;
+ }
+ ;
+
+ execute_using: a_expr
+ { $$ = makeList1($1); }
+ | execute_using ',' a_expr
+ { $$ = lappend($1, $3); }
+ ;
+
+ /*****************************************************************************
+ *
+ * DEALLOCATE PREPARE STATEMENTS
+ *
+ *****************************************************************************/
+ DeallocatePrepareStmt: DEALLOCATE PREPARE ALL
+ {
+ DeallocatePrepareStmt *n = makeNode(DeallocatePrepareStmt);
+ n->name = NULL;
+ n->store = 0;
+ n->all = TRUE;
+ n->internal = FALSE;
+ $$ = (Node *) n;
+ }
+ | DEALLOCATE PREPARE ALL INTERNAL
+ {
+ DeallocatePrepareStmt *n = makeNode(DeallocatePrepareStmt);
+ n->name = NULL;
+ n->store = 0;
+ n->all = FALSE;
+ n->internal = TRUE;
+ $$ = (Node *) n;
+ }
+ | DEALLOCATE PREPARE name prepare_store
+ {
+ DeallocatePrepareStmt *n = makeNode(DeallocatePrepareStmt);
+ n->name = $3;
+ n->store = $4;
+ n->all = FALSE;
+ n->internal = FALSE;
+ $$ = (Node *) n;
+ }
+ ;

/*****************************************************************************
*

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Christopher Kings-Lynne 2002-04-11 01:38:23 Odd error during vacuum
Previous Message Bruce Momjian 2002-04-11 00:13:14 Re: RFC: Restructuring pg_aggregate