alverson@decwrl.dec.com (alverson) (04/15/89)
You can cut the S/R conflicts in expread.y down to 1 (and leave the reduce/reduce conflicts at 1) by adding a few precedence rules. Here are diffs from expread.y in gdb 3.1.2 Bob Alverson (alverson@decwrl.dec.com) *** src/expread.y Tue Jan 17 11:30:36 1989 --- expread.y Fri Apr 14 13:33:05 1989 *************** *** 139,144 %left ',' %left ABOVE_COMMA %right '=' ASSIGN_MODIFY %left OR %left AND %left '|' --- 139,145 ----- %left ',' %left ABOVE_COMMA %right '=' ASSIGN_MODIFY + %right '?' %left OR %left AND %left '|' *************** *** 151,157 %left '*' '/' '%' %left '@' %right UNARY INCREMENT DECREMENT ! %right ARROW '.' '[' %left COLONCOLON %% --- 152,158 ----- %left '*' '/' '%' %left '@' %right UNARY INCREMENT DECREMENT ! %right ARROW '.' '[' '(' %left COLONCOLON %% *************** *** 232,238 /* This is to save the value of arglist_len being accumulated by an outer function call. */ { start_arglist (); } ! arglist ')' { write_exp_elt_opcode (OP_FUNCALL); write_exp_elt_longcst (end_arglist ()); write_exp_elt_opcode (OP_FUNCALL); } --- 233,239 ----- /* This is to save the value of arglist_len being accumulated by an outer function call. */ { start_arglist (); } ! arglist ')' %prec ARROW { write_exp_elt_opcode (OP_FUNCALL); write_exp_elt_longcst (end_arglist ()); write_exp_elt_opcode (OP_FUNCALL); } *************** *** 343,349 { write_exp_elt_opcode (BINOP_OR); } ; ! exp : exp '?' exp ':' exp { write_exp_elt_opcode (TERNOP_COND); } ; --- 344,350 ----- { write_exp_elt_opcode (BINOP_OR); } ; ! exp : exp '?' exp ':' exp %prec '?' { write_exp_elt_opcode (TERNOP_COND); } ; *************** *** 399,405 write_exp_elt_opcode (OP_INTERNALVAR); } ; ! exp : SIZEOF '(' type ')' { write_exp_elt_opcode (OP_LONG); write_exp_elt_type (builtin_type_int); write_exp_elt_longcst ((long) TYPE_LENGTH ($3)); --- 400,406 ----- write_exp_elt_opcode (OP_INTERNALVAR); } ; ! exp : SIZEOF '(' type ')' %prec UNARY { write_exp_elt_opcode (OP_LONG); write_exp_elt_type (builtin_type_int); write_exp_elt_longcst ((long) TYPE_LENGTH ($3));