diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 1d51032..175929c 100644
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** static TypeName *TableFuncTypeName(List 
*** 321,327 ****
  %type <list>	opt_interval interval_second
  %type <node>	overlay_placing substr_from substr_for
  
! %type <boolean> opt_instead opt_analyze
  %type <boolean> index_opt_unique opt_verbose opt_full
  %type <boolean> opt_freeze opt_default opt_recheck
  %type <defelt>	opt_binary opt_oids copy_delimiter
--- 321,327 ----
  %type <list>	opt_interval interval_second
  %type <node>	overlay_placing substr_from substr_for
  
! %type <boolean> opt_instead
  %type <boolean> index_opt_unique opt_verbose opt_full
  %type <boolean> opt_freeze opt_default opt_recheck
  %type <defelt>	opt_binary opt_oids copy_delimiter
*************** opt_name_list:
*** 6456,6468 ****
   *
   *****************************************************************************/
  
! ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
  				{
  					ExplainStmt *n = makeExplain(NIL, (Node *) $4);
! 					n->analyze = $2;
  					n->verbose = $3;
  					$$ = (Node *)n;
  				}
  		|	EXPLAIN '(' explain_option_list ')' ExplainableStmt
  				{
  					$$ = (Node *) makeExplain((List *) $3, (Node *) $5);
--- 6456,6480 ----
   *
   *****************************************************************************/
  
! ExplainStmt:
! 		EXPLAIN ExplainableStmt
! 				{
! 					ExplainStmt *n = makeExplain(NIL, (Node *) $2);
! 					$$ = (Node *)n;
! 				}
! 		| EXPLAIN ANALYZE opt_verbose ExplainableStmt
  				{
  					ExplainStmt *n = makeExplain(NIL, (Node *) $4);
! 					n->analyze = TRUE;
  					n->verbose = $3;
  					$$ = (Node *)n;
  				}
+ 		| EXPLAIN VERBOSE ExplainableStmt
+ 				{
+ 					ExplainStmt *n = makeExplain(NIL, (Node *) $3);
+ 					n->verbose = TRUE;
+ 					$$ = (Node *)n;
+ 				}
  		|	EXPLAIN '(' explain_option_list ')' ExplainableStmt
  				{
  					$$ = (Node *) makeExplain((List *) $3, (Node *) $5);
*************** ExplainableStmt:
*** 6479,6502 ****
  			| ExecuteStmt					/* by default all are $$=$1 */
  		;
  
- /*
-  * The precedence declaration for the opt_analyze EMPTY case, below, is
-  * necessary to prevent a shift/reduce conflict in the second production for
-  * ExplainStmt, above.  Otherwise, when the parser encounters "EXPLAIN (", it
-  * can't tell whether the "(" is the beginning of a SelectStmt or the beginning
-  * of the options list.  The precedence declaration below forces the latter
-  * interpretation.
-  *
-  * It might seem that we could get away with simply changing the definition of
-  * ExplainableStmt to use select_without_parens rather than SelectStmt, but
-  * that does not work, because select_without_parens produces expressions such
-  * as "(SELECT NULL) ORDER BY 1" that we interpret as legal queries.
-  */
- opt_analyze:
- 			analyze_keyword			{ $$ = TRUE; }
- 			| /* EMPTY */			%prec UMINUS { $$ = FALSE; }
- 		;
- 
  explain_option_list:
  			explain_option_elem
  				{
--- 6491,6496 ----
*************** explain_option_elem:
*** 6516,6522 ****
  		;
  
  explain_option_name:
! 				ColLabel			{ $$ = $1; }
  		;
  
  explain_option_arg:
--- 6510,6518 ----
  		;
  
  explain_option_name:
! 				ColId			{ $$ = $1; }
! 			| VERBOSE			{ $$ = "verbose"; }
! 			| analyze_keyword	{ $$ = "analyze"; }
  		;
  
  explain_option_arg:
