%token <voidval> COMPLETE
 %token <tsym> TYPENAME
 %token <theclass> CLASSNAME    /* ObjC Class name */
-%type <sval> name
+%type <sval> name field_name
 %type <svec> string_exp
 %type <ssym> name_not_typename
 %type <tsym> type_name
                        { write_exp_elt_opcode (pstate, UNOP_ALIGNOF); }
        ;
 
-exp    :       exp ARROW name
+exp    :       exp ARROW field_name
                        { write_exp_elt_opcode (pstate, STRUCTOP_PTR);
                          write_exp_string (pstate, $3);
                          write_exp_elt_opcode (pstate, STRUCTOP_PTR); }
        ;
 
-exp    :       exp ARROW name COMPLETE
+exp    :       exp ARROW field_name COMPLETE
                        { mark_struct_expression (pstate);
                          write_exp_elt_opcode (pstate, STRUCTOP_PTR);
                          write_exp_string (pstate, $3);
                        { write_exp_elt_opcode (pstate, STRUCTOP_MPTR); }
        ;
 
-exp    :       exp '.' name
+exp    :       exp '.' field_name
                        { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
                          write_exp_string (pstate, $3);
                          write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
        ;
 
-exp    :       exp '.' name COMPLETE
+exp    :       exp '.' field_name COMPLETE
                        { mark_struct_expression (pstate);
                          write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
                          write_exp_string (pstate, $3);
        ;
 
 
+field_name
+       :       name
+       ;
 
 name   :       NAME { $$ = $1.stoken; }
        |       BLOCKNAME { $$ = $1.stoken; }