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 <[EMAIL PROTECTED]> 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; + } + ; /***************************************************************************** * ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/users-lounge/docs/faq.html